在Django Url Dispatcher中获取http请求数据?这可能吗?如果是这样,怎么样?

时间:2013-12-20 16:06:26

标签: python django httprequest django-urls django-authentication

我想基于http请求的内容有条件地在我的django应用程序中路由URL,类似于:

if request.user.is_authenticated() and request.user.is_staff():
       #provide a specific set of urls
elif request.user.is_authenticated():
       #provide alternative urls
else
       #provide default urls

我想在我的应用程序内部的url调度程序中执行此操作,因为如果用户未登录,我希望某些URL对用户完全不可用。我觉得这样做会比指向更干净视图以确定渲染的内容。有没有人这样做过?这在Django中甚至可能吗?感谢

2 个答案:

答案 0 :(得分:3)

这是不可能的。每次请求进入时都不会读取urls文件。它会在您处理请求之前启动django实例时运行。

user995394提出的建议将是我处理它的方式。

如果您确实想要这样做,请深入挖掘一下。您可以指定请求中间件。

class FooMiddleware(object):
    def process_request(self, request):
        if request.user.is_authenticated():
            request.urlconf = 'myproject.authed_urls2'

我在django项目中测试了上述中间件。当我登录时,为该请求处理备用文件,而在另一个窗口中,未经过身份验证的用户仍在使用原始URL配置。

尽管如此,我建议您在视图中使用装饰器。如果您关注人们发现只有员工应该知道的网址,您可以让您的身份验证所需的装饰者回复NotFound而不是NotAuthorized

答案 1 :(得分:1)

这可能是使用自定义中间件(在process_request部分中)或通过猴子patching core.handlers.BaseHandler.get_response(),但实际上使用装饰器(也可以在您的urls.py文件中完成)是理智的出路。