【发布时间】:2015-06-02 18:29:24
【问题描述】:
你好!
我喜欢我正在开发的 django 应用程序,它可以基于 URL 字符串之外的逻辑将 URL 路由到响应。
我希望能够考虑应用程序的状态(登录用户及其会话,数据库的内容)。这意味着两个用户可以访问完全相同的 URL,但根据他们拥有的帐户类型(例如),他们会收到不同的响应。
一个例子
假设我的应用有 User 和 Admin 用户类。他们俩都会经常访问http://some-domain.com/dashboard,但他们会在那里看到完全不同的东西。此外,dashboard 之外还会有子 URL,例如 /dashboard/comments、/dashboard/friends。同样,根据用户类别,这些视图将完全不同。
目前我在做这样的事情:
(urls.py)
urlpatterns = [
url(r'^dashboard/', include([
url(r'^$', render_dashboard),
url(r'^settings/$', render_dashboard_settings),
url(r'^friends/$', render_dashboard_friends),
])),
]
此设置的问题是无法将当前用户考虑在内。它仍然可以工作,因为我可以将各种用户帐户路由到同一个模板,并在那里使用{% if ... %} 语句为不同的用户提供不同的内容。在对django.shortcuts.render 的调用中,我还可以使应该呈现动态的模板的名称。但这些都不是我想要的。我希望能够在 URL 映射的早期级别区分用户。
我的问题
我做想要做的是扩展url 方法的功能以考虑状态,并基于该功能进行路由。理想情况下,是这样的:
urlpatterns = [
user_class_based_url(r'', {
'Admin': include([
url(r'^dashboard/', include([
url(r'^$', render_admin_dashboard),
url(r'^settings/$', render_admin_dashboard_settings),
url(r'^friends/$', render_admin_dashboard_friends),
])),
]),
'User': include([
url(r'^dashboard/', include([
url(r'^$', render_user_dashboard),
url(r'^settings/$', render_user_dashboard_settings),
url(r'^friends/$', render_user_dashboard_friends),
])),
]),
'SomeOtherUserClass': include([.....]),
}),
]
现在,不同的渲染器函数被调用为相同的 url,但不同的用户类。不幸的是,user_class_based_url 是我完全编造出来的。理想情况下,user_class_based_url 将是我可以编写的自定义函数。这样我就可以编写其他类似的函数,以其他方式考虑应用程序的状态。
问题:我有什么办法可以得到这个功能?
回应“你甚至不应该这样设计”
我给出的示例旨在让我的问题更快得到解决。我想要我所描述的功能,因为它在很多方面对我正在构建的应用程序都非常有帮助,而且我相信它会是一种比替代方法更好的方法。
注意
我已经在使用 django rest 框架,以防可以用来实现这个设计。
【问题讨论】:
-
如果有人感兴趣,我已经用完全自定义的代码解决了这个问题,它允许我使用我所说的在这个问题中寻找的模式进行开发。如果有人愿意,我会将其发布为答案。
标签: python django url-routing