サーバーの起動時に(開発と本番の両方で)次のコード行を実行したいのですが。
from Django.core import management
management.call_command('syncdb', interactive=False)
それをsettings.py
に入れても、設定が既にロードされている必要があるため機能しません。
データベースを使用するミドルウェアがいくつかあり、それらが失敗してビューにアクセスできないため、それらをビューに配置して外部からそのビューにアクセスすることもできません。
それらをミドルウェアに配置しても機能しますが、アプリにアクセスするたびに呼び出されます。考えられる解決策は、すべてのジョブを実行し、MIDDLEWARE_CLASSES
から自分自身を削除するミドルウェアを作成して、呼び出されないようにすることです。あまり多くのサルをパッチすることなくそれを行うことができますか?
これを行うミドルウェアを__init__
およびその後レイズDjango.core.exceptions.MiddlewareNotUsed
から __init__
、Djangoはすべてのリクエストに対してそれを削除します:) __init__
は最初のリクエスト時ではなく起動時に呼び出されるため、最初のユーザーをブロックしません。
起動信号を追加することについての話がありますが、すぐには利用できません(たとえば、この信号を送信する必要がある場合に大きな問題が発生します)
関連チケット: https://code.djangoproject.com/ticket/13024
更新:Django 1.7はこれをサポートしています。( Documentation チケット)
両方に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()
カスタムコマンドを作成して、handle関数にコードを記述できます。詳細はこちら https://docs.djangoproject.com/en/dev/howto/custom-management-commands/
次に、Djangoサーバーを実行してから新しいカスタムコマンドを実行する起動スクリプトを作成できます。
Mod_wsgiを使用している場合は、それをwsgi startアプリに配置できます
Django 1.7+で、スタートアップコードを実行する場合は、
解決策は次のとおりです。
ファイル: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からの提案を使用しています
Djangoの不足している起動信号を回避する方法を次に示します。 https://github.com/lsaffre/djangosite/blob/master/djangosite/models.py そこで呼び出されるコードは特定のものです私のdjangositeプロジェクトに追加しましたが、(Ross McFarlandのアイデアに基づいた)特別なアプリを作成してそれを呼び出すトリックは、他の環境でも機能するはずです。リュック