web-dev-qa-db-ja.com

どこに置くかDjango起動コード?

サーバーの起動時に(開発と本番の両方で)次のコード行を実行したいのですが。

from Django.core import management
management.call_command('syncdb', interactive=False)

それをsettings.pyに入れても、設定が既にロードされている必要があるため機能しません。

データベースを使用するミドルウェアがいくつかあり、それらが失敗してビューにアクセスできないため、それらをビューに配置して外部からそのビューにアクセスすることもできません。

それらをミドルウェアに配置しても機能しますが、アプリにアクセスするたびに呼び出されます。考えられる解決策は、すべてのジョブを実行し、MIDDLEWARE_CLASSESから自分自身を削除するミドルウェアを作成して、呼び出されないようにすることです。あまり多くのサルをパッチすることなくそれを行うことができますか?

52
Attila O.

これを行うミドルウェアを__init__およびその後レイズDjango.core.exceptions.MiddlewareNotUsed から __init__、Djangoはすべてのリクエストに対してそれを削除します:) __init__は最初のリクエスト時ではなく起動時に呼び出されるため、最初のユーザーをブロックしません。

起動信号を追加することについての話がありますが、すぐには利用できません(たとえば、この信号を送信する必要がある場合に大きな問題が発生します)

関連チケット: https://code.djangoproject.com/ticket/13024

更新:Django 1.7はこれをサポートしています。( Documentation チケット)

55
KillianDS

両方にApache/mod_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()
4

カスタムコマンドを作成して、handle関数にコードを記述できます。詳細はこちら https://docs.djangoproject.com/en/dev/howto/custom-management-commands/

次に、Djangoサーバーを実行してから新しいカスタムコマンドを実行する起動スクリプトを作成できます。

3
Emam

Mod_wsgiを使用している場合は、それをwsgi startアプリに配置できます

1
Aviah Laor

Django 1.7+で、スタートアップコードを実行する場合は、

1. migrate、makemigrations、Shellセッションなどで実行しないでください...

2. 2回以上実行しないでください

解決策は次のとおりです。

ファイル:myapp/apps.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()

ファイル:myapp/__init__.py

default_app_config = 'myapp.apps.MyAppConfig'

この投稿は@Pyklerおよび@bdoeringからの提案を使用しています

0
Joseph Bani

Djangoの不足している起動信号を回避する方法を次に示します。 https://github.com/lsaffre/djangosite/blob/master/djangosite/models.py そこで呼び出されるコードは特定のものです私のdjangositeプロジェクトに追加しましたが、(Ross McFarlandのアイデアに基づいた)特別なアプリを作成してそれを呼び出すトリックは、他の環境でも機能するはずです。リュック

0
Luc Saffre