seventh_restful_API_django_restful

 

2.概念,关于前后端分不分离图示

前后端不分离

      在前后端不分离的应用模式中,前端页面看到的效果都是由后端控制,由后端渲染页面或重定向,也就是后端需要控制前端的展示,前端与后端的耦合度很高。

        这种应用模式比较适合纯网页应用,但是当后端对接App时,App可能并不需要后端返回一个HTML网页,而仅仅是数据本身,所以后端原本返回网页的接口不再,适用于前端App应用,为了对接App后端还需再开发一套接口。

 

前后端分离

      在前后端分离的应用模式中,后端仅返回前端所需的数据,不再渲染HTML页面,不再控制前端的效果。至于前端用户看到什么效果,从后端请求的数据如何加载到前端中,都由前端自己决定,网页有网页的处理方式,App有App的处理方式,但无论哪种前端,所需的数据基本相同,后端仅需开发一套逻辑对外提供数据即可。

在前后端分离的应用模式中 ,前端与后端的耦合度相对较低。

在前后端分离的应用模式中,我们通常将后端开发的每个视图都称为一个接口,或者API,前端通过访问接口来对数据进行增删改查。

3.API接口

  目前市面上大部分公司开发人员使用的接口服务架构主要有restful(资源状态转换)、rpc(远程过程调用),一种架构风格、设计风格,提供了一组设计原则和约束条件,基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

 4.序列化

  api接口开发,最核心最常见的一个过程就是序列化,所谓序列化就是把数据转换格式,序列化可以分两个阶段:

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

例如:我们在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

特点

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

  • 提供了丰富的类视图、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.常用的字段类型-超链接

 

posted @ 2019-05-05 19:35  pythonernoob  阅读(123)  评论(0)    收藏  举报