Django配置、APIView的请求声明周期、序列化组件

一、Django配置

1)应用是否需要在settings.py文件中的INSTALLED_APPS中注册?
      在没有使用到app的一些特殊操作时(比如数据库相关),可以不用注册。

      但是注册后,应用的所有功能都能使用
      结论:所有应用都可以完成注册

2)数据库配置(全部在settings文件中完成即可)
       import pymysql
       pymysql.install_as_MySQLdb()


       DATABASES = {
                   'default': {
                   'ENGINE': 'django.db.backends.mysql',
                   'NAME': '数据库名',
                   'USER': '账号',
                   'PASSWORD': '密码',
                   'HOST': '如果是127.0.0.1,该配置可以省略',
                   "PORT": 3306, # 如果是3306,该配置可以省略
                  }
                   }

3)路由分发
      主路由:将应用自己逻辑相关的路由交给自己处理
from django.conf.urls import url, include
urlpatterns = [
# ...
url(r'^api/', include('api.urls')),                          # /api/test/
]

 

 二、ORM配置

1、 models.py文件中


from django.db import models
class User(models.Model):
        SEX_CHOICES = ((0, '男'), (1, '女'))
        name = models.CharField(max_length=64, verbose_name='姓名')
        age = models.IntegerField()
        height = models.DecimalField(max_digits=5, decimal_places=2, default=0)
        sex = models.IntegerField(choices=SEX_CHOICES, default=0)
       # sex = models.CharField(choices=[('0', '男'), ('1', '女')])
        icon = models.ImageField(upload_to='icon', default='icon/default.png')


2、settings.py文件中

    MEDIA_ROOT = os.path.join(BASE_DIR, 'media')         # root就是将文件夹添加到 os.path 中

   MEDIA_URL = '/media/'                                                  # url就是配置路由 /路由名/

3、主路由d_proj/urls.py中最下方

      urlpatterns = [
      url(r'^media/(?P<path>.*)', serve, {'document_root': settings.MEDIA_ROOT})

     ]

因为:

三、APIView的请求声明周期

 

 1、重写的as_view方法

      01)as_view方法完成路由配置,返回配置函数是 csrf_exempt(view),也就是禁用了csrf认证规则
              结论:所有继承APIView的子类,都不受csrf认证规则的限制

     02)将请求处理的任务交给dispath方法完成

2、重写的dispatch方法

     完成了三大核心任务:
     01)请求对象的处理:请求渲染模块

     02)请求过程的处理:三大认证模块 => 自己代码完成处理

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

3、请求解析 模块  和  响应渲染 模块

     01)二次封装了原生Django的wsgi协议的request对象,并做了向下兼容(原来request对象的内容,用现在的request对象都能访问)

 

 

     02)将所有拼接参数都放在request.query_params中,将所有数据包参数都放在request.data中

     03)路由的有名无名分组的数据还是保存在args和kwargs中

     04)当三大认证模块和自己处理请求的视图逻辑没有出现异常时,会执行响应渲染模块

     05)响应的数据会交给渲染模块来完成数据的渲染,渲染方式有两种:Json格式数据渲染、Brower格式数据渲

     06)解析和渲染模块可以在settings.py自定义配置
             REST_FRAMEWORK = {
                        #请求 解析模块
                        'DEFAULT_PARSER_CLASSES': [
                         'rest_framework.parsers.JSONParser',                 # json
                         'rest_framework.parsers.FormParser',                  # urlencoded
                         'rest_framework.parsers.MultiPartParser'             # form-data
                          ],
                        # 响应渲染模块
                       'DEFAULT_RENDERER_CLASSES': [
                                 'rest_framework.renderers.JSONRenderer',
                                 'rest_framework.renderers.BrowsableAPIRenderer',       # 浏览器渲染,上线后会注释,不然浏览器请求接口就暴露了后台语言
                         ],
                          }

 

四、序列化组件

1、单表序列化

models.py
from django.db import models
from django.conf import settings
class User(models.Model):
    SEX_CHOICES = ((0, ''), (1, ''))
    name = models.CharField(max_length=64, verbose_name='姓名')
    password = models.CharField(max_length=64)
    age = models.IntegerField()
    height = models.DecimalField(max_digits=5, decimal_places=2, default=0)
    sex = models.IntegerField(choices=SEX_CHOICES, default=0)
    # sex = models.CharField(choices=[('0', '男'), ('1', '女')])
    icon = models.ImageField(upload_to='icon', default='icon/default.png')

    # 自定义序列化给前台的字段
    # 优点:1)可以格式化数据库原有字段的数据 2)可以对外隐藏原有数据库字段名 3)可以直接连表操作
    @property  # 制造插头
    def gender(self):
        return self.get_sex_display()

    @property
    def img(self):
        return settings.BASE_URL + settings.MEDIA_URL + self.icon.name

    def __str__(self):
        return self.name

serializers.py

from rest_framework import serializers
from . import models
class UserModelSerializer(serializers.ModelSerializer):
    class Meta:
        # 该序列化类是辅助于那个Model类的
        model = models.User
        # 设置参与序列化与反序列化字段
        # 插拔式:可以选择性返回给前台字段(插头都是在Model类中制造)
        # fields = ['name', 'age', 'height', 'sex', 'icon]
        fields = ['name', 'age', 'height', '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) 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()

 

 

 

 

 

 

 

 

 

 

posted @ 2020-02-18 21:23  薛定谔的猫66  阅读(319)  评论(0)    收藏  举报