• 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']
        }
    
  • 相关阅读:
    管理~资源组织运作
    科学与艺术区别
    概念思维
    拨开文字表象,关注背后事实
    论信息部门与业务部门的关系
    再论信息系统
    linux命令行快捷键记录
    hadoop,帮我解了部分惑的文章
    hadoop运行测试命令遇到的问题
    日志分析及几个小技巧
  • 原文地址:https://www.cnblogs.com/9527mwz/p/11200595.html
Copyright © 2020-2023  润新知