先说说使用感觉: 小白用户,之前用 flask,后面发现需要太多自己实现功能,改成 django,开发功能速度马上提升。 没有数据对比,只能使用的感觉 flask 比 django 响应快点,只能是一种感觉。 另外偶然性出现读取数据库时间过长,反复测试,就是偶发性。
所以问问高手们,具体使用过程中 django 该如何优化?
1
wuwukai007 2021-01-18 17:00:18 +08:00 1
把 csrf 关了,速度立马提升
|
2
XiaoxiaoPu 2021-01-18 17:16:09 +08:00 1
ORM 查询优化可以看看 www.jianshu.com/p/aded5b2029f6
不过第一步是先精确定位到慢在哪 |
3
charexcalibur 2021-01-18 17:29:59 +08:00
|
4
reorx 2021-01-18 17:49:17 +08:00
1. 可以,values / values_list 相当于只 select 了指定的 fields ;如果需要得到 model instance 可以用 only / defer
2. 初次启动代码加载的提升,不影响 view 的处理时间 4. 了解每个具体的作用,视情况关闭,极端情况下都可以关闭 5. 可以看下我自己常用的脚手架项目,暂时还没有文档说明,与 django 官方教程的不同在于,只有一个 app,但会有多个 modules 中存在 models,通过自定义 AppConfig 完成加载 https://github.com/reorx/django_starter_pack/tree/master/starter_app |
5
lixuda OP |
6
zachlhb 2021-01-18 18:14:13 +08:00 via Android
use_i18n 不建议关闭,队列框架用的是 utc 时间的,关了队列的时间就会有大坑
|
8
allisone 2021-01-18 18:58:01 +08:00
django 就是上手快
|
9
lixuda OP @reorx 可以了,非常感谢。另外看见可以外部程序引用 django model 的 orm ?之前定时程序,用 peewee 来做,如果能直接用 app 里面 model 就方便多了
|
10
reorx 2021-01-19 00:28:14 +08:00
@lixuda 可以在外部程序中引用 django orm,需要在 import models 之前完成 `django.setup()`, 我封装了一个简单的函数 `setup_django` 专门用来执行这个操作,见文件 `utils/django_setup.py`.
示例见 `cli.py`: https://github.com/reorx/django_starter_pack/blob/master/cli.py |
11
erakayin 2021-01-19 10:12:34 +08:00
|
12
nonduality 2021-01-19 12:01:51 +08:00
官网的教程很详细了,按照那个去做速度就能提升很多,基本上是:
0 、首先用 django debug tools 检查到底慢在哪,这个工具还是挺好用的;其次打开 context_processors 里头的 debug,再打开日志 django 里头的 log_level 为 debug,这样数据库每次访问的 sql 语句和次数都会打印出来,方便进行优化; 1 、对数据库使用 prefetch,用 only 或 defer 获取只需要的字段,数据库写入可以使用 update_fields 只更新特定字段; values_list 是能提升读取速度,但用起来不算太方便; 2 、对网页片段或生成的 json 缓存(配合 Redis 或 DiskCache 做后端都行); 3 、取消不必要的 middleware,比如不需要在模板用 Message,可以把它取消;还有 context_processors 里头 request 跟 auth 是重复的,仅方便你用 request 对象,你不需要可以取消 request,需要时再传入模板; 4 、生成 csrf key 确实很慢,如果不需要可以关掉; 5 、针对特定 view,对其算法进行优化,比方我有需要频繁合成一个特定时间,后来优化成用时间戳去算,就快了很多。 |
13
tmackan 2021-01-19 15:26:28 +08:00
先优化你的业务逻辑 /业务流程
profile 找到耗时的 func,然后想办法优化掉 另外 ORM 必须打印出 SQL 语句还要自己分析,是否合理 py 的 orm 中默认大量是用 select * 的查询,无法走索引覆盖,需要回表。。。 |