zoukankan      html  css  js  c++  java
  • 12.24作业

    作业:

    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"
            })
    
    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"})
    
  • 相关阅读:
    Vim step by step
    Ubuntu解压命令全览
    这样才能使本地Mysql服务允许被外部主机连接(两步)
    [Python] logging.logger
    Python Selenium
    MySQL中char、varchar和text的区别
    Way to MongoDB
    Python误区之strip,lstrip,rstrip
    Android Studio Tips
    Way to tmux
  • 原文地址:https://www.cnblogs.com/maqiaobin/p/12114864.html
Copyright © 2011-2022 走看看