2017-10-20 76 views
0

我有点困惑。我想检查网站的当前网址是否位于我的urlpatters的特定子集中。 Django的哪个功能可以做到这一点?这是一个中间件,在移动到我的网站的特定部分之前请求其他信息。如何检查urlpatterns列表中的当前网址?

class AuthorityMiddleware(object): 
    def process_request(self, request): 
     current_url = request.path_info 
     if not request.user.is_anonymous() and current_url not in exclude_list: 
      if not request.session.get('authority'): 
       return get_the_authority(request) 

应该如何排除列表中涉及到urls.py中定义的URL模式?

+1

的['resolve'](https://docs.djangoproject.com/en/1.11/ref/urlresolvers/#resolve)方法采用一个URL路径并返回相应的视图,但目前还不清楚是否那就是你想要的。如果您提供了一些您想要排除的视图和网址格式的示例,那么您的问题就会更清晰。您确定要在中间件中进行此检查,而不是限制视图的装饰器吗? – Alasdair

+0

我检查了解决方案,但我只想要在我的urlpattern中定义的一部分url,例如特定的应用程序,这是公开的,以及其他需要额外登录的应用程序。你是对的装饰。我一直在想错误的事情。早在我创建上述代码的时候,我一直认为中间件是唯一可以在显示视图之前将其重定向到另一个页面的地方。但事实并非如此。我能够用适当的装饰器解决我的问题。谢谢。 – Claude

+0

我的排除列表有一个反向函数和url的列表,但它们会失败,需要更多参数的url,如标记化函数和需要密钥(密码重置等)的函数。 – Claude

回答

0

好吧,我的问题基本上是坏设计的结果。如果我使用装饰器来请求需要它的视图的权限,那么整个问题都可以解决。当我写上面的代码时,我一直认为中间件是在显示视图之前重定向和调用更多功能的唯一地方,但事实上,它们可以很好地将功能应用于所有视图。如果函数仅适用于视图的子集,修饰器会更好。

from django.core.urlresolvers import reverse, resolve 
from django.http import HttpResponseRedirect 


def project_required(func): 
    def decorated(request, *args, **kwargs): 
     if not request.session.get('authority'): 
      request.session['previous_url'] = resolve(request.path_info).url_name 
      return HttpResponseRedirect(reverse('project_login')) 
     return func(request, *args, **kwargs) 
    return decorated