2016-03-29 89 views
1

我正在用Django構建一個簡單的web應用程序。我的用戶被分成多個組,例如Group AGroup BDjango動態urlpatterns

我想要做的是動態更新urls.pyurlpatterns列表,這樣我可以有相同的URL端點不同的看法。

例如,我想這樣做(我知道語法是關閉的,它只是證明我想要的)

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

這不是動態更改URL模式是一個好主意,但是你可以創建兩個鏈接url confs mysite/groupA_root_urls.pymysite/groupB_root_urls.py

然後,您可以編寫一箇中間件,該中間件將request.urlconf屬性設置爲process_request方法中的'mysite.groupA_root_urls''mysite.groupA_root_urls'

然後Django將使用該urlconf而不是來自ROOT_URLCONF設置的conf。

+0

這對我來說很有用,謝謝! – intelis

3

我認爲這既不可能也不可取。你應該在視圖中放置這樣的邏輯。根據用戶的組隸屬關係,使兩個視圖處於同一視圖並重定向,或者將視圖中的不同內容放在視圖中。

+0

請採納此建議。包含每個URL,如果用戶沒有某個URL的權限,只需用HTTP 404或403響應 – kevswanberg

1

URL不會爲每個用戶動態加載,它們會在應用程序啓動時被解析和加載,因此您無法將每個請求邏輯放在那裏。一般來說,這個邏輯應該在你的看法中處理。

也就是說,您可以使用自定義中間件來模擬此行爲。創建一箇中間件類,編寫process_view()方法來檢查你的URL,如果你感興趣的話,自己查找並運行view函數並返回HttpResponse。確保你的中間件是列表中的最後一個,所以每個其他中間件都有機會在你之前運行。你要知道,這將屬於「醜陋的黑客」類別中的任何嚴重的項目:)

下面是相關文檔https://docs.djangoproject.com/en/1.9/topics/http/middleware/#process-view

+0

如果您要編寫中間件,最好將'request.urlconf'設置爲'process_request' ,而不是重寫'process_view'。 – Alasdair

+0

似乎人們在重寫中間件的請求時遇到了困難,但也可以這樣做 –