django 的 web 应用如何先跑一个程序呢?

2019-02-25 22:18:00 +08:00
 ohazyi

我 train 了一个 model,想在 django 的 web 应用加载之前先 import 之前的这些代码(这些代码比较耗时),想请问一下 django 可以做到先执行一个代码吗?(不想每次 get 到请求再都去执行那一段)

3340 次点击
所在节点    Django
17 条回复
ohazyi
2019-02-25 22:40:20 +08:00
就是可不可以在 run 这个 server 的时候就先执行某一段代码呢?
petelin
2019-02-25 22:43:53 +08:00
两种方法一种 对你来说简单点 另创建一个接口 init 用来跑初始化 然后全局变量共享给 get

还有就是再代码里控制什么时候 start server
petelin
2019-02-25 22:44:36 +08:00
还有一种是 Django 应该有 before start 这种钩子函数 也可以
zyqzyq08
2019-02-25 22:51:24 +08:00
ready
rogwan
2019-02-25 23:02:33 +08:00
是不是应该反过来考虑,先启动加载这个 model,完了之后再 run django ?
ohazyi
2019-02-25 23:12:12 +08:00
@petelin 请问一下这个 init 接口是在什么时候执行呢?先有一个这样的 init 请求过去,然后再访问其它我想要的这些 get 请求吗?
ohazyi
2019-02-25 23:13:29 +08:00
@rogwan 嗯是这么考虑的,但不知道这个在 django 里怎么操作“先启动加载这个 model ”
Seahurt
2019-02-25 23:34:25 +08:00
gunicorn 里有一些 server hook 函数可用
applehater
2019-02-25 23:53:21 +08:00
@petelin 这种会重复启动两个进程的
KgM4gLtF0shViDH3
2019-02-26 08:49:24 +08:00
以前写 py 的时候记得 django 有个 command 什么的
petelin
2019-02-26 09:37:43 +08:00
@applehater 那种?
37Y37
2019-02-26 09:39:13 +08:00
Django signals,看一下 connection_created 数据库建立连接时触发,这里有文章介绍:
https://mp.weixin.qq.com/s/cMxdAfsTno56ixurmD4KXA
freakxx
2019-02-26 10:02:25 +08:00
实例化之后,直接 import 到 view 层
111qqz
2019-02-26 10:16:39 +08:00
qqxx520
2019-02-26 11:20:40 +08:00
直接在 urls.py 或者 models.py 里 import 一下,如果是个函数,执行一下。
另一种方法,每个 app 里边有一个 apps.py ,里边有一个 AppConfig 的子类,在这个子类里有一个函数叫 ready(). 把预先初始化的代码写在 ready()里,也可以.
ohazyi
2019-02-26 15:05:25 +08:00
@qqxx520 感谢,我试一下~
applehater
2019-02-26 21:42:42 +08:00
@petelin 就是直接在模块 init 方法启动,开发模式会启动两次的,其他 uwsgi 就会几个进程启动几次了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/538656

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX