Django配置回顾及DRF框架请求生命周期

Django配置回顾及DRF框架请求生命周期

一、Django配置回顾

先后端不分离的项目中app咱们通常起名叫app,在先后端分离的项目中咱们通常APP起名叫api,见名知意mysql

一、应用是否必定要在INSTALLED_APPS中注册

在没有使用app的一些特殊功能时(好比数据库相关),能够不用注册,可是注册以后,应用的全部应用都能使用,因此咱们将全部的app都完成注册git

二、数据库配置(所有在settings文件中配置便可)

在settings中导入pymysql就能够,能够不用去__ init__中导入sql

import pymysql
pymysql.install_as_MySQLdb()
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '数据库名',
        'USER': '帐号',
        'PASSWORD': '密码',
        'HOST': '若是是127.0.0.1,该配置能够省略',
        "PORT": 3306,  # 若是是3306,该配置能够省略
    }
}

三、路由分发

主路由中,将应用分发给相关在子路由中交给各子路由本身处理数据库

from django.conf.urls import url, include
urlpatterns = [
    # ...
    url(r'^api/', include('api.urls')),    # /api/test/
]

四、ORM配置回顾

暴露media文件夹下文件给用户配置

settings.py文件中django

# root就是将文件夹添加到os.path中
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
# url就是配置路由 /路由名/
MEDIA_URL = '/media/'

主路由urls.py下json

from django.views.static import serve
from django.conf import settings
​
urlpatterns = [
    ...
    # document_root必须指向icon/001.png所在的路径=>path变量,能够进入serve查看
    url(r'^media/(?P<path>.*)', serve, {'document_root': settings.MEDIA_ROOT})
]

二、APIView的请求生命周期

一、重写as_view()方法

一、as_view()方法完成路由配置,返回配置函数 csrf_exempt(view) 中禁用了csrf认证规则后端

因此:全部继承APIView的子类,都不受csrf认证规则的限制,由于csrf规则对get请求没有限制,没有drf本身的好api

二、将请求处理的任务交给dispatch方法浏览器

二、重写的dispatch方法

完成了三大核心任务:服务器

一、请求对象的处理:请求解析模块

二、请求过程的处理:三大认证模块 => 本身代码完成处理

三、请求结果的响应:异常模块处理异常响应 | 响应渲染模块处理正常响应

一、请求解析模块

  1. 二次封装了Django的wsgi协议的request对象,并作了向下兼容(原来request对象的内容,用如今的request对象都能访问)

  2. 将全部的拼接参数都放在了request.query_params中,将全部的数据包参数都放在了request.data

  3. 路由的有名和无名分组仍是在args和kwargs中

  4. 解析模块能够自定义在settings.py中自定义配置

    REST_FRAMEWORK = {
        # parsers解析模块,进入rest_framework中的settings中查找
        'DEFAULT_PARSER_CLASSES': [
            'rest_framework.parsers.JSONParser',  # 解析json
            'rest_framework.parsers.FormParser',  # 解析urlencoded
            'rest_framework.parsers.MultiPartParser'  # 解析form-data
        ],
    }

二、响应渲染模块

  1. 当三大认证模块和本身处理的视图逻辑没有出现异常时,会执行响应渲染模块

  2. 响应的数据会交给渲染模块来完成数据的渲染,渲染的方式有两种:json数据格式渲染,Brower浏览器格式数据渲染

  3. 渲染模块能够在自定义的settings中自定义配置

    REST_FRAMEWORK = {
        # 渲染模块
        'DEFAULT_RENDERER_CLASSES': [
            'rest_framework.renderers.JSONRenderer',  # json数据格式渲染
            # 浏览器渲染,上线后会注释,否则浏览器请求接口就暴露了后台语言
            'rest_framework.renderers.BrowsableAPIRenderer',  
        ],
    }

三、序列化组件

单表序列化

在建立表时,给已经有的表添加新字段有三种方式:1)设置该字段的默认值;2)设置该字段能够为空;3)在使用数据库迁移命令的时候设置默认值

序列化组件 serializers,子类ModelSerializer能够快速帮咱们建立一个序列化

使用:

一、在models.py中

from django.db import models
from django.conf import settings
class User(models.Model):
    name = models.CharField(max_length=64, verbose_name='姓名')
    height = models.DecimalField(max_digits=5, decimal_places=2, default=0)
    sex = models.CharField(choices=[('0', ''), ('1', '')])
    icon = models.ImageField(upload_to='icon', default='icon/default.png')
​
    # 自定义序列化给前台的字段
    # property优势:1)能够格式化数据库原有字段的数据 2)能够对外隐藏原有数据库原有字段名 3)能够直接连表操做
    @property  # 制造插头
    def gender(self): # choices方法获取值get_xxx_display()
        return self.get_sex_display() @property def img(self): # 返回url地址 服务器地址+media+具体名
        # return 'http://127.0.0.1:8000' + settings.MEDIA_URL + str(self.icon)
        return settings.BASE_URL + settings.MEDIA_URL + self.icon.name

二、自定义serializers.py文件

from rest_framework import serializers
from . import models
class UserModelSerializer(serializers.ModelSerializer):
    class Meta:
        # 该序列化类是辅助于那个Model类的
        model = models.User
        # 设置参与序列化与反序列化字段
        # 插拔式:能够选择性返回给前台字段(插头都是在Model类中制造)
        # fields = ['name', 'sex', 'icon']
        fields = ['name', 'gender', 'img']

三、在views.py中

from rest_framework.views import APIView
from rest_framework.response import Response
​
from . import models, serializers
​
class UserAPIView(APIView):
    def get(self, request, *args, **kwargs):
        pk = kwargs.get('pk')
        if pk:  # 单查
            # 1)数据库交互拿到资源obj或资源objs
            # 2)数据序列化成能够返回给前台的json数据
            # 3)将json数据返回给前台
            obj = models.User.objects.get(pk=pk)
            # many操做的数据是否有多个,默认是False能够不写
            serializer = serializers.UserModelSerializer(obj, many=False) return Response(serializer.data)else:  # 群查
            # 1)数据库交互拿到资源obj或资源objs
            # 2)数据序列化成能够返回给前台的json数据
            # 3)将json数据返回给前台
            queryset = models.User.objects.all()
            # many操做的数据是不是多个
            serializer = serializers.UserModelSerializer(queryset, many=True) return Response(serializer.data)def post(self, request, *args, **kwargs):
        # 单增
        # 1)从请求request中得到前台提交的数据
        # 2)将数据转换成Model对象,并完成数据库入库操做
        # 3)将入库成功的对象列化成能够返回给前台的json数据(请求与响应数据不对等:请求须要提交密码,响应必定不展现密码)
        # 4)将json数据返回给前台
return Response()
相关文章
相关标签/搜索