• Djangorestfromwork作业1


    作业

    简单过过请求模块的源码流程,建立一个视图类,完成一项渲染模块与解析模块的全局局部配置

    url配置

    urlpatterns = [
    
        url(r'^v2/cars/$',views.CarAPIView.as_view()),
        url(r'^v2/cars/(?P<pk>d+)/$',views.CarAPIView.as_view()),
    
    ]
    

    settings配置

    REST_FRAMEWORK = {
        # 解析模块:
        'DEFAULT_PARSER_CLASSES': [
            'rest_framework.parsers.JSONParser',
            'rest_framework.parsers.FormParser',    # urlencoded数据格式
            'rest_framework.parsers.MultiPartParser'    # form-data数据格式
        ],
        # 如果把 其中某一个参数注释掉之后,则会出现客户端发过来的参数解析不了
    # {
    #     "detail": "<api.views.CarAPIView object at 0x000000000BC29E48> - GET - 不支持请求中的媒体类型 “application/json”。"
    # }
    
        # 渲染模块
        'DEFAULT_RENDERER_CLASSES': [
            'rest_framework.renderers.JSONRenderer',
            'rest_framework.renderers.BrowsableAPIRenderer',  # 项目真正上线的时候会把它注释掉,因为浏览器访问接口是一个页面
        ],
        # 异常模块处理
        # 'EXCEPTION_HANDLER': 'rest_framework.views.exception_handler',    django中提供的
        'EXCEPTION_HANDLER': 'api.exception.exception_handler',
    }
    

    异常处理模块

    # 一定要在settings文件中将异常模块配置自己的异常处理函数
    from rest_framework.views import exception_handler as drf_exception_handler
    from rest_framework.response import Response
    
    def exception_handler(exc, context):
        response = drf_exception_handler(exc, context)
        detail = '%s - %s - %s' % (context.get('view'), context.get('request').method, exc)
        if not response:  # 服务端错误
            response =  Response({'detail': detail})
        else:
            response.data = {'detail': detail}
    
        # 核心:线上要将response.data.get('detail')信息记录到日志文件
        # logger.waring(response.data.get('detail'))
    
        return response
    

    视图层views配置

    from rest_framework.views import APIView
    from rest_framework.response import Response
    
    class CarAPIView(APIView):
        def get(self,request,*args,**kwargs):
            print(request.method)
            print(request._request.method)
            return Response(data={"msg":"apiview get ok"},status=200)
    
        def post(self,request,*args,**kwargs):
            return Response({
                "msg":"apiview post ok"
            })
    

    二次封装Response类(自定义一个APIResponse类继承Response),优化响应
    正确的:APIResponse('results'=[]) # 数据状态码和状态信息有默认值,可以不传
    异常的:Response(1,'error', status=400) # 可以按位传数据状态码和状态信息,错误时还可以设置网络状态码
    封装后的响应与封装前的响应结果一致,但是大大简化了响应写法:

    class APIResponse(Response):
        # 重写的APIResponse类是继承了restframework中的Response  再此基础上重写多个初始化值
        # 设置默认参数
        def __init__(self, data_status=0, data_msg='ok', results=None, http_status=None, headers=None, exception=False, **kwargs):
            data = {
                'status': data_status,
                'msg': data_msg,
            }
            # results可能是False、0等数据,这些数据某些情况下也会作为合法数据返回
            if results is not None:
                data['results'] = results
            data.update(kwargs)
            # 继承并重用父类的 的init方法,把自定义的data数据体传进去
            # 父类的:__init__(self, data=None, status=None,template_name=None, headers=None,exception=False, content_type=None):
            # 异常响应,默认为False
            super().__init__(data=data, status=http_status, headers=headers, exception=exception)
    
    class CarAPIView(APIView):
        def get(self,request,*args,**kwargs):
            print(request.query_params)
            print(request.data)
            # print(request.method)
            # print(request._request.method)
            return APIResponse(data={"msg":"apiview get ok"})
    
  • 相关阅读:
    (转)分析索引快速获取索引信息
    ORA-16014报错解决
    (转)关于索引的一点知识
    (转)CentOS搭建Nagios监控
    (转)Autotrace工具使用——小工具,大用场
    Using ROWNUM in Oracle
    oracle回收站
    DBA 思想天空笔记
    Oracle trunc函数
    MVC5中使用SignalR2.0实现实时聊天室
  • 原文地址:https://www.cnblogs.com/ghylpb/p/12154367.html
Copyright © 2020-2023  润新知