【问题标题】:Django dynamic urlpatternsDjango 动态 urlpatterns
【发布时间】:2016-07-17 14:02:04
【问题描述】:

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

我想要做的是动态更新urls.py 中的urlpatterns 列表,以便我可以在相同的 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')))

我怎样才能最好地做到这一点?

【问题讨论】:

    标签: python django


    【解决方案1】:

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

    【讨论】:

    • 请采纳这个建议。包括每个 url,如果用户没有对某个 URL 的权限,只需使用 HTTP 404 或 403 响应
    【解决方案2】:

    URL 不是为每个用户动态加载的,它们是在应用程序启动时解析和加载的,所以你不能把每个请求的逻辑放在那里。一般来说,这个逻辑应该在你的视图中处理。

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

    这里是相关文档的链接https://docs.djangoproject.com/en/1.9/topics/http/middleware/#process-view

    【讨论】:

    • 如果你要写一个中间件,最好在process_request中设置request.urlconf,而不是覆盖process_view
    • 似乎人们在中间件中重写请求时遇到了麻烦,但也可以这样做
    【解决方案3】:

    动态更改 urlpatterns 不是一个好主意,但您可以创建两个 url confs mysite/groupA_root_urls.pymysite/groupB_root_urls.py

    然后您可以编写一个中间件,将request.urlconf 属性设置为'mysite.groupA_root_urls' 'mysite.groupA_root_urls'

    然后,Django 将使用该 urlconf 代替 ROOT_URLCONF 设置中的 conf。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-27
      • 2012-04-13
      • 1970-01-01
      • 2012-09-08
      • 2013-07-16
      • 2012-01-06
      • 1970-01-01
      相关资源
      最近更新 更多