11

サーバーを再起動せずにプログラムで Django に URL パターンを追加する方法はありますか?

または、Django に URL パターン ( URLconf ) を強制的に再処理/キャッシュさせる方法はありますか?

4

4 に答える 4

4

コードをプリロードせずにgunicornを使用する場合は、HUPをgunicornマスタープロセスに送信するだけで、新しいコードをロードする新しいワーカーが生成され、リクエストが1つも失われることなく、古いコードが正常にシャットダウンされます。

于 2011-02-01T22:45:35.947 に答える
3

私はいくつかのものをハッキングしてこのようなことを試みましたdjango.core.urlresolvers- それは私にとってはうまくいきましたが、それはハックであることに注意してください. 私はまだコードを持っていませんが、私は次のようなことをしました:

  1. Django は通常、URL の解決を担当するurlresolvers.get_resolver()を取得するために使用します。RegexURLResolverこの関数に渡すNoneと、「ルート」URLConf が取得されます。
  2. get_resolver()_resolver_cacheロードされた URLConf にキャッシュ を使用します。
  3. リセット_resolver_cacheすると、Django はクリーンな URLResolver を強制的に再作成する必要があります。

_urlconf_moduleまたは、 rootの属性の設定を解除してみてください。これにより、 RegexURLResolverDjango は強制的に再読み込みする必要があります (これについてはよくわかりませんが、モジュールが Python によってキャッシュされる可能性があります)。

from urlresolvers import get_resolver

delattr(get_resolver(None), '_urlconf_module')

繰り返しますが、これが機能することは保証されていません (何らかの理由で明らかに破棄したコードのメモリから作業しています)。しかし、django/core/urlresolvers.py は間違いなく見たいファイルです。

編集:これでいくつか実験することにしましたが、うまくいきませんでした...

EDIT2:

思った通り、URL モジュールは Python によってキャッシュされます。それらが変更されたときにそれらを再ロードするだけでうまくいくかもしれません( を使用reload)。あなたの問題は、urlpatterns変更される可能性のあるデータに基づいて動的に構築していることです。

reloadルート URL (project.urls) とサブ URL モジュール (app.urls)を試してみました。新しい URL を表示するには、これですべてです。get_resolver(None).url_patterns

そのための秘訣は次のように簡単です: URL モジュールを手動でリロードします。

于 2011-02-01T23:03:48.240 に答える
1

これは、それを行うためのエレガントな方法でもあります。

http://codeinthehole.com/writing/how-to-reload-djangos-url-config/

ルート URL モジュールをリロードするだけです。

reload_urlconf()
于 2014-01-06T14:12:01.163 に答える