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"})
原文地址:https://www.cnblogs.com/ghylpb/p/12154367.html