Django基于状态的URL路由

时间:2015-06-02 18:29:25

标签: python django url-routing

您好!

我很乐意为我开发的django应用程序将URL路由到基于超出URL字符串的逻辑的响应。

我希望能够考虑应用程序的状态(登录用户及其会话,数据库的内容)。这意味着两个用户可以访问完全相同的URL,但根据他们拥有的帐户类型(例如),他们会收到不同的回复。

示例

说我的应用有UserAdmin个用户类。他们都经常访问http://some-domain.com/dashboard,但他们会在那里看到完全不同的东西。此外,还有dashboard之后的子网址,例如/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框架,以防可以用来实现这个设计。

2 个答案:

答案 0 :(得分:1)

如果您想为同一网址格式使用不同的模板,请不要在urls.py中对模板进行硬编码。相反,路由到views.py中的view function(或者class-based view),根据您的条件调度到不同的模板。这正是views.py的用途以及通常如何使用。

有关如何将URL路由到视图功能,最好咨询Django tutorial part 3。 (如果您正在学习Django,您可能希望在第1部分start。)

在教程中引入render快捷方式时调整the example,调度到不同模板的视图可能如下所示:

from django.shortcuts import render

from .models import Question


def index(request):
    if request.user.is_admin():
        return render(request, 'polls/admin-index.html', {})
    else:
        latest_question_list = Question.objects.order_by('-pub_date')[:5]
        context = {'latest_question_list': latest_question_list}
        return render(request, 'polls/index.html', context)

答案 1 :(得分:0)

目前在Django中没有办法做到这一点。最近,关于为url调度程序创建新API有this discussion,但任何更改都将在Django的未来版本中进行。