url控制器与响应器

url控制器与响应器

一、自定义路由(原始方式)

urls.py

from django.conf.urls import url
from app01 import views
urlpatterns = [
    url(r'^books/$', views.BookView.as_view()),
    url(r'^books/(?P<pk>d+)$', views.BookDetailView.as_view()),
]

views.py

class BookView(APIView):

    def get(self, request):
        book_list = models.Book.objects.all()
        bs = BookSerializers(book_list, many=True)
        return Response(bs.data)

    def post(self, request):
        # 添加一条数据
        print(request.data)

        bs=BookSerializers(data=request.data)
        if bs.is_valid():
            bs.save()  # 生成记录
            return Response(bs.data)
        else:

            return Response(bs.errors)

class BookDetailView(APIView):
    def get(self,request,pk):
        book_obj=models.Book.objects.filter(pk=pk).first()
        bs=BookSerializers(book_obj,many=False)
        return Response(bs.data)
    def put(self,request,pk):
        book_obj = models.Book.objects.filter(pk=pk).first()

        bs=BookSerializers(data=request.data,instance=book_obj)
        if bs.is_valid():
            bs.save() # update
            return Response(bs.data)
        else:
            return Response(bs.errors)
    def delete(self,request,pk):
        models.Book.objects.filter(pk=pk).delete()

        return Response("")

二、视图类继承(ViewSetMixin)

ModelViewSet(....,GenericViewSet)>GenericViewSet(ViewSetMixin, generics.GenericAPIView)

ViewSetMixin类内重写as_view 必须传入actions

所以路由中必须传入 请求方式与视图中方法的映射关系如下所示:

urls.py

from django.conf.urls import url
from django.contrib import admin
from app01 import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),

    url(r'^books/$', views.BookView.as_view({'get': 'list', 'post': 'create'})),
    url(r'^books/(?P<pk>d+)',
        views.BookView.as_view({'get': 'retrieve', 'post': 'update', 'delete': 'destroy'})),
    url(r'^publish/', views.PublishView.as_view({'get': 'list', 'post': 'create'})),
    url(r'^author/', views.AuthorView.as_view({'get': 'list', 'post': 'create'})),
    url(r'^Text/', views.Text.as_view({'get': 'test1'})),
]

三、自动生成路由

urls.py

from rest_framework.routers import SimpleRouter,DefaultRouter
from django.conf.urls import url,include
from django.contrib import admin
from app01 import views
from rest_framework.routers import SimpleRouter,DefaultRouter

#SimpleRouter 自动生成两条路由
#DefaultRouter自动生成四条路由
#router=SimpleRouter()
router=DefaultRouter()
router.register('publish',views.PublishView)

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'', include(router.urls)),
    # DefaultRouter实例化的可以用 以下方式访问
    # 1 http://。。。/publish/
    # 2 http://。。。/publish.json
    # 3 http://。。。/publish/3
    # 4 http://。。。/publish/3.json  
]

register(prefix, viewset, base_name)

  • prefix 该视图集的路由前缀

  • viewset 视图集

  • base_name 路由名称的前缀

SimpleRouter

router = routers.SimpleRouter() # 生成两条路由

^books/$    name: book-list

^books/{pk}/$   name: book-detail

DefaultRouter与SimpleRouter的区别是,DefaultRouter会多附带一个默认的API根视图,返回一个包含所有列表视图的超链接响应数据。

另外的链接和行为

任何被@detail_route 或者 @list_route装饰的函数都会被设置url路径:

# 自定义的权限管理类
from myapp.permissions import IsAdminOrIsSelf
from rest_framework.decorators import detail_route

class UserViewSet(ModelViewSet):
    ...

    @detail_route(methods=['post'], permission_classes=[IsAdminOrIsSelf])
    def set_password(self, request, pk=None):

生成的路由地址为:

URL pattern: ^users/{pk}/set_password/$ Name: 'user-set-password'

视图集中包含附加action的

class BookInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer
    
@action(methods=['get'], detail=False)
def latest(self, request):
    ...
 
@action(methods=['put'], detail=True)
def read(self, request, pk):
    ...

此视图集会形成的路由:

^books/latest/$    name: book-latest
^books/{pk}/read/$  name: book-read

二、响应器(一般不用配置)

# 1.局部配置
 在视图类中配置:
    renderer_classes=[JSONRenderer,BrowsableAPIRenderer]
    
# 2.全局配置
 在setting中:
    REST_FRAMEWORK = {
        'DEFAULT_RENDERER_CLASSES':['rest_framework.renderers.JSONRenderer']
    }
原文地址:https://www.cnblogs.com/9527mwz/p/11200595.html