ohazyi
V2EX  ›  Django

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

  •  
  •   ohazyi · Feb 25, 2019 · 4108 views
    This topic created in 2673 days ago, the information mentioned may be changed or developed.

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

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

    还有就是再代码里控制什么时候 start server
    petelin
        3
    petelin  
       Feb 25, 2019 via iPhone
    还有一种是 Django 应该有 before start 这种钩子函数 也可以
    zyqzyq08
        4
    zyqzyq08  
       Feb 25, 2019 via Android
    ready
    rogwan
        5
    rogwan  
       Feb 25, 2019 via Android
    是不是应该反过来考虑,先启动加载这个 model,完了之后再 run django ?
    ohazyi
        6
    ohazyi  
    OP
       Feb 25, 2019
    @petelin 请问一下这个 init 接口是在什么时候执行呢?先有一个这样的 init 请求过去,然后再访问其它我想要的这些 get 请求吗?
    ohazyi
        7
    ohazyi  
    OP
       Feb 25, 2019
    @rogwan 嗯是这么考虑的,但不知道这个在 django 里怎么操作“先启动加载这个 model ”
    Seahurt
        8
    Seahurt  
       Feb 25, 2019 via Android
    gunicorn 里有一些 server hook 函数可用
    applehater
        9
    applehater  
       Feb 25, 2019
    @petelin 这种会重复启动两个进程的
    KgM4gLtF0shViDH3
        10
    KgM4gLtF0shViDH3  
       Feb 26, 2019 via iPhone
    以前写 py 的时候记得 django 有个 command 什么的
    petelin
        11
    petelin  
       Feb 26, 2019 via iPhone
    @applehater 那种?
    37Y37
        12
    37Y37  
       Feb 26, 2019
    Django signals,看一下 connection_created 数据库建立连接时触发,这里有文章介绍:
    https://mp.weixin.qq.com/s/cMxdAfsTno56ixurmD4KXA
    metamask
        13
    metamask  
       Feb 26, 2019
    实例化之后,直接 import 到 view 层
    midasplus
        14
    midasplus  
       Feb 26, 2019
    qqxx520
        15
    qqxx520  
       Feb 26, 2019   ❤️ 1
    直接在 urls.py 或者 models.py 里 import 一下,如果是个函数,执行一下。
    另一种方法,每个 app 里边有一个 apps.py ,里边有一个 AppConfig 的子类,在这个子类里有一个函数叫 ready(). 把预先初始化的代码写在 ready()里,也可以.
    ohazyi
        16
    ohazyi  
    OP
       Feb 26, 2019
    @qqxx520 感谢,我试一下~
    applehater
        17
    applehater  
       Feb 26, 2019 via iPhone
    @petelin 就是直接在模块 init 方法启动,开发模式会启动两次的,其他 uwsgi 就会几个进程启动几次了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1194 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 48ms · UTC 17:08 · PVG 01:08 · LAX 10:08 · JFK 13:08
    ♥ Do have faith in what you're doing.