python-将Django启动代码放在哪里?
我想在服务器启动(开发和生产)时执行以下代码行:
from django.core import management
management.call_command('syncdb', interactive=False)
将其放入settings.py不起作用,因为它要求已经加载设置。
将它们放在视图中并从外部访问该视图也不起作用,因为有些中间件正在使用该数据库,并且这些中间件将失败,并且不允许我访问该视图。
将它们放在中间件中是可行的,但是每次访问我的应用程序时都会调用它。 可能的解决方案可能是创建一个完成所有工作的中间件,然后将其从MIDDLEWARE_CLASSES中删除,因此不再称为中间件。 我可以在没有太多猴子补丁的情况下做到吗?
6个解决方案
55 votes
在__init__中编写执行此操作的中间件,然后从__init__筹集django.core.exceptions.MiddlewareNotUsed,django会针对所有请求将其删除:)。 __init__是在启动时而不是在第一个请求时被调用的,因此不会阻止您的第一个用户。
有人在谈论添加启动信号,但是很快就无法使用(例如,一个主要问题是何时应该发送该信号)
相关票证:[https://code.djangoproject.com/ticket/13024]
更新:Django 1.7对此提供了支持。 (文件,如机票所链接)
KillianDS answered 2020-02-05T20:19:57Z
4 votes
如果您同时使用Apache / mod_wsgi和WSGI,请使用以下描述的WSGI脚本文件:
[http://blog.dscpl.com.au/2010/03/improved-wsgi-script-for-use-with.html]
激活语言翻译后,添加您需要的内容。
从而:
import sys
sys.path.insert(0, '/usr/local/django/mysite')
import settings
import django.core.management
django.core.management.setup_environ(settings)
utility = django.core.management.ManagementUtility()
command = utility.fetch_command('runserver')
command.validate()
import django.conf
import django.utils
django.utils.translation.activate(django.conf.settings.LANGUAGE_CODE)
# Your line here.
django.core.management.call_command('syncdb', interactive=False)
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
Graham Dumpleton answered 2020-02-05T20:20:30Z
3 votes
您可以创建一个自定义命令,然后在handle函数中编写代码。 详情在[https://docs.djangoproject.com/en/dev/howto/custom-management-commands/]
然后,您可以创建一个启动脚本,该脚本运行django服务器,然后执行新的自定义命令。
Emam answered 2020-02-05T20:20:54Z
1 votes
如果您使用的是mod_wsgi,则可以将其放入wsgi start应用程序中
Aviah Laor answered 2020-02-05T20:21:14Z
0 votes
这是我解决Django缺少启动信号的方法:[https://github.com/lsaffre/djangosite/blob/master/djangosite/models.py]在那里被调用的代码特定于我的djangosite项目,但是通过编写一个特殊的应用程序(基于Ross McFarland的想法)来调用它的技巧应该适用于其他环境。卢克
Luc Saffre answered 2020-02-05T20:21:35Z
0 votes
在Django 1.7+中,如果要运行启动代码,
1.避免在迁移,makemigrations,shell会话等环境中运行它。
2.避免运行两次或多次
一个解决方案是:
文件:myapp/__init__.py
from django.apps import AppConfig
def startup():
# startup code goes here
class MyAppConfig(AppConfig):
name = 'myapp'
verbose_name = "My Application"
def ready(self):
import os
if os.environ.get('RUN_MAIN'):
startup()
file: myapp/__init__.py
default_app_config = 'myapp.apps.MyAppConfig'
这篇文章使用来自@Pykler和@bdoering的建议
Joseph Bani answered 2020-02-05T20:23:17Z