3

Django -tokenapiを使用して、Django をバックエンドとして使用している Android プロジェクトの認証を許可しています。プロジェクトには Web インターフェイスもあります。

django-tokenapi は@token_requiredデコレータを使用して特定のビューを保護します。Django は@login_requiredデコレータを使用して特定のビューを保護します。

私が望むのは、@login_requiredORで保護されたビューを 1 つだけ持つ@token_requiredことで、webapp または Android アプリのいずれかで使用できるようにすることです。

したがって、理想的には、次のようになります。

@token_required
@login_required
def names_update(request):
    ....
    ....

しかし、それはうまくいきません。これを行うより良い方法はありますか?または、webapp と Android 用の 2 つのビューを用意して、適切なデコレータで保護し、同じメソッドに導くのは正しいことです。

4

3 に答える 3

1

新しいビュー変数を古いビューに割り当ててみることができます:

@token_required
def names_update_token(request):
    ...

@login_required
names_update_login = names_update_token

これにより、names_update_login という名前の 2 番目のビューが作成されます。これは、最初のビューへの単なるポインターであるため、コードは同じままです。

編集:

別の考え、そして私が使用したものは、より「一般的な」ビューを作成し、他の各ビューから呼び出すことです。

def update_token(request):
    ...

@token_required
def names_update_token(request):
    update_token(request)

@login_required
def names_update_login(request):
    update_token(request)

これにより、ビューを実装する実際のコードの単一のコピーのみを維持しながら、言及した問題を回避できます。

于 2012-10-31T08:41:13.580 に答える
1

いいえ、可能であれば、OR説明に従って一般化されたデコレータを作成する簡単な方法はありません。

ただし、まさに必要なことを行う新しいデコレータを作成できます。

from functools import wraps
from django.contrib.auth import authenticate, login
from django.views.decorators.csrf import csrf_exempt

def token_or_login_required(view_func):
    """
    Decorator which ensures the user is either logged in or
    has provided a correct user and token pair.
    """

    @csrf_exempt
    @wraps(view_func)
    def _wrapped_view(request, *args, **kwargs):
        user = request.REQUEST.get('user')
        if user and user.is_authenticated:
            return view_func(request, *args, **kwargs)

        token = request.REQUEST.get('token')

        if user and token:
            user = authenticate(pk=user, token=token)
            if user:
                login(request, user)
                return view_func(request, *args, **kwargs)
        return HttpResponseForbidden()
    return _wrapped_view

token_requiredこの Decorator はとデコレーターの両方を組み合わせlogin_required、ユーザーがログインしているか、トークンが有効な場合にビューへのアクセスを許可します。

于 2012-10-31T09:40:46.797 に答える
0

1つのビューで複数のデコレータを使用することができます。ただし、この場合は、ビューを分離し、デコレータを個別に適用する必要があると思います。それ以外の場合token_required、デコレータは、ブラウザを使用して行われたリクエストでは使用できないトークンを使用して認証を試みます。

于 2012-10-31T08:24:46.373 に答える