zoukankan      html  css  js  c++  java
  • Django Rest_Framework

    安装与实验

    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)

    安装DRF

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

    # mkvirtualenv drfdemo -p python3
    # pip install django
    
    pip install djangorestframework
    pip install pymysql
    

    创建django项目

    cd ~/Desktop
    django-admin startproject drfdemo
    

    使用pycharm打开项目,设置虚拟环境的解析器,并修改manage.py中的后缀参数。

    添加rest_framework应用

    settings.pyINSTALLED_APPS中添加'rest_framework'。

    INSTALLED_APPS = [
        ...
        'rest_framework',
    ]
    

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

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

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

    drf完全简写代码的过程

    创建模型操作类

    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
    

    为了方便测试,需要先创建一个数据库。

    create database students charset=utf8md4;
    

    执行数据迁移

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

    python manage.py startapp students
    

    把students子应用添加到INSTALLED_APPS中

    初始化数据库连接

    安装pymysql
    pip install 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 报错提示如下:

      # 错误提示
       File "/home/jjzz/.virtualenvs/test/lib/python3.6/site-packages/django/db/backends/mysql/base.py", line 36, in <module>
          raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)
      django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.
      

    解决方案:

    注释掉 backends/mysql/base.py中的35和36行代码。
    # 如下图
    

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

        File "/home/jjzz/.virtualenvs/test/lib/python3.6/site-packages/django/db/backends/mysql/operations.py", line 146, in last_executed_query
          query = query.decode(errors='replace')
      AttributeError: 'str' object has no attribute 'decode'
      

      解决方案:

      backends/mysql/operations.py146行里面新增一个行代码:
      query = query.encode()
      # 如下图
      

    创建序列化器

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

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

    # 创建序列化器类,回头会在试图中被调用
    from rest_framework import serializers
    from .models import Student
    
    class StudentModelSerializer(serializers.ModelSerializer):
        class Meta:
            model = Student
            fields = "__all__"
    
    • model 指明该序列化器处理的数据字段从模型类Student模型中生成
    • fields 指明该序列化器包含模型类中的哪些字段,'all'指明包含所有字段

    编写视图

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

    from rest_framework.viewsets import ModelViewSet
    from .models import Student
    from .serializers import StudentModelSerializer
    # Create your views here.
    class StudentViewSet(ModelViewSet):
        queryset = Student.objects.all()
        serializer_class = StudentModelSerializer
    
    • queryset 指明该视图集在查询数据时使用的查询集
    • serializer_class 指明该视图在进行序列化或反序列化时使用的序列化器

    定义路由

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

    from . import views
    from rest_framework.routers import DefaultRouter
    
    # 路由列表
    urlpatterns = []  #系统会自动遍历url文件中的urlpatterns列表然后进行对应的处理函数查找
    
    router = DefaultRouter()  # 可以处理视图的路由器
    router.register('students', views.StudentViewSet)  # 向路由器中注册视图集
    
    urlpatterns += router.urls  # 将路由器中的所以路由信息追到到django的路由列表中
    

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

    from django.contrib import admin
    from django.urls import path,include
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path("stu/",include("students.urls")),
    ]
    
    

    运行测试

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

    python manage.py runserver
    

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

    • 点击链接127.0.0.1:8000/stu/students 可以访问获取所有数据的接口,呈现如下页面:

    • 在页面底下表单部分填写学生信息,可以访问添加新学生的接口,保存学生信息:

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

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

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

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

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

    返回,如下页面:

  • 相关阅读:
    Windows 系统光盘刻录教程-光盘怎样刻录?刻录数据光盘用"轨道一次写入"还是"光盘一次写入"?
    日本比中国快一个小时,泰国比中国慢一个小时
    轻量级微服务全局架构图-来自于黄勇老师
    2018-2-13-win10-uwp-读写csv-
    2018-8-28-win10-uwp-MVVM入门
    2018-12-25-win10-uwp-显示SVG
    2018-8-27-C#-powshell-调用
    2019-9-2-visual-studio-2015-warning-MSB3246
    2018-10-2-win10-uwp-win2d-特效
    2019-9-2-生成密码
  • 原文地址:https://www.cnblogs.com/jjzz1234/p/11797591.html
Copyright © 2011-2022 走看看