さまざまなプロジェクト/データベースに同じアプリケーションを使用するために、thisの回答からインスピレーションされたURLベースのデータベースルーティングを設定しました。プロジェクトはデータを共有する必要はなく、アクセス制御はすべてのプロジェクトで独自に管理されており、すべてのプロジェクトに管理サイトが必要です。元の投稿と同様に、私はデータベースルータと、要求経路からどのデータベースを使用するかを決定するミドルウェアを使用します。 /test/process/1
はデータベースtest
に、/default/process/2
はデータベースdefault
にルーティングされます。URLベースのデータベースルーティング
import threading
from django.conf import settings
request_cfg = threading.local()
class RouterMiddleware(object):
def process_view(self, request, view_func, view_args, view_kwargs):
path = request.path.lstrip('/').split('/')
if path[0] in settings.DATABASES:
request_cfg.db = path[0]
def process_response(self, request, response):
if hasattr(request_cfg, 'db'):
del request_cfg.db
return response
class DatabaseRouter(object):
def _default_db(self):
if hasattr(request_cfg, 'db') and request_cfg.db in settings.DATABASES:
return request_cfg.db
else:
return 'default'
def db_for_read(self, model, **hints):
return self._default_db()
def db_for_write(self, model, **hints):
return self._default_db()
URLパターンは、特定のデータベースを参照するサブパスを含むように拡張する必要があります。私はこのようなプロジェクトレベルのurls.pyにURLをハードコーディングすることによって、これをやった:
urlpatterns = [
url(r'^default/admin/', include(admin.site.urls)), # does not work
url(r'^test/admin/', include(admin.site.urls)), # does not work
url(r'^default/', include('logbook.urls', namespace='anything')),
url(r'^test/', include('logbook.urls', namespace='anything else'))]
私は、これは非常に素晴らしいではないことを認めるが、私はいくつかのデータベースよりも多くを管理するために持っている期待しないでください。興味深いことに、名前空間の議論が何であるかは関係ありませんが、それは与えられなければなりません。アプリの元の名前空間はlogbook
で、アプリのビューとテンプレートのURLを逆転させるために使用されています。アプリケーションレベルでそして
、APP_NAMEが定義されなければならない(および元の名前空間と等しくなる)urls.py:Iとしてreverse()
のすべてのコールにcurrent_app=request.resolver_match.namespace
kwargを追加ビューに
app_name = 'logbook'
urlpatterns = [
url(r'^$', views.redirect_index, name='index'),
url(r'^(?P<date>[0-9]{4}[0-9]{2})/$', views.Index.as_view(), name='index'),
.....
djangoのドキュメントで説明されています。テンプレートを修正する必要はありませんでした。
全体的にこの2つの例外を除いて非常によく動作します:管理者ビューのいずれかの逆転URLは常に私はそれがほとんどdjango.contrib.auth.middleware.AuthenticationMiddleware
で動作させることはできませんurls.py
LOGIN
とLOGIN_REDIRECT
は定数であると思います。
これはきれいなアプローチで、上記の2つの例外に対する解決策があるのだろうかと思います。そうでない場合は、よりよい解決策は何でしょうか?
どのように展開していますか?あなたのサーバーの設定でURLを分類することが最善のことだと私は思います。あなたはこれについて心配する必要はありませんので、2つの完全に別々のdjango wsgiアプリケーションを使用してください。私はdjangoの管理アプリが複数のデータベースでうまくいくとは思わない。ただし、複数のユーザーデータベースを必要としない場合でも、adminデータベースと認証データベースなどを1つのデータベースに集約することで、いくらかのマイレージを得ることができます。 – daphtdazz
私はまだ展開することを考えていない、私はPythonのWebサーバーで作業しています。とにかく、もっと問題があると思います。メディアファイルと一緒に言うと、管理アプリが複数のデータベースで動作するとは思われません。私はおそらく単一のデータベースにすべてを残すでしょう。あなたの考えをありがとう。 –