2017-04-03 15 views
6

さまざまなプロジェクト/データベースに同じアプリケーションを使用するために、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

  • の最初のエントリに解決されます

    • LOGINLOGIN_REDIRECTは定数であると思います。

    これはきれいなアプローチで、上記の2つの例外に対する解決策があるのだろうかと思います。そうでない場合は、よりよい解決策は何でしょうか?

  • +2

    どのように展開していますか?あなたのサーバーの設定でURLを分類することが最善のことだと私は思います。あなたはこれについて心配する必要はありませんので、2つの完全に別々のdjango wsgiアプリケーションを使用してください。私はdjangoの管理アプリが複数のデータベースでうまくいくとは思わない。ただし、複数のユーザーデータベースを必要としない場合でも、adminデータベースと認証データベースなどを1つのデータベースに集約することで、いくらかのマイレージを得ることができます。 – daphtdazz

    +0

    私はまだ展開することを考えていない、私はPythonのWebサーバーで作業しています。とにかく、もっと問題があると思います。メディアファイルと一緒に言うと、管理アプリが複数のデータベースで動作するとは思われません。私はおそらく単一のデータベースにすべてを残すでしょう。あなたの考えをありがとう。 –

    答えて

    2

    これはあなたが探している記事です。

    Django Multi DB Documentation

    それはそれと一緒に動作するように、複数のDB、および管理コンソールを設定する方法について説明します。 2番目のdb(デフォルトではない)のカスタムモデルを作成し、ドキュメントに記載されている方法で登録する必要があります。

    +0

    私はこのページを以前に読んだことがありますが、明らかに管理インターフェースに関するセクションまではありません。しかし、認証ミドルウェアの問題は残っています。当分の間、私はそのアイディアを落とし、すべてのプロジェクトのための大きなデータベースを作成することに決めました。 –

    関連する問題