• restframework流程


    1 CBV

    2 APIView
    class BookView(APIView):pass
    url(r'^books/$', views.BookView.as_view(),name="books"),
    url(r'^books/$', View类下的view,name="books"),
    一旦访问books/: view(request)======APIView类下的dispatch()====请求方式对应的示例方法()

    3 def dispatch():
    #一 初始化操作
    # (1) 构建新的request:
    self.request=self.initial_request()
    # self.request._request
    # self.request.GET
    # self.request.data
    # (2) 执行组件
    # 认证,权限,频率
    # 认证:request.user
    self.initial(request, *args, **kwargs)
    ==== # 认证组件
    self.perform_authentication(request)
    ==== request.user
    =====
    for authenticator in self.authenticators: # [TokenAuth(),]
    try:
    user_auth_tuple = authenticator.authenticate(self)
    except exceptions.APIException:
    self._not_authenticated()
    raise

    if user_auth_tuple is not None:
    self._authenticator = authenticator
    self.user, self.auth = user_auth_tuple
    return


    # 权限组件
    self.check_permissions(request)
    ===========
    for permission in self.get_permissions():
    if not permission.has_permission(request, self):
    self.permission_denied(
    request, message=getattr(permission, 'message', None)
    )


    # 频率组件
    self.check_throttles(request)

    =============
    for throttle in self.get_throttles(): # [VisitRateThrottle(),]
    if not throttle.allow_request(request, self):
    self.throttled(request, throttle.wait()) # 受限制


    # 分发
    if request.method.lower() in self.http_method_names:
    handler = getattr(self,request.method.lower(),
    self.http_method_not_allowed)

    response = handler(request, *args, **kwargs)

    return response


    4 序列化组件

    class PublishSerializers(serializers.Serializer):
    name = serializers.CharField()
    email = serializers.CharField()

    class PublishModelSerializers(serializers.ModelSerializer):
    class Meta:
    model=Publish
    fields="__all__"

    # queryset或者model对象-------------》json数据
    ps=PublishSerializers(queryset,many=True)
    ps.data # [{},{},{}]

    ps=PublishSerializers(model_obj,many=False)
    ps.data # {}


    # json数据-------》记录
    # 添加操作
    ps=PublishSerializers(data=request.data)
    if ps.is_valid():
    ps.save() # create

    # 更新操作

    ps=PublishSerializers(model_obj,data=request.data)
    if ps.is_valid():
    ps.save() # update


    5 视图组件
    # 版本1:
    # Book表
    class BookView(APIView):

    def get(self,request):
    book_list=Book.objects.all()
    bs=BookModelSerializers(book_list,many=True,context={'request': request})
    return Response(bs.data)
    def post(self,request):
    # post请求的数据
    bs=BookModelSerializers(data=request.data)
    if bs.is_valid():
    print(bs.validated_data)
    bs.save()# create方法
    return Response(bs.data)
    else:
    return Response(bs.errors)


    class BookDetailView(APIView):

    def get(self,request,id):

    book=Book.objects.filter(pk=id).first()
    bs=BookModelSerializers(book,context={'request': request})
    return Response(bs.data)

    def put(self,request,id):
    book=Book.objects.filter(pk=id).first()
    bs=BookModelSerializers(book,data=request.data)
    if bs.is_valid():
    bs.save()
    return Response(bs.data)
    else:
    return Response(bs.errors)

    def delete(self,request,id):
    Book.objects.filter(pk=id).delete()

    return Response()

    # 版本2:mixIn

    from rest_framework import mixins
    from rest_framework import generics

    class AuthorView(mixins.ListModelMixin,mixins.CreateModelMixin,generics.GenericAPIView):
    queryset=Author.objects.all()
    serializer_class =AuthorModelSerializers

    def get(self,request, *args, **kwargs):
    return self.list(request, *args, **kwargs)
    def post(self,request, *args, **kwargs):
    return self.create(request, *args, **kwargs)


    class AuthorDetailView(mixins.RetrieveModelMixin,mixins.DestroyModelMixin,mixins.UpdateModelMixin,generics.GenericAPIView):
    queryset = Author.objects.all()
    serializer_class = AuthorModelSerializers

    def get(self,request,*args, **kwargs):
    return self.retrieve(request,*args, **kwargs)

    def delete(self,request,*args, **kwargs):
    return self.destroy(request,*args, **kwargs)

    def put(self,request,*args, **kwargs):
    return self.retrieve(request,*args, **kwargs)


    # 版本3:基于通用类
    from rest_framework import mixins
    from rest_framework import generics


    class AuthorView(generics.ListCreateAPIView):
    queryset=Author.objects.all()
    serializer_class =AuthorModelSerializers

    class AuthorDetailView(generics.RetrieveUpdateDestroyAPIView):
    queryset = Author.objects.all()
    serializer_class = AuthorModelSerializers

    # 版本4
    class AuthorModelView(viewsets.ModelViewSet):
    queryset = Author.objects.all()
    serializer_class = AuthorModelSerializers

    url(r'^authors/$', views.AuthorModelView.as_view({"get":"list","post":"create"}),name="author"),
    url(r'^authors/(?P<pk>d+)/$', views.AuthorModelView.as_view({"get":"retrieve","put"

    流程:
    url(r'^authors/$', views.AuthorModelView.as_view({"get":"list","post":"create"}),name="author"),
    url(r'^authors/$', ViewSetMixin.as_view({"get":"list","post":"create"}),name="author"),
    url(r'^authors/$', ViewSetMixin类下的view),
    一旦访问 /authors/:
    ViewSetMixin
    def view():
    for method, action in actions.items(): # {"get":"list","post":"create"}
    handler = getattr(self, action) # self.list self.create
    setattr(self, method, handler)

    self.dispatch(request, *args, **kwargs)

    APIView类下的self.dispatch
    # 分发
    if request.method.lower() in self.http_method_names:
    handler = getattr(self,request.method.lower(),
    self.http_method_not_allowed)

    response = handler(request, *args, **kwargs) # self.list()

    return response


    6 认证权限频率 组件

    request.META:
    {'ALLUSERSPROFILE': 'C:\ProgramData',
    'APPDATA': 'C:\Users\Administrator\AppData\Roaming',
    'COMMONPROGRAMFILES': 'C:\Program Files\Common Files',
    'COMMONPROGRAMFILES(X86)': 'C:\Program Files (x86)\Common Files',
    'COMMONPROGRAMW6432': 'C:\Program Files\Common Files',
    'COMPUTERNAME': 'PC201712041709',
    'COMSPEC': 'C:\Windows\system32\cmd.exe',
    'DJANGO_SETTINGS_MODULE': 'restdemo.settings',
    'FP_NO_HOST_CHECK': 'NO', 'HOMEDRIVE': 'C:',
    'HOMEPATH': '\Users\Administrator',
    'LOCALAPPDATA': 'C:\Users\Administrator\AppData\Local',
    'LOGONSERVER': '\\PC201712041709',
    'NUMBER_OF_PROCESSORS': '4', 'OS': 'Windows_NT',
    'PATH': 'C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Users\Administrator\AppData\Local\Programs\Python\Python36;C:\Users\Administrator\AppData\Local\Programs\Python\Python36\Scripts;C:\Python27;E:\MySQL Server 5.6\bin;C:\Users\Administrator\AppData\Local\Programs\Python\Python36\Scripts\;C:\Users\Administrator\AppData\Local\Programs\Python\Python36\;C:\Users\Administrator\AppData\Local\atom\bin',
    'PATHEXT': '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC',
    'PROCESSOR_ARCHITECTURE': 'AMD64',
    'PROCESSOR_IDENTIFIER': 'Intel64 Family 6 Model 60 Stepping 3, GenuineIntel',
    'PROCESSOR_LEVEL': '6', 'PROCESSOR_REVISION': '3c03',
    'PROGRAMDATA': 'C:\ProgramData',
    'PROGRAMFILES': 'C:\Program Files',
    'PROGRAMFILES(X86)': 'C:\Program Files (x86)',
    'PROGRAMW6432': 'C:\Program Files',
    'PSMODULEPATH': 'C:\Windows\system32\WindowsPowerShell\v1.0\Modules\',
    'PUBLIC': 'C:\Users\Public', 'PYCHARM_HOSTED': '1', 'PYTHONIOENCODING': 'UTF-8',
    'PYTHONPATH': 'C:\Users\Administrator\PycharmProjects\s9\restdemo', 'PYTHONUNBUFFERED': '1',
    'SESSIONNAME': 'Console', 'SYSTEMDRIVE': 'C:', 'SYSTEMROOT': 'C:\Windows',
    'TEMP': 'C:\Users\ADMINI~1\AppData\Local\Temp', 'TMP': 'C:\Users\ADMINI~1\AppData\Local\Temp',
    'USERDOMAIN': 'PC201712041709',
    'USERNAME': 'Administrator',
    'USERPROFILE': 'C:\Users\Administrator',
    'WINDIR': 'C:\Windows', 'WINDOWS_TRACING_FLAGS': '3',
    'WINDOWS_TRACING_LOGFILE': 'C:\BVTBin\Tests\installpackage\csilogfile.log',
    'RUN_MAIN': 'true', 'SERVER_NAME': 'PC201712041709',
    'GATEWAY_INTERFACE': 'CGI/1.1', 'SERVER_PORT': '8000',
    'REMOTE_HOST': '',
    'CONTENT_LENGTH': '',
    'SCRIPT_NAME': '',
    'SERVER_PROTOCOL': 'HTTP/1.1',
    'SERVER_SOFTWARE': 'WSGIServer/0.2',
    'REQUEST_METHOD': 'GET',
    'PATH_INFO': '/authors/',
    'QUERY_STRING': 'token=8204b8e3ac40bf59ae480d17c146b51a',
    'REMOTE_ADDR': '127.0.0.1',
    'CONTENT_TYPE': 'text/plain',
    'HTTP_HOST': '127.0.0.1:8000',
    'HTTP_CONNECTION': 'keep-alive',
    'HTTP_USER_AGENT': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
    'HTTP_UPGRADE_INSECURE_REQUESTS': '1',
    'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
    'HTTP_ACCEPT_ENCODING': 'gzip, deflate, br', 'HTTP_ACCEPT_LANGUAGE': 'zh-CN,zh;q=0.9', 'HTTP_COOKIE': 'csrftoken=jtus3l4GJEc9TFXWYCWxkBIZprcOv7C1vFMIyOHs7Zkxt015FwVZ2KEEeDV6LOyN', 'wsgi.input': <_io.BufferedReader name=832>, 'wsgi.errors': <_io.TextIOWrapper name='<stderr>' mode='w' encoding='UTF-8'>, 'wsgi.version': (1, 0), 'wsgi.run_once': False, 'wsgi.url_scheme': 'http', 'wsgi.multithread': True, 'wsgi.multiprocess': False, 'wsgi.file_wrapper': <class 'wsgiref.util.FileWrapper'>}

    7 解析器-----数据解析器
    from rest_framework.parsers import JSONParser,FormParser,MultiPartParser,FileUploadParser
    parser_classes = [JSONParser,FormParser]

    8 路由控制
    针对:
    url(r'^authors/$', views.AuthorModelView.as_view({"get":"list","post":"create"}),name="author"),
    url(r'^authors/(?P<pk>d+)/$', views.AuthorModelView.as_view({"get":"retrieve","put":"update","delete":"destroy"}),name="detailauthor"),


    class AuthorModelView(viewsets.ModelViewSet):

    queryset = Author.objects.all()
    serializer_class = AuthorModelSerializers



    url(r'^books/$', views.BookModelView.as_view({"get":"list","post":"create"}),name="author"),
    url(r'^books/(?P<pk>d+)/$', views.BookModelView.as_view({"get":"retrieve","put":"update","delete":"destroy"}),name="detailbook"),



    class AuthorModelView(viewsets.ModelViewSet):

    queryset = Author.objects.all()
    serializer_class = AuthorModelSerializers


    9 分页

    10 响应器 Response


  • 相关阅读:
    hdu1848(sg函数打表)
    hdu1850(nim博弈)
    hdu1847(sg函数&yy)
    hdu2147(yy)
    poj2133(sg函数)
    Educational Codeforces Round 18D(完全二叉树中序遍历&lowbit)
    atcoder057D(组合数模板)
    euler证明
    04_过滤器Filter_04_Filter生命周期
    04_过滤器Filter_03_多个Filter的执行顺序
  • 原文地址:https://www.cnblogs.com/louzi/p/9644992.html
Copyright © 2020-2023  润新知