我在我的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
,因此该文件暂时为空。
无论如何,我的calculations.py
与这些文件是分开的,并且此文件中定义的函数直接由'/ getReturns /'URL调用,而不通过视图。如何将计算文件中定义的函数合并到视图集中,以便在函数执行之前调用我的授权类?
答案 0 :(得分:4)
我开始在评论中这样做,这太长了。一般来说,你还没有真正提供足够的代码来提供正确的帮助,但无论如何这里都是我的破解。您使用的Django JWT的版本/实现(有一些),您如何授权您的视图,或者您的calculate.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保护的页面(假设它们已被包裹,如上所述,或具有类似的保护) - 您还没有概述您的授权方式 - {{3 }}:
curl -H "Authorization: JWT <your_token>" http://localhost:8000/protected-url/
如果您以Angular或类似方式生成呼叫,那么它也是相同的 - 您需要在标头中传递它。
编辑:我还注意到,自从我的原始答案以来,您已大幅增加了此处的代码数量。从根本上说,你需要检查你宣布的auth课程;最简单的方法如上所述。