seventh_restful_API_django_restful
2.概念,关于前后端分不分离图示
前后端不分离
在前后端不分离的应用模式中,前端页面看到的效果都是由后端控制,由后端渲染页面或重定向,也就是后端需要控制前端的展示,前端与后端的耦合度很高。
这种应用模式比较适合纯网页应用,但是当后端对接App时,App可能并不需要后端返回一个HTML网页,而仅仅是数据本身,所以后端原本返回网页的接口不再,适用于前端App应用,为了对接App后端还需再开发一套接口。

前后端分离
在前后端分离的应用模式中,后端仅返回前端所需的数据,不再渲染HTML页面,不再控制前端的效果。至于前端用户看到什么效果,从后端请求的数据如何加载到前端中,都由前端自己决定,网页有网页的处理方式,App有App的处理方式,但无论哪种前端,所需的数据基本相同,后端仅需开发一套逻辑对外提供数据即可。
在前后端分离的应用模式中 ,前端与后端的耦合度相对较低。
在前后端分离的应用模式中,我们通常将后端开发的每个视图都称为一个接口,或者API,前端通过访问接口来对数据进行增删改查。

3.API接口
目前市面上大部分公司开发人员使用的接口服务架构主要有restful(资源状态转换)、rpc(远程过程调用),一种架构风格、设计风格,提供了一组设计原则和约束条件,基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
4.序列化
序列化: 把我们识别的数据转换成指定的格式提供给别人。
例如:我们在django中获取到的数据默认是模型对象,但是模型对象数据无法直接提供给前端或别的平台使用,所以我们需要把数据进行序列化,变成字符串或者json数据,提供给别人。
反序列化
例如:前端js提供过来的json数据,对于python而言就是字符串,我们需要进行反序列化换成模型类对象,这样我们才能把数据保存到数据库中。
5.Django Rest_Framework
Django REST framework是一个建立在Django基础之上的Web 应用开发框架,可以快速的开发REST API接口应用。在REST framework中,提供了序列化器Serialzier的定义,可以帮助我们简化序列化与反序列化的过程,不仅如此,还提供丰富的类视图、扩展类、视图集来简化视图的编写工作。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
-
-
提供了丰富的类视图、Mixin扩展类,简化视图的编写;
-
丰富的定制层级:函数视图、类视图、视图集合到自动生成 API,满足各种需要;
-
多种身份认证和权限认证方式的支持;[jwt]
-
内置了限流系统;
-
直观的 API web 界面;
-
可扩展性,插件丰富
6.环境按照与配置(Ubuntu终端操作)
6.1. Python2.7以上版本及Django1.0以上版本
6.2. 按照DRF
mkvirtualenv drfdemo -p python3 # 开一个新的虚拟环境,可以用workon看已有的
pip install django # 这里要说一下,如果安装失败,记得看下是否已经联网,如果已联网就用国内源
pip install djangorestframework #安装djangoframework
pip install pymysql # 按照数据库
mkvirtualenv drfdemo -p python3 # 开一个新的虚拟环境,可以用workon看已有的
pip install django # 这里要说一下,如果安装失败,记得看下是否已经联网,如果已联网就用国内源
pip install djangorestframework
pip install pymysql
6.3.创建Django项目
cd ~/Desktop # 还是终端,cd到桌面下
django-admin startproject drfdemo # 创建Django项目
6.4.
# 在settings.py的INSTALLED_APPS中添加'rest_framework'。 INSTALLED_APPS = [ ... 'rest_framework', ]
6.5.一波配图式配置
添加虚拟环境

配置并运行manage.py,即可看到运行成功



6.6.drf 简写代码的过程
# 创建一个数据库 mysql -uroot -p123 create database students charaset=utf8
# 先创建App students,在manage命令行里 python manage.py startapp students # settings 里面添加路径 INSTALLED_APPS = [ ... 'students', ] # models里面创建模型类 from django.db import models # Create your models here. class Student(models.Model): # 模型字段 name = models.CharField(max_length=100,verbose_name="姓名",help_text="提示文本:账号不能为空!") sex = models.BooleanField(default=True,verbose_name="性别") age = models.IntegerField(verbose_name="年龄") class_null = models.CharField(max_length=5,verbose_name="班级编号") description = models.TextField(verbose_name="个性签名") class Meta: db_table="tb_student" verbose_name = "学生" verbose_name_plural = verbose_name
# 初始化数据库连接 pip install pymysql # 安装pymysql # 主引用中`__init__.py`设置使用pymysql作为数据库驱动 import pymysql pymysql.install_as_MySQLdb() # settings.py配置文件中设置mysql的账号密码 DATABASES = { # 'default': { # 'ENGINE': 'django.db.backends.sqlite3', # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), # }, 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': "students", "HOST": "127.0.0.1", "PORT": 3306, "USER": "root", "PASSWORD":"123", } } # 终端下,执行数据迁移 python manage.py makemigrations python manage.py migrate # 此时可能会发生错误,解决方法如下
# 执行数据迁移 python manage.py makemigrations 报错如下:

解决方案:注释掉 backends/mysql/base.py中的35和36行代码。

# 执行数据迁移发生以下错误:

解决方法:backends/mysql/operations.py146行里面新增一个行代码:

创建序列化器serializers,在syudents应用目录中新建serializers.py用于保存该应用的序列化器。创建一个StudentModelSerializer用于序列化与反序列化。
from rest_framework import serializers from .models import Student # 创建序列化器类,回头会在试图中被调用 class StudentModelSerializer(serializers.ModelSerializer): class Meta: model = Student fields = "__all__"
编写students视图即views.py
# Create your views here. from django.views import View from students.models import Student from .serializers import StudentSerializer from django.http.response import JsonResponse class StudentsView(View): """使用序列化器序列化转换多个模型数据""" def get(self,request): # 获取数据 student_list = Student.objects.all() # 转换数据[序列化过程] # 如果转换多个模型对象数据,则需要加上many=True serializer = StudentSerializer(instance=student_list,many=True) print( serializer.data ) # 序列化器转换后的数据 # 响应数据给客户端 # 返回的json数据,如果是列表,则需要声明safe=False return JsonResponse(serializer.data,safe=False) class StudentView(View): """使用序列化器序列化转换单个模型数据""" def get(self,request,pk): # 获取数据 student = Student.objects.get(pk=pk) # 数据转换[序列化过程] serializer = StudentSerializer(instance=student) print(serializer.data) # 响应数据 return JsonResponse(serializer.data)
定义路由,students里的urls.py和主url
# students里的urls.py
from rest_framework.routers import DefaultRouter from . import views # 路由列表 urlpatterns = [] router = DefaultRouter() router.register("student",views.StudentViewSet) urlpatterns += router.urls
# 主urls from django.contrib import admin from django.urls import path,include urlpatterns = [ path('admin/', admin.site.urls), path("stu/",include("students.urls")), ]
此时运行当前程序即可使用,Python manage.py runserver,你亦可创建一些学生数据即可访问各种接口

7.序列化器-serializer
1. 序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串
2. 反序列化,把客户端发送过来的数据,经过request以后变成字典,序列化器可以把字典转成模型
3. 反序列化,完成数据校验功能
# 先创建一个新的子应用sers python manage.py startapp sers # 为students模型类提供一个序列化器 from rest_framework import serializers # 声明序列化器,所有的序列化器都要直接或者间接继承于 Serializer # 其中,ModelSerializer是Serializer的子类,ModelSerializer在Serializer的基础上进行了代码简化 class StudentSerializer(serializers.Serializer): """学生信息序列化器""" # 1. 需要进行数据转换的字段 id = serializers.IntegerField() name = serializers.CharField() age = serializers.IntegerField() sex = serializers.BooleanField() description = serializers.CharField() # 2. 如果序列化器集成的是ModelSerializer,则需要声明调用的模型信息 # 3. 验证代码 # 4. 编写添加和更新模型的代码 # 注意:serializer不是只能为数据库模型类定义,也可以为非数据库模型类的数据定义。 # serializer是独立于数据库之外的存在。
# sers 序列化器的视图 # Create your views here. from django.views import View from students.models import Student from .serializers import StudentSerializer from django.http.response import JsonResponse class StudentsView(View): """使用序列化器序列化转换多个模型数据""" def get(self,request): # 获取数据 student_list = Student.objects.all() # 转换数据[序列化过程] # 如果转换多个模型对象数据,则需要加上many=True serializer = StudentSerializer(instance=student_list,many=True) print( serializer.data ) # 序列化器转换后的数据 # 响应数据给客户端 # 返回的json数据,如果是列表,则需要声明safe=False return JsonResponse(serializer.data,safe=False) class StudentView(View): """使用序列化器序列化转换单个模型数据""" def get(self,request,pk): # 获取数据 student = Student.objects.get(pk=pk) # 数据转换[序列化过程] serializer = StudentSerializer(instance=student) print(serializer.data) # 响应数据 return JsonResponse(serializer.data)
# sers 的urls和主urls的路径添加 # sers 的urls from django.urls.conf import path,re_path from . import views urlpatterns = [ path(r"students/",views.StudentsView.as_view()), re_path(r"students/(?P<pk>\d+)/",views.StudentView.as_view()), ] # 主urls from django.contrib import admin from django.urls import path,include urlpatterns = [ path('admin/', admin.site.urls), path("stu/",include("students.urls")), path("ser/",include("sers.urls")), ]
此时已可运行
8.常用的字段类型-超链接


浙公网安备 33010602011771号