我正在开发一个 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/