Django动态urlpatterns

时间:2016-03-29 20:02:00

标签: python django

我正在使用Django构建一个简单的Web应用程序。我的用户分为多个组,例如Group AGroup B

我想要做的是动态更新urlpatterns中的urls.py列表,以便我可以在相同的网址端点上拥有不同的视图

例如,我想做这样的事情(我知道语法已关闭,只是为了展示我想要的东西)

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')))

我最好如何做到这一点?

3 个答案:

答案 0 :(得分:3)

我认为这既不可能也不可取。您应该在视图中放置这样的逻辑。根据用户的组从属关系,将两个土地放在同一视图中并重定向或简单地将不同内容放在视图中。

答案 1 :(得分:1)

不会为每个用户动态加载URL,它们会在应用程序启动时进行解析和加载,因此您无法将每个请求逻辑放在那里。通常,应该在您的视图中处理此逻辑。

也就是说,您可以使用自定义中间件模拟此行为。创建一个中间件类,编写process_view()方法来检查你的URL,如果你感兴趣的话,自己查找并运行视图函数并返回HttpResponse。确保您的中间件是列表中的最后一个,因此每个其他中间件都有机会在您的中间件之前运行。请注意,这将属于"丑陋的黑客"任何严肃项目中的类别:)

以下是相关文档https://docs.djangoproject.com/en/1.9/topics/http/middleware/#process-view

的链接

答案 2 :(得分:1)

动态更改urlpatterns不是一个好主意,但您可以创建两个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。