如何将URL路由到Django和DRF类的特定方法

时间:2015-09-05 23:28:20

标签: python django routing django-rest-framework pycharm

我是python世界的新手,现在我使用Rest Framework构建一个带有Django 1.8的应用程序,我想创建一个类视图来干我的代码。

例如,我想在我的系统中为学生提供班级视图

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status


class SnippetList(APIView):
    def getWorstStudents(self, request, format=None):
        # Logic here

如何在 urls.py 中指定指定的网址来点击此方法?

我还实现了 REST框架JWT Auth http://getblimp.github.io/django-rest-framework-jwt/用于令牌身份验证。

如何限制访问权限以仅允许经过身份验证的用户访问此网址?

提前谢谢!

2 个答案:

答案 0 :(得分:3)

routersviewsets一起使用。

首先,从ModelViewSet而不是APIView继承您的观点。其次,在@list_route方法中使用getWorstStudents装饰器。第三,用路由器将urls.py中的所有内容捆绑在一起。

应该看起来像(我还没有测试过代码):

views.py

class StudentsViewSet(viewsets.ViewSet):
    @list_route(methods=['get'], permission_classes=(IsAuthenticated,))  # you can define who can access this view here
    def getWorstStudents(self, request, format=None):
        # Logic here

# routers.py
router = routers.DefaultRouter()
router.register(r'students', views.StudentsViewSet, base_name='student')

# urls.py
import .routers import router
urlpatterns = [
    url(r'^', include(router.urls)),
]

路由器将生成一个名为student-getWorstStudents的视图,该视图可从students/getWorstStudents网址访问。

答案 1 :(得分:1)

您可以像任何其他Django应用documented here

一样设置网址
# urls.py
from django.conf.urls import url
from somewhere import SnippetList

urlpatterns = [
    url(r'^your/url/$', SnippetList.as_view()),
]

关于使用您的方法的DRY,您可以定义要响应的方法,并调用getWorstStudents(顺便说一下,我称之为get_worst_students)。我们假设您要回复post方法:

# views.py

from rest_framework.response import Response

def getWorstStudents(params)

class SnippetList(APIView):
    def post(self, request, *args, **kwargs):
        # call getWorstStudents method here and response a Response Object

您可以在getWorstStudents类或其他文件中定义SnippetList,以便在需要的地方导入。

最后,关于身份验证,DRF为此提供了类documented here

从文档中,您需要在settings.py文件中定义:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    )
}

在你的观点中使用它:

from rest_framework.authentication import SessionAuthentication, BasicAuthentication
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView

class ExampleView(APIView):
    authentication_classes = (SessionAuthentication, BasicAuthentication)
    permission_classes = (IsAuthenticated,)

    def get(self, request, format=None):
        content = {
            'user': unicode(request.user),  # `django.contrib.auth.User` instance.
            'auth': unicode(request.auth),  # None
        }
        return Response(content)

您还可以定义自己的身份验证类,并在authentication_classes元组中进行设置。 Custom authentication classes documented here.