2017-10-20 80 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