django - Gunicorn 动态反射(reflect)更改的代码

标签 django gunicorn

我正在开发一个 django Web 应用程序,用户可以使用 ace editor 通过 UI 在应用程序本身中修改某些类的代码。 (将其视为 gitlab/github,您可以在其中在线更改代码)。但是这些类(class)在某些时候由 django 和 celery worker 运行。
一旦保存了代码更改,django 就不会因为 gunicorn 而选择更改,但在 celery 中可以正常工作,因为它的过程不同。 (使用 runserver 在本地运行它工作正常,django 和 celery 都会选择更改)。
有没有办法让 gunicorn 反射(reflect)包含类的某些目录的更改而无需重新加载整个应用程序?如果需要重新加载,有没有一种方法可以在不停机的情况下一个一个地重新加载 gunicorn 的 worker ?
gunicron 命令:

/usr/local/bin/gunicorn config.wsgi --bind 0.0.0.0:5000 --chdir=/app
wsgi 配置文件:
import os
import sys

from django.core.wsgi import get_wsgi_application

app_path = os.path.abspath(os.path.join(
    os.path.dirname(os.path.abspath(__file__)), os.pardir))
sys.path.append(os.path.join(app_path, 'an_application'))

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.production")

application = get_wsgi_application()

最佳答案

为什么不将代码保存在单独的文本文件或数据库中,相关方法可以简单地将代码作为字符串动态加载并使用 exec() 执行。 ?
假设您有一个函数 function1可以由用户编辑。当用户提交更改时,处理输入(将函数分开,以便您知道哪个函数具有什么定义),并将它们全部单独保存,例如 function1 , function2等,在数据库或文本文件中作为字符串。
您需要执行的一个 function1 ,只需加载您保存的值并使用 exec执行代码。
这样,您就不需要重新加载 gunicorn因为所有工作人员将始终在运行时获取更新的函数定义!
在以下方面的东西:


def function1_original():
    # load function definition
    f = open("function1.txt", "r")
    
    # execute the string
    exec(f.read())  # this will just load the function definition
    function1()  # this will execute the user defined function
所以用户将定义:
def function1():
    # user defined code
    # blah blah
    ...

关于django - Gunicorn 动态反射(reflect)更改的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64718215/

相关文章:

python - 检查Django模板中列表变量项中是否存在某些内容

python - 如何为异步 gunicorn worker 使用 eventlet 库

python - 使用 WSGIAuthUserScript 时如何设置 python 路径?

html - 静态文件更改未反射(reflect)在提供的样式表中

ssl - 使用 let's encrypt 证书设置 Gunicorn

django - Gunicorn 因 203/EXEC 失败

node.js - 在此示例中,如何使用 docker-compose 允许 2 个容器正确共享 .sock 文件?

python - Django rest 框架 request.data 引发错误

python - FileNotFoundError : [Errno 2] No such file or directory: 'bash' when running gunicorn server from . 服务文件

python - MongoClient 在 fork 之前打开。创建 MongoClient