2

我在我的 Python 应用程序中使用 Django Rest Framework,并使用 JSON Web 令牌身份验证 (DRF JWT) 进行 api 身份验证。

当我构建自定义控制器时,我的问题就出现了。我将一个特定的 URL 指向了calculations.py我创建的文件中的一个函数。以下是它们的外观。

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(有一些)、您如何授权您的视图,或者您的计算文件是视图还是其他东西,都不是很明显。(如果是别的东西,我会在视图中授权,并从那里调用它。)

为什么无法发送 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 回答