我想基于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中甚至可能吗?感谢
答案 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文件中完成)是理智的出路。