2

Python アプリで Django Rest Framework を使用しており、API 認証に JSON Web Token Authentication (DRF JWT) を使用しています。

私の問題は、カスタムコントローラーを構築しているときに発生します。calculations.py作成したファイル内の関数に特定の URL を指定しました。以下は、それらがどのように見えるかです。

urls.py

from django.conf.urls import patterns, include, url
from django.contrib import admin
from rest_framework import routers 
from app.serializers import xxxViewSet, yyyViewSet
from app.calculations import getReturns

router  = routers.DefaultRouter()
router.register(r"xxx", xxxViewSet)
router.register(r"yyy", yyyViewSet)

urlpatterns = patterns('',
url(r'^admin/', include(admin.site.urls)),
url(r'^api/auth/token/$', 'rest_framework_jwt.views.obtain_jwt_token'),
url(r'^api/auth/', include('rest_framework.urls', namespace='rest_framework')),
url(r'^api-token-verify/', 'rest_framework_jwt.views.verify_jwt_token'),
url(r'^api/', include(router.urls)),
**url(r'^getReturns/', getReturns),**
)

calculations.py

from django.http import HttpResponse
from .models import xxx, yyy, zzz, aaa

def getReturns(request):
    data = request.GET('data')

    **running calculations here on data and giving out response**

    return HttpResponse(response)

serializers.py

from rest_framework.authentication import SessionAuthentication, BasicAuthentication
from rest_framework import routers, serializers, viewsets, permissions
from rest_framework_jwt.authentication import JSONWebTokenAuthentication
from .models import xxx, yyy, zzz, aaa

class xxxSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = xxx
        fields = ('id', 'name')

class xxxViewSet(viewsets.ModelViewSet):
    authentication_classes = [SessionAuthentication, BasicAuthentication, JSONWebTokenAuthentication]
    permission_classes = [permissions.IsAuthenticated, permissions.IsAdminUser]
    queryset = xxx.objects.all()
    serializer_class = xxxSerializer

上記のserializers.pyファイルには、すべてのモデルのシリアライザー クラスと、同じモデルのビューセットが含まれています。ビューセットを にまだ転送していないviews.pyため、ファイルは今のところ空です。

いずれにせよ、mycalculations.pyはこれらのファイルとは別のものであり、このファイルで定義されている関数は、ビューを介さずに「/getReturns/」URL によって直接呼び出されています。関数が実行される前に承認クラスが呼び出されるように、計算ファイルで定義された関数をビューセットに組み込むにはどうすればよいですか?

4

1 に答える 1

4

コメントでこれを始めましたが、長すぎました。一般に、適切に支援するのに十分なコードを実際に提供していませんが、とにかくここに私のクラックがあります. 使用している Django JWT のバージョン/実装 (いくつかあります)、ビューを承認する方法、またはcalculation.py ファイルがビューであるか他のものであるかは明らかではありません。(それ以外の場合は、ビューで承認し、そこから呼び出します。)

POST を送信できないのはなぜですか? 一般に、フロントエンドでトークンを取得したら、承認が必要な関数で 使用from rest_framework.decorators import authentication_classesしてラッパーを使用できます。@authentication_classes([JSONWebTokenAuthentication,])

それは次のようになります。

@authentication_classes([JSONWebTokenAuthentication,])
def function_here(arguments):
    #function does stuff 

どのように Web トークンをアプリケーションに渡していますか?

おそらくCURLでは、トークンを取得するための最初の認証は次のようになります。 curl -X POST -d "username=admin&password=abc123 その後、( を使用している場合rest_framework_jwt)トークン を取得します{JWTAuthorization: YourTokenHere}

その後、DRFで保護されたページに戻すには(上記のようにラップされているか、同様の保護があると仮定します)-承認方法を概説していません-次に、ドキュメントからcurl -H "Authorization: JWT <your_token>" http://localhost:8000/protected-url/

Angular などで呼び出しを生成している場合も同じです。ヘッダーで渡す必要があります。

編集:元の回答以降、ここでコードの量が大幅に増加したことにも注意してください。ただし、基本的には、宣言している認証クラスを確認する必要があります。最も簡単な方法は、上で指定したとおりです。

于 2015-06-12T07:40:30.773 に答える