DeepSeek+Claude强强联手,使用AI驱动DjangoStarter 3.1框架升级
前言
上个月底培训了一周就没时间更新博客
上周有一些空闲时间,就继续体验最近很火的AI辅助编程
之前的文章中有说到我配置好了 VSCode + Cline 插件搭配本地部署的 DeepSeek 来实现AI辅助编程
但 Cline 插件消耗 token 太快了,换本地部署的 DeepSeek 的话不够聪明
我后面又换了 RooCode 、 Continue 这俩插件,还有试了一下新的IDE Trae
用下来 RooCode 还不错,这是 Cline 的 fork 版本,功能多了一些,消耗 Token 数量我没去统计,感觉可能差不多
大模型服务我选择了购买 DeepSeek 和 Claude 的 API
Trae 胜在免费,不过国内外区别对待是有点让人难受的
最终我在 Claude 和 DeepSeek 的辅助下,完成了 DjangoStarter 3.1 版本的开发
关于 DjangoStarter
DjangoStarter v3 是下一代 Django 项目快速开发模板,专为提升开发效率和性能而设计。
结合了 Django 的丰富功能和 Django-Ninja 的性能、灵活、简洁特性,v3 版本旨在为开发者提供一个更加强大、简洁和高速的开发体验。
通过这个全新的框架版本,开发者能够迅速搭建起符合现代 web 应用标准的项目基础架构。
之前我写了一篇文章专门介绍这个v3版本,这里就不赘述了。
感兴趣的同学可以查看: 关于正在开发中的DjangoStarter v3版本
重构界面
本次最大的改变就是使用 Tailwind CSS 取代了原本的 Bootstrap,并且加入了很多新的页面,比如用户中心、设置、关于、联系我们、登录、注册、用户协议等,基本就是往 CMS 的方向走。
我甚至一度想引入 wagtail ,不过后面想想还是算了,已经够重了,等下完全和小项目不沾边,哈哈哈
国际化支持 (beta)
这次还添加了国际化支持
Django 本身是有国际化功能的
只不过很多项目都去除了
这次我加入了国际化支持,不过只是测试版,只是添加了支持,翻译部分我还没做好,所以也就还没把切换语言的按钮加上。
以下是一些国际化功能的用法
在模板里
{% translate 'Home' %}
在python代码里
from django.utils.translation import gettext_lazy as _
print(_('hello'))
生成翻译文件
在 src
目录下执行
django-admin makemessages -l [language_code]
language_code:
- zh_HAns
- en_US
其他语言可以参考Django官网
编译消息文件
依然是在 src
目录下执行
django-admin compilemessages
Windows 开发环境
如果是使用 windows 开发,需要先安装 gettext
工具
推荐使用 scoop 包管理器
scoop install gettext
安装完成之后,执行以下命令验证
xgettext --version
部分界面截图
旧版主页
先来看看旧版的主页长什么样
新版主页
新的界面使用 Tailwind CSS 重构,好看了很多
底部也是可以配置的
关于
这个页面做了很多动效,可以看看后面的动图
动效是用AOS做的,感觉还不错,挺方便的,不过要注意得使用 3.0 的 beta 版本,一开始没注意遇到了不少坑。
联系我们
这些联系方式都是可以配置的
表单也用上了 DjangoStarter 新版封装好的 BaseModelForm
封装好的 BaseModelForm 用起来是这样
class ContactModelForm(BaseModelForm):
class Meta:
model = Contact
fields = ('name', 'email', 'phone', 'message')
widgets = {
'name': forms.TextInput(attrs={'placeholder': '请输入您的姓名'}),
'email': forms.EmailInput(attrs={'placeholder': '请输入您的邮箱'}),
'phone': forms.TextInput(attrs={'placeholder': '请输入您的联系电话'}),
'message': forms.Textarea(attrs={'placeholder': '请输入您的留言内容', 'rows': 4})
}
登录/注册
这个登录页面是之前使用 wagtail 那个项目里面搬过来的
注册页面也是类似的,这里就不贴图片了
个人中心
个人中心这里的布局来自之前的 TodayTV 项目,不过原来也是从其他在线模板参考来的,界面不是很好看。
然而我用 Claude 3.5 和 DeepSeek R1 反复优化多次,仍然无法让我满意,而且代码越来越乱,感觉后面还是得自己来改。
下面的关于我
修改资料
这也是从 TodayTV 项目来的,搭配 Django Forms 实现出来的效果还可以。
隐私政策
这个是用 Claude 生成的,使用 RooCode 优化的提示词,看着有模有样的。
服务条款也是类似的,这里我就不截图了。
Demo页面
为了方便演示各种功能,我还新增了Demo页面
当然这个不太协调的页面是 AI 辅助布局的
错误页面
并且用 Claude 生成了几个错误页面
包括403、404、500页面,都是类似的,这里我只贴403页面的截图
解决了一个 issue
https://github.com/Deali-Axy/DjangoStarter/issues/20
有用户反馈本来应该返回400的接口,实际返回了200
我看了之后发现这个问题属于是从DRF迁移到ninja的历史遗留问题
之前我在框架里封装 responses 用于快捷输出各种返回状态
def ok(message: str, data: Optional[dict] = None):
return _gen_resp(message, data, 200)
def forbidden(message: str, data: Optional[dict] = None):
return _gen_resp(message, data, 403)
def bad_request(message: str, data: Optional[dict] = None):
return _gen_resp(message, data, 400)
def not_found(message: str, data: Optional[dict] = None):
return _gen_resp(message, data, 404)
但现在 ninja 里,一直返回的都是 200,这个就是处理返回状态码的地方出问题。
有几种解决思路,反正原本我用重写 renderer 的方式是没办法的,renderer里没法定义返回值,只能改变相应内容。
要不就是用 django 中间件,但需要解析 JSON 会影响性能
最终我对 responses 进行了改造,新增了 ResponseGenerator
这个类,代码就不贴了
关键实现就是用了 ninja 的 api.create_response
这个方法可以指定 status code
在需要用到的地方,比如 src/apps/account/apis/auth/apis.py
router = Router(tags=['auth'])
_resp = ResponseGenerator(router=router)
@router.post('/register', url_name='account/auth/register')
def register(request, data: RegisterSchema):
if User.objects.filter(username=data.username).exists():
return _resp.bad_request(request, '用户名已存在!')
if data.phone:
phone_pattern = '^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\\d{8}$'
if not re.match(phone_pattern, data.phone):
return _resp.bad_request(request, '手机号码格式不对!')
if UserProfile.objects.filter(phone=data.phone).exists():
return _resp.bad_request(request, '手机号已存在!')
if data.password != data.confirm_password:
return _resp.bad_request(request, '密码不一致!')
相比起原来的,每个返回的响应需要添加 request 参数
虽然比起原来复杂一点,也算是搞定了。
Todos
- https://django-ninja.cn 上有不少 ninja 周边生态组件,后续可以用上
- 将 admin 由 simpleui 切换到 unfold admin
- 增加更多的默认页面
DeepSeek+Claude强强联手,使用AI驱动DjangoStarter 3.1框架升级的更多相关文章
- NPC AI驱动最基本过程
NPC AI驱动最基本过程 NPCmgr中比较重要的是加载NPC和一个NPCAI的一个指针 他利用map那个线程的定时到底做了啥呢 void NPCmgr::npcAITimer() { time_t ...
- 【可视化】DataV接入ECharts图表库 可视化利器强强联手
DataV接入ECharts图表库 可视化利器强强联手 摘要: 两个扛把子级产品的结合,而且文末有彩蛋. DataV 数据可视化是搭建每年天猫双十一作战大屏的幕后功臣,ECharts 是广受数据可视化 ...
- 微软发布云端基因服务:推动AI驱动的精准医疗
微软发布云端基因服务:推动AI驱动的精准医疗 2018年03月07日 00:00:00 微软研究院AI头条 阅读数:117 版权声明:本文为博主原创文章,未经博主允许不得转载. https:// ...
- AI驱动的超分辨技术落地实践
近年来,随着深度学习技术的快速发展,基于AI的超分辨技术在图像恢复和图像增强领域呈现出广阔的应用前景,受到了学术界和工业界的关注和重视.但是,在RTC视频领域中,很多AI算法并不能满足实际场景下的应用 ...
- 迈入 8K 时代,AI 驱动超高清 “视” 界到来
2021 年,超高清迈入 "8K" 时代.超高清视频将带来全新视听体验,但超高清生产在内容生产层面也面临着超高清存量少.生产设备更新换代慢.制作周期成倍增加的困境.在 7 月 10 ...
- 【Linux高级驱动】input子系统框架
[1.input子系统框架(drivers\input)] 如何得出某个驱动所遵循的框架? 1) 通过网络搜索 2) 自己想办法跟内核代码! 2.1 定位此驱动是属于哪种类 ...
- 【Linux高级驱动】input子系统框架【转】
转自:http://www.cnblogs.com/lcw/p/3802617.html [1.input子系统框架(drivers\input)] 如何得出某个驱动所遵循的框架? 1) 通过网 ...
- .net core +codefirst(.net core 基础入门,适合这方面的小白阅读) 【我们一起写框架】领域驱动设计的CodeFirst框架(一)—序篇
.net core +codefirst(.net core 基础入门,适合这方面的小白阅读) 前言 .net core mvc和 .net mvc开发很相似,比如 视图-模型-控制器结构.所以. ...
- 「 从0到1学习微服务SpringCloud 」08 构建消息驱动微服务的框架 Spring Cloud Stream
系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现 「 从0到1学习微服务S ...
- ChatGPT 与 Midjourney 强强联手,让先秦阿房宫重现辉煌!
Midjourney 是一款非常特殊的 AI 绘画聊天机器人,它并不是软件,也不用安装,而是直接搭载在 Discord 平台之上,所有的功能都是通过调用 Discord 的聊天机器人程序实现的.要想使 ...
随机推荐
- Qt/C++离线地图的加载和交互/可以离线使用/百度和天地图离线/支持手机上运行
一.前言说明 在地图应用中,有很多时候是需要断网环境中离线使用的,一般会采用两种做法,一种是只下载好离线瓦片地图,然后根据不同的缩放和经纬度坐标绘制瓦片.这种方式优点是任何地图都支持,只需要拿到瓦片即 ...
- Qt/C++音视频开发78-获取本地摄像头支持的分辨率/帧率/格式等信息/mjpeg/yuyv/h264
一.前言 上一篇文章讲到用ffmpeg命令方式执行打印到日志输出,可以拿到本地摄像头设备信息,顺藤摸瓜,发现可以通过执行 ffmpeg -f dshow -list_options true -i v ...
- SuperMap Objects .NET知识库:SQL查询以及通配符
1 SQL 语句的构建 在SuperMap组件产品中,有许多接口都用到了过滤条件,也就是标准 SQL 语句中的 WHERE 子句部分,比如各种涉及属性查询的接口.网络分析中弧段的过滤条件.拓扑 ...
- [转]关于java中JButton的样式设置(的一些我们应该知道的函数)
1. 对JButton大小的设置 --因为JButen是属于小器件类型的,所以一般的setSize不能对其惊醒大小的设置,所以一般我们用 button.setPreferredSize(new Dim ...
- 开源即时通讯IM框架MobileIMSDK的H5端技术概览
一.基本介绍 MobileIMSDK的H5端是一套纯JS编写的基于标准WebSocket的即时通讯库: 1)超轻量级.极少依赖: 2)纯JS编写.高度提炼,简单易用: 3)基于标准WebSocket协 ...
- sql server版本太老,java客户端连接失败问题定位
背景 最近半路接手了一个系统的优化需求,这个系统有个遗留问题还没解决,随着新需求的上线,系统正式开放使用,这个遗留问题也必须解决. 这个系统大概是下面这样的,支持录入各种数据源的信息(ip.端口.数据 ...
- biancheng-数据结构
目录http://c.biancheng.net/data_structure/ 1数据结构入门2线性表3栈和队列4字符串5数组和广义表6树存储结构7图存储结构8动态内存管理9查找表结构10排序算法1 ...
- Flask: SSO原理及实现
原文链接:http://www.tuicool.com/articles/ZbyU3e 现在大多数软件公司的业务不再是单条线,而是发展成多元化的产品线.包括多个网站应用.移动APP以及桌面软件,那么 ...
- RocketMQ原理—4.消息读写的性能优化
大纲 1.Producer基于队列的消息分发机制 2.Producer基于Hash的有序消息分发 3.Broker如何实现高并发消息数据写入 4.RocketMQ读写队列的运作原理分析 5.Consu ...
- 使用 Dify + LLM 构建精确任务处理应用
在构建基于大语言模型(LLM)的应用时,如何确保返回结果的准确性和可重复性是一个常见的挑战.本文将结合 Dify + LLM 的使用经验,介绍如何设计一个精确的 LLM 任务处理流程,避免传统 LLM ...