2016-03-29 5 views
1

私はDjangoで単純なWebアプリケーションを構築しています。私のユーザーは、私が何をしたいのかなど、Group B、たとえばGroup Aのために、複数のグループにDjangoの動的URLパターン

を分離している私は同じURLエンドポイント上異なる見解を持つことができるように、動的にurls.pyurlpatternsリストを更新することです。

例えば、私はこのような何かをしたいと思います(私はそれが私が欲しいものを証明するだけだ、構文がオフになっている知っている)

urlpatterns = [ 
    url(r'^$', views.homepage, name='homepage'), 
    url(r'^login/$', views.BaseLogin.as_view(), name='core.login'), 
    url(r'^logout/$', views.logout, name='core.logout'), 
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 

if request.user in groupA: 
    urlpatterns.append(url(r'^dash/', include('groupA.urls'))) 
else: 
    urlpatterns.append(url(r'^dash/', include('groupB.urls'))) 

にはどうすれば最高これを達成でしょうか?

答えて

1

それが動的にurlpatternsを変更するのは良いアイデアではないですが、次の2つを作成することができますへのリンクですURLはmysite/groupA_root_urls.pymysite/groupB_root_urls.pyです。

次にprocess_requestメソッドでrequest.urlconf属性を'mysite.groupA_root_urls''mysite.groupA_root_urls'に設定するミドルウェアを作成できます。

DjangoはROOT_URLCONFのconfの代わりにそのurlconfを使用します。

+0

これは私のために働いたものです。ありがとう! – intelis

3

私はこれも不可能ではないと思います。そのようなロジックをビューに配置する必要があります。両方の土地を同じビューにしてリダイレクトするか、ユーザーのグループ所属に基づいて異なるコンテンツをビューにまとめます。

+0

このアドバイスを参考にしてください。すべてのURLを含めると、ユーザーが特定のURLに対するアクセス権を持っていない場合、HTTP 404または403で応答するだけです。 – kevswanberg

1

URLはすべてのユーザーに対して動的にロードされず、アプリケーションの起動時に解析されてロードされるため、要求ごとのロジックをそこに配置することはできません。一般的には、このロジックはあなたの視点で処理する必要があります。

つまり、カスタムミドルウェアを使用してこの動作をシミュレートできます。ミドルウェアクラスを作成し、process_view()メソッドを記述してあなたのURLをチェックし、興味のあるものがあれば自分でビュー関数を見つけて実行し、HttpResponseを返します。あなたのミドルウェアがリストの最後であることを確認して、他のすべてのミドルウェアがあなたの前に実行する機会を得るようにします。これは重大なプロジェクト:)ここ

に「醜いハック」に該当することを断っておくことは、関連するドキュメントhttps://docs.djangoproject.com/en/1.9/topics/http/middleware/#process-view

+0

ミドルウェアを作成する場合は、 'process_request'に' request.urlconf'を設定する方が良いでしょう。 'process_view'をオーバーライドするのではなく、 – Alasdair

+0

ミドルウェアのリクエストの書き換えに問題があったようですが、このようにすることも可能でしょう –

関連する問題