2017-10-20 4 views
0

私は少し困惑しています。私は、ウェブサイトの現在のURLが私のurlpattersの特定のサブセットにあるかどうか確認したい。 djangoのどの機能がこれを行うでしょうか?これは、私のウェブサイトの特定の部分に移動する前に追加情報を要求するミドルウェアのためのものです。urlpatternsのリストに現在のURLがあるかどうかをチェックする方法は?

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パスを取り、対応するビューを返し、それはかどうかは明らかではありませんそれがあなたが望むものです。除外するビューとURLパターンの例をいくつか挙げておけば、あなたの質問はより明確になります。制限付きビューのデコレータではなく、ミドルウェアでこのチェックをしてもよろしいですか? – Alasdair

+0

解決方法を確認しましたが、私のurlパターンに定義されている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 
関連する問題