V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ohazyi
V2EX  ›  Django

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

  •  
  •   ohazyi · 2019-02-25 22:18:00 +08:00 · 3051 次点击
    这是一个创建于 1858 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    还有就是再代码里控制什么时候 start server
    petelin
        3
    petelin  
       2019-02-25 22:44:36 +08:00 via iPhone
    还有一种是 Django 应该有 before start 这种钩子函数 也可以
    zyqzyq08
        4
    zyqzyq08  
       2019-02-25 22:51:24 +08:00 via Android
    ready
    rogwan
        5
    rogwan  
       2019-02-25 23:02:33 +08:00 via Android
    是不是应该反过来考虑,先启动加载这个 model,完了之后再 run django ?
    ohazyi
        6
    ohazyi  
    OP
       2019-02-25 23:12:12 +08:00
    @petelin 请问一下这个 init 接口是在什么时候执行呢?先有一个这样的 init 请求过去,然后再访问其它我想要的这些 get 请求吗?
    ohazyi
        7
    ohazyi  
    OP
       2019-02-25 23:13:29 +08:00
    @rogwan 嗯是这么考虑的,但不知道这个在 django 里怎么操作“先启动加载这个 model ”
    Seahurt
        8
    Seahurt  
       2019-02-25 23:34:25 +08:00 via Android
    gunicorn 里有一些 server hook 函数可用
    applehater
        9
    applehater  
       2019-02-25 23:53:21 +08:00
    @petelin 这种会重复启动两个进程的
    bestkayle
        10
    bestkayle  
       2019-02-26 08:49:24 +08:00 via iPhone
    以前写 py 的时候记得 django 有个 command 什么的
    petelin
        11
    petelin  
       2019-02-26 09:37:43 +08:00 via iPhone
    @applehater 那种?
    37Y37
        12
    37Y37  
       2019-02-26 09:39:13 +08:00
    Django signals,看一下 connection_created 数据库建立连接时触发,这里有文章介绍:
    https://mp.weixin.qq.com/s/cMxdAfsTno56ixurmD4KXA
    freakxx
        13
    freakxx  
       2019-02-26 10:02:25 +08:00
    实例化之后,直接 import 到 view 层
    111qqz
        14
    111qqz  
       2019-02-26 10:16:39 +08:00
    qqxx520
        15
    qqxx520  
       2019-02-26 11:20:40 +08:00   ❤️ 1
    直接在 urls.py 或者 models.py 里 import 一下,如果是个函数,执行一下。
    另一种方法,每个 app 里边有一个 apps.py ,里边有一个 AppConfig 的子类,在这个子类里有一个函数叫 ready(). 把预先初始化的代码写在 ready()里,也可以.
    ohazyi
        16
    ohazyi  
    OP
       2019-02-26 15:05:25 +08:00
    @qqxx520 感谢,我试一下~
    applehater
        17
    applehater  
       2019-02-26 21:42:42 +08:00 via iPhone
    @petelin 就是直接在模块 init 方法启动,开发模式会启动两次的,其他 uwsgi 就会几个进程启动几次了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3605 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 05:00 · PVG 13:00 · LAX 22:00 · JFK 01:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.