Django-DRF (1)

A. WEB application mode

  In the development of Web applications, there are two modes:

  1. The front and rear ends are not separated

  2. The front end of the separation

Two. API Interface

  In order to form a consensus within the team, to prevent confusion caused by differences in personal habits, we feel that we all need to find a good interface specification, and this specification allows the interface to the back-end write, use a glance, the reduction between the parties cooperation costs.

  Currently on the market most of the company's service architecture interfaces developers use mainly: restful, rpc.

  1. rpc

  rpc: translated into Chinese: Remote Procedure Call [remote service call].

  http://www.luffy.com/api

  post request

  action=get_all_student&params=301&sex=1

  More interfaces, a corresponding function name and the parameters of the more distal end api interfaces when requested, will be more difficult to find. Prone repeated Interface

  2. restful

  restful: translated into Chinese: the resource state transitions.

  All the back-end data / files are seen as resources.

  Then the interface requests data, the operation is essentially a resource.

  web project operating resources, nothing more than search additions and deletions to change. So what resources are required to declare the address bar will be operated, and then to explain what kind of operations on resources through http request verb.

  POST http://www.luffy.com/api/students/ add student data

  GET http://www.luffy.com/api/students/ get all students

  DELETE http://www.luffy.com/api/students/ <PK> Delete a student

 

Three. RESTful API Specification

  REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移。 它首次出现在2000年Roy Fielding的博士论文中。

  RESTful是一种定义Web API接口的设计风格,尤其适用于前后端分离的应用模式中。

  这种风格的理念认为后端开发任务就是提供数据的,对外提供的是数据资源的访问接口,所以在定义接口时,客户端访问的URL路径就表示这种要操作的数据资源。而对于数据资源分别使用POST、DELETE、GET、UPDATE等请求动作来表达对数据的增删查改。

  事实上,我们可以使用任何一个框架都可以实现符合restful规范的API接口。

  参考文档:http://www.runoob.com/w3cnote/restful-architecture.html

 四. 序列化

  api接口开发,最核心最常见的一个过程就是序列化,所谓序列化就是把数据转换格式。

  序列化可以分两个阶段:

  序列化

  把我们识别的数据转换成指定的格式提供给别人。

  例如:我们在django中获取到的数据默认是模型对象,但是模型对象数据无法直接提供给前端或别的平台使用,所以我们需要把数据进行序列化,变成字符串或者json数据,提供给别人。

  反序列化

  把别人提供的数据转换/还原成我们需要的格式。

  例如:前端js提供过来的json数据,对于python而言就是字符串,我们需要进行反序列化换成模型类对象,这样我们才能把数据保存到数据库中。

 五. Django Rest_Framework

  核心思想: 缩减编写api接口的代码

  Django REST framework是一个建立在Django基础之上的Web 应用开发框架,可以快速的开发REST API接口应用。

  在REST framework中,提供了序列化器Serializer的定义,可以帮助我们简化序列化与反序列化的过程,不仅如此,还提供丰富的类视图、扩展类、视图集来简化视图的编写工作。

  REST framework提供了认证、权限、限流、过滤、分页、接口文档等功能支持。

  REST framework提供了一个API 的Web可视化界面来方便查看测试接口。

  中文文档:https://q1mi.github.io/Django-REST-framework-documentation/#django-rest-framework

  github: https://github.com/encode/django-rest-framework/tree/master

  特点:

    • 提供了定义序列化器Serializer的方法,可以快速根据 Django ORM 或者其它库自动序列化/反序列化;

    • 提供了丰富的类视图、Mixin扩展类,简化视图的编写;

    • 丰富的定制层级:函数视图、类视图、视图集合到自动生成 API,满足各种需要;

    • 多种身份认证和权限认证方式的支持;[jwt]

    • 内置了限流系统;

    • 直观的 API web 界面;

    • 可扩展性,插件丰富

六. 环境安装与配置

  DRF需要以下依赖:

  • Python (2.7, 3.2, 3.3, 3.4, 3.5, 3.6)

  • Django (1.10, 1.11, 2.0)

  DRF是以Django扩展应用的方式提供的,所以我们可以直接利用已有的Django环境而无需从新创建。(若没有Django环境,需要先创建环境安装Django)

  1. 安装DRF

   前提是已经安装了django,建议安装在虚拟环境。

# 注意:切换到对应目录下执行
# mkvirtualenv drfdemo -p python3
# pip install django

pip install djangorestframework
pip install pymysql
  2. 创建一个Django项目
django-admin startproject drfdemo

  使用pycharm打开项目,设置虚拟环境的解释器。

  3. 添加rest_framework应用

  在settings.pyINSTALLED_APPS中添加'rest_framework'。

INSTALLED_APPS = [
    ...
    'rest_framework',
]

  接下来就可以使用DRF提供的功能进行api接口开发了。在项目中如果使用rest_framework框架实现API接口,主要有以下三个步骤:

  • 将请求的数据(如JSON格式)转换为模型类对象

  • 操作数据库

  • 将模型类对象转换为响应的数据(如JSON格式)

   接下来,我们快速体验下四天后我们学习完成drf以后的开发代码。接下来代码不需要理解,看步骤。

  4. 体验DRF完全简写代码的过程

  1. 创建模型类(此时项目还没有app,自行创建)
class Student(models.Model):
    # 模型字段
    name = models.CharField(max_length=100,verbose_name="姓名")
    sex = models.BooleanField(default=1,verbose_name="性别")
    age = models.IntegerField(verbose_name="年龄")
    class_null = models.CharField(max_length=5,verbose_name="班级编号")
    description = models.TextField(max_length=1000,verbose_name="个性签名")

    class Meta:
        db_table="tb_student"
        verbose_name = "学生"
        verbose_name_plural = verbose_name

  回忆之前所学的Django使用MySQL数据库的步骤执行。

  2. 创建序列化器

  例如,我们在django项目中创建学生子应用。

python3 manage.py startapp students

  在syudents应用目录中新建serializers.py用于保存该应用的序列化器。

  创建一个StudentModelSerializer用于序列化与反序列化。

from rest_framework import serializers
from students.models import Student


# 创建序列化器类,回头会在视图中被调用
class StudentModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = Student
        fields = "__all__"
        # fields = ("id", "name")  # 也可指定字段
  • model 指明该序列化器处理的数据字段从模型类Student参考生成

  • fields 指明该序列化器包含模型类中的哪些字段,'all'指明包含所有字段

  3. 编写视图

  在students应用的views.py中创建视图StudentViewSet,这是一个视图集合。

from rest_framework.viewsets import ModelViewSet
from students.models import Student
from students.serializers import StuentModelSerializer


class StuentAPIView(ModelViewSet):
    queryset = Student.objects.all()
    serializer_class = StuentModelSerializer
  • queryset 指明该视图集在查询数据时使用的查询集

  • serializer_class 指明该视图在进行序列化或反序列化时使用的序列化器

  4. 定义路由

  在students应用的urls.py中定义路由信息。

from rest_framework.routers import DefaultRouter
from students import views

urlpatterns = []  # 路由列表

router = DefaultRouter()  # 可以处理视图的路由器

router.register('student', views.StuentAPIView)  # url进行注册

urlpatterns += router.urls  # 将路由器中的所有路由信息追加到django的路由列表中

  最后把students子应用中的路由文件加载到总路由文件中.

urlpatterns = [
    path('admin/', admin.site.urls),
    path('drf/', include("students.urls")),
]
  5. 运行测试

  运行当前程序(与运行Django一样)

python3 manage.py runserver

  在浏览器中输入网址: 127.0.0.1:8000/drf/,可以看到DRF提供的API Web浏览页面:

  在浏览器中输入网址: 127.0.0.1:8000/drf/student/ 可以访问获取所有数据的接口,呈现如下页面:

  在浏览器中输入网址127.0.0.1:8000/drf/student/2/,可以访问获取单一学生信息的接口(id为2的学生),呈现如下页面:

  在页面底部表单中填写学生信息,可以访问修改学生的接口

  点击PUT,返回如下页面信息:

  点击DELETE按钮,可以访问删除学生的接口

 七. 序列化器-Serializer

  作用:

    1. 序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串
    2. 反序列化,把客户端发送过来的数据,经过request以后变成字典,序列化器可以把字典转成模型
    3. 反序列化,完成数据校验功能

  1. 定义序列化器

  Django REST framework中的Serializer使用类来定义,须继承自rest_framework.serializers.Serializer。

  接下来,为了方便演示序列化器的使用,我们先创建一个新的子应用ser

python manage.py startapp ser

  我们还是继续使用student下的模型类。

  下面我们为这个模型类提供一个序列化器,可以定义如下:

from rest_framework import serializers

# 所有的自定义序列化器必须直接或间接继承于 serializers.Serializer
class StudentSerializer(serializers.Serializer):
    # 声明序列化器
    # 1. 字段声明[ 要转换的字段,当然,如果写了第二部分代码,有时候也可以不用写字段声明 ]
    id = serializers.IntegerField()
    name = serializers.CharField()
    sex = serializers.BooleanField()
    age = serializers.IntegerField()
    class_null = serializers.CharField()
    description = serializers.CharField()

    # 2. 可选[ 如果序列化器继承的是ModelSerializer,则需要声明对应的模型和字段, ModelSerializer是Serializer的子类 ]

    # 3. 可选[ 用于对客户端提交的数据进行验证 ]

    # 4. 可选[ 用于把通过验证的数据进行数据库操作,保存到数据库 ]

  注意:serializer不是只能为数据库模型类定义,也可以为非数据库模型类的数据定义。serializer是独立于数据库之外的存在。

   常用字段类型

字段 字段构造方式
BooleanField BooleanField()
NullBooleanField NullBooleanField()
CharField CharField(max_length=None, min_length=None, allow_blank=False, trim_whitespace=True)
EmailField EmailField(max_length=None, min_length=None, allow_blank=False)
RegexField RegexField(regex, max_length=None, min_length=None, allow_blank=False)
SlugField SlugField(maxlength=50, min_length=None, allow_blank=False) 正则字段,验证正则模式 [a-zA-Z0-9-]+
URLField URLField(max_length=200, min_length=None, allow_blank=False)
UUIDField

UUIDField(format='hex_verbose') format:

1)'hex_verbose'如"5ce0e9a5-5ffa-654b-cee0-1238041fb31a"

2)'hex' 如 "5ce0e9a55ffa654bcee01238041fb31a"

3)'int' 如:"123456789012312313134124512351145145114"

4)'urn' 如:"urn:uuid:5ce0e9a5-5ffa-654b-cee0-1238041fb31a"

IPAddressField IPAddressField(protocol='both', unpack_ipv4=False, **options)
IntegerField IntegerField(max_value=None, min_value=None)
FloatField FloatField(max_value=None, min_value=None)
DecimalField DecimalField(max_digits, decimal_places, coerce_to_string=None, max_value=None, min_value=None) max_digits: 最多位数 decimal_palces: 小数点位置
DateTimeField DateTimeField(format=api_settings.DATETIME_FORMAT, input_formats=None)
DateField DateField(format=api_settings.DATE_FORMAT, input_formats=None)
TimeField TimeField(format=api_settings.TIME_FORMAT, input_formats=None)
DurationField DurationField()
ChoiceField ChoiceField(choices) choices与Django的用法相同
MultipleChoiceField MultipleChoiceField(choices)
FileField FileField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL)
ImageField ImageField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL)
ListField ListField(child=, min_length=None, max_length=None)
DictField DictField(child=)

 

 

  

 

 

 

 

 

 

 

 

Guess you like

Origin www.cnblogs.com/Michael--chen/p/11222143.html