zoukankan      html  css  js  c++  java
  • 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"})
    
  • 相关阅读:
    微信 token ticket jsapi_ticket access_token 获取 getAccessToken get_jsapi_ticket方法
    PHP 日志 记录 函数 支持 数组 对象 新浪 sae 环境 去掉 空格 换行 格式化 输出 数组转字符串
    原生 原始 PHP连接MySQL 代码 参考mysqli pdo
    PHP 数字金额转换成中文大写金额的函数 数字转中文
    使用PHPMailer发送带附件并支持HTML内容的邮件
    设置输出编码格式 header 重定向 执行时间 set_time_limit 错误 报告 级别 error_reporting
    html5 bootstrap pannel table 协议 公告 声明 文书 模板
    指向指针的指针
    二级指针
    c语言:当指针成为参数后
  • 原文地址:https://www.cnblogs.com/ghylpb/p/12154367.html
Copyright © 2011-2022 走看看