python在哪运行代码_python-将Django启动代码放在哪里?

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值