サーバーを再起動せずにプログラムで Django に URL パターンを追加する方法はありますか?
または、Django に URL パターン ( URLconf ) を強制的に再処理/キャッシュさせる方法はありますか?
サーバーを再起動せずにプログラムで Django に URL パターンを追加する方法はありますか?
または、Django に URL パターン ( URLconf ) を強制的に再処理/キャッシュさせる方法はありますか?
コードをプリロードせずにgunicornを使用する場合は、HUPをgunicornマスタープロセスに送信するだけで、新しいコードをロードする新しいワーカーが生成され、リクエストが1つも失われることなく、古いコードが正常にシャットダウンされます。
私はいくつかのものをハッキングしてこのようなことを試みましたdjango.core.urlresolvers
- それは私にとってはうまくいきましたが、それはハックであることに注意してください. 私はまだコードを持っていませんが、私は次のようなことをしました:
urlresolvers.get_resolver()
を取得するために使用します。RegexURLResolver
この関数に渡すNone
と、「ルート」URLConf が取得されます。get_resolver()
_resolver_cache
ロードされた URLConf にキャッシュ を使用します。_resolver_cache
すると、Django はクリーンな URLResolver を強制的に再作成する必要があります。_urlconf_module
または、 rootの属性の設定を解除してみてください。これにより、 RegexURLResolver
Django は強制的に再読み込みする必要があります (これについてはよくわかりませんが、モジュールが 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 モジュールを手動でリロードします。
これは、それを行うためのエレガントな方法でもあります。
http://codeinthehole.com/writing/how-to-reload-djangos-url-config/
ルート URL モジュールをリロードするだけです。
reload_urlconf()