54

サーバーの起動時にこれらのコード行を実行したいと思います(開発と本番の両方):

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

設定が既に読み込まれている必要があるため、入れても機能しsettings.pyません。

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

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

4

6 に答える 6

59

これを実行するミドルウェアを作成し、その後、から__init__レイズすると、djangoはすべてのリクエストでそれを削除します:)。ちなみに、は最初のリクエストではなく起動時に呼び出されるため、最初のユーザーをブロックすることはありません。django.core.exceptions.MiddlewareNotUsed__init____init__

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

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

更新: Django1.7にはこれのサポートが含まれています。(ドキュメント、チケットでリンクされている)

于 2010-05-06T13:30:51.140 に答える
4

両方に 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()
于 2010-05-08T12:38:59.453 に答える
3

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

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

于 2011-08-28T10:55:29.047 に答える
1

mod_wsgi を使用している場合は、wsgi start アプリに入れることができます

于 2010-05-07T15:01:00.147 に答える
0

Django の起動シグナルが見つからない 場合の回避策は次のとおりです: https://github.com/lsaffre/djangosite/blob/master/djangosite/models.py特別なアプリ (Ross McFarland のアイデアに基づく) を作成して呼び出すというトリックは、他の環境でも機能するはずです。リュック

于 2013-12-26T16:10:13.517 に答える