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 的聊天机器人程序实现的.要想使 ...
随机推荐
- 【转】ReentrantReadWriteLock读写锁详解
https://www.cnblogs.com/xiaoxi/p/9140541.html 一.读写锁简介 现实中有这样一种场景:对共享资源有读和写的操作,且写操作没有读操作那么频繁.在没有写操作的时 ...
- 龙哥量化:注册simnow上期所的期货仿真模拟交易账户教程步骤
永远顺着趋势交易 在技术分析这种市场研究方法中,趋势的概念绝对是核心内容.分析师所使用的全部工具, 诸如支撑和阻挡水平.价格形态.移动平均线.趋势线等等,其唯一的目的就是辅助我们估量市场趋势, 从而顺 ...
- Qt编写地图综合应用30-世界地图
一.前言 世界地图也属于区域地图的一种,最开始做项目的时候只有国内的地图需求,后面有个客户他们的产品是面向国际市场,所以在大屏展示的时候,必须展示一张世界地图,所有箭头动态流向中国,当然这些都要离线使 ...
- Qt开源作品15-视频监控画面
一.前言 视频监控系统在整个安防领域,已经做到了烂大街的程序,全国起码几百家公司做过类似的系统,当然这一方面的需求量也是非常旺盛的,各种定制化的需求越来越多,尤其是这几年借着人脸识别的东风,发展更加迅 ...
- IM开发者的零基础通信技术入门(十四):高铁上无线上网有多难?一文即懂!
[来源申明]本文引用了微信公众号"鲜枣课堂"的<坐高铁手机没信号?原因远比你想的要复杂!>文章内容.为了更好的内容呈现,本文在引用和收录时内容有改动,转载时请注明原文来 ...
- VEP注释文件下载网址
Ensembl提供多个物种的注释文件: ftp://ftp.ensembl.org/pub/release-96/variation/VEP
- Solution Set - “潮汐守候终结放逐月圆”
目录 0.「NOI Simu.」游戏 1.「NOI Simu.」海盗 2.「集训队作业 2020-2021」「LOJ #3405」Gem Island 2 3.「UR #12」「UOJ #181」密码 ...
- MySQL---约束、主从复制原理、Docker搭建
MySQL(11)---约束 含义: 一种限制,用于限制表中的数据,为了保证表中的数据的准确和可靠性. 先把Mysql几种约束列出来: 主键约束 外键约束 唯一性约束 非空约束 默认值约束 自增约束 ...
- shell脚本中的循环(for循环,while循环)及break、continue的用法示例
Shell脚本中也算是一门简易的编程语言了,当然循环是不能缺少的.常用到的循环有for循环和while循环.下面就分别介绍一下两种循环的结构. [for循环]: Shell脚本中的for循环示例: # ...
- 算法题目分享:小美的01串翻转 | dp
最近遇到一个算法题目,感觉挺有意思,分享一下.原题和参考题解放在最后的链接中了. 题目 题目描述 小美定义一个 01 串的权值为:每次操作选择一位取反,使得相邻字符都不相等的最小操作次数. 例如,&q ...