zoukankan      html  css  js  c++  java
  • REST-Framework: url路由控制

    目录

    路由控制介绍:

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

    二 半自动路由(视图类继承ModelViewSet)

    三 全自动路由(自动生成路由)


    路由控制介绍:

    • 我们之前一直接触的路由是最基本的形式, 就是我们下面介绍的第一种方式的自定义路由, 无论是FBV还是CBV, 都可以使用这用方式来设置路由来设定请求来的时候对应响应视图的函数或者视图类

    • 当我们使用封装了的视图类处理代码的时候, 我们就可以使用对应的半自动路由来对路由进行设置, 这时我们可以在路由中传入一个字典, 在字典中使用key:value的形式来设置请求对应的视图类中的处理方法, 具体的使用见下面的半自动路由配置

    • 全自动路由配置是在路由层借助了routers来生成相应的对象来自动生成路由, 全自动路由使用的较少, 还是那句话, 本身封装的程度越高, 相应的可拓展性就越差,

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

    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部分:

    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("")

    二 半自动路由(视图类继承ModelViewSet)

    • 半自动路由的使用场景是比较多的, 这里继承ModelViewSet, 实际最终还是来自于ViewSetMixin, 半自动路由正式和它配合使用的

    • 半自动路由可以在路由层传入字典, 在字典中规定对应请求在是视图类中处理方法, 这样就解决了, 两个get请求需要获取不同数据的需求, 也正式这一点, 使用半自动路由的时候, 可以在视图类中可以自己自由定制对应请求在视图类中处理方法的名字, 不用再拘束于get请求要视图类中的处理方法就必须是get这样的约束.

    from django.conf.urls import url
    
    from app01 import views
    
    urlpatterns = [
    
    url(r'^publish/$', views.PublishView.as_view({'get':'list','post':'create'})),
    
    url(r'^publish/(?P<pk>d+)/$', views.PublishView.as_view({'get':'retrieve','put':'update','delete':'destroy'})),
    
    
    
    ]

    Views部分:

    from rest_framework.viewsets import ModelViewSet
    
    class PublishView(ModelViewSet):
    
    queryset=models.Publish.objects.all()
    
    serializer_class=PublishSerializers

    三 全自动路由(自动生成路由)

    url配置:

    • 全自动路由在路由层由routers实例化出的对象辅助来完成自动化生成多个路由

    • 由routers对象先注册一个基本路由, 在配置过之后就会自动生成各种围绕基本路由的路由了

    from django.conf.urls import url,include
    
    from app01 import views
    
    from rest_framework import routers
    
    router=routers.DefaultRouter()
    
    # 两个参数,一个是匹配的路由,一个是视图中写的CBV的类
    
    router.register('publish',views.PublishView)
    
    urlpatterns = [
    
    # http://127.0.0.1:8000/publish/format=json(渲染器通过这个判断,返回渲染的页面)
    
    # url(r'^publish/', views.PublishView.as_view({'get':'list','post':'create'})),
    
    # http://127.0.0.1:8000/publish.json(渲染器通过这个判断,返回渲染的页面)
    
    # url(r'^publish.(?P<format>w+)$', views.PublishView.as_view({'get':'list','post':'create'})),
    
    
    
    # 可以用 以下方式访问
    
    # 1 http://127.0.0.1:8000/publish/
    
    # 2 http://127.0.0.1:8000/publish.json
    
    # 3 http://127.0.0.1:8000/publish/3
    
    # 4 http://127.0.0.1:8000/publish/3.json
    
    url(r'',include(router.urls))
    
    ]

    Views部分:

    from rest_framework.viewsets import ModelViewSet
    
    class PublishView(ModelViewSet):
    
    queryset=models.Publish.objects.all()
    
    serializer_class=PublishSerializers
     

     action的使用

    # 只要继承了ViewSetMixin类
    # 路由配置:path('books_mix/', views.BookView.as_view({'get':'lqz'}))
    # 视图类的方法中就会有个action
    class BookView(ViewSet):
        def lqz(self,request,*args,**kwargs):
            print(self.action)
            return Response('lqz')
        
        
    # ViewSetMixin以后只要继承它,路由的配置就发生变化了,只需要写映射即可
    View Code

     路由三种使用方式总结

    # 自动生成路由
    # SimpleRouter
    # DefaultRouter
    
    # 继承了ViewSetMixin的视图类,以后写路由,可以自动生成
    from rest_framework import routers
    # 实例化得到一个对象
    router = routers.SimpleRouter()
    # 注册进路由
    router.register('books', views.BookSetView)
    # 把自动生成的路由配置到urlpatterns中
        -urlpatterns += router.urls
        -re_path(r'v1/', include(router.urls))
        
        
        
        
    # 配置路由的方式
        -最原始的
            -path('books/', views.BookAPIView.as_view()),
        -ViewSetMixin的视图类
            -path('books_set/', views.BookSetView.as_view({'get':'list','post':'create'}))
        -ViewSetMixin的视图类
            -自动生成,上面讲的
            
            
            
            
     # action
        -当自动生成路由的时候,由于视图类中还有其它方法,是无法自动生成路由的
        -加action装饰器:
            -methods:什么请求方式会触发被装饰函数的执行
            -detail:是True是基于带id的路由生成的,如果是False,是基于不带id的路由生成的
            -@action(methods=['get'], detail=True)
    View Code
    每天逼着自己写点东西,终有一天会为自己的变化感动的。这是一个潜移默化的过程,每天坚持编编故事,自己不知不觉就会拥有故事人物的特质的。 Explicit is better than implicit.(清楚优于含糊)
  • 相关阅读:
    《P3953 [NOIP2017 提高组] 逛公园》
    《P4180 [BJWC2010]严格次小生成树》
    《济南icpc补题》
    《levil的因子和》
    《洛谷P2704 [NOI2001]炮兵阵地》
    《Codeforces Round #689 (Div. 2, based on Zed Code Competition)》
    《2174: Leapin' Lizards》
    《3820: Revenge of Fibonacci 》
    马拉车求最长回文子串
    二分训练
  • 原文地址:https://www.cnblogs.com/kylin5201314/p/13969632.html
Copyright © 2011-2022 走看看