django-drf入门规范(三)

django-drf入门规范(三)

一. 环境安装与配置

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环境

    # mkvirtualenv drfdemo -p python3
    # pip install django
    
    pip install djangorestframework
    pip install pymysql
    
  • 创建Django项目

    进入django根目录,
    python manage.py startobject firstdjango
    创建app
    python manage.py startapp app01
    
    

    使用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=utf8;

    数据库迁移

    先在项目文件根目录中建立一个应用students文件, 并添加到INSTALL_APPS中

    初始化数据库连接

    安装pymysql
    pip install pymysql
    

    主引用中__init__.py设置使用pymysql作为数据库驱动 注:app01下的init

    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中的3536行代码。
    

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

    解决方法:

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

  • 创建序列化器

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

    python manage.py startapp students
    

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

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

    # 创建序列化器类,回头会在试图中被调用
    class StudentModelSerializer(serializers.ModelSerializer):
        class Meta:
            model = Student
            fields = "__all__"
    
    • model 指明该序列化器处理的数据字段从模型类BookInfo参考生成
    • 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 = []
    
    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浏览页面:

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

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

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

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

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

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

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

    返回,如下页面:

二. CBV源码分析(了解)

一. 请求来了进入路由, 路由分发到视图, 视图根据请求方式判断, dispatch就是分发请求方式, 映射到视图中, 如果没有就会抛异常, 一般都会有的, 因为继承了django原生视图类, 映射时会先从自己定义类中找, 找不到再到父类, 以此类推.

# 视图层
from django.shortcuts import render, HttpResponse
from django.views import View
class CBVTest(View):
    # 通过调度(dispatch)分发请求
    def dispatch(self, request, *args, **kwargs):
        pass
        super().dispatch(request, *args, **kwargs)
        pass

    def get(self, request):
        return render(request, 'cbv.html')

    def post(self, request):
        return HttpResponse('cbv post method')

二. 渲染提交信息, token不一定需要, 因为进入drf后第一步就是剔除crf,

<!-- 模板层 -->
<form action="/cbv/" method="post">
    {% csrf_token %}
    <input type="text" name="usr">
    <button type="submit">提交</button>
</form>

三. 路由匹配, as_view()是把类当做函数去执行, 内部代码可以读读

# 路由层
from app import views
urlpatterns = [
    url(r'^cbv/', views.CBVTest.as_view()),
]

三. drf基本使用及request源码分析

APIView的使用
# 1)安装drf:pip3 install djangorestframework
# 2)settings.py注册app:INSTALLED_APPS = [..., 'rest_framework']
# 3)基于cbv完成满足RSSTful规范的接口

.

# 视图层
from rest_framework.views import APIView
from rest_framework.response import Response
user_list = [{'id': 1, 'name': 'Bob'}, {'id': 2, 'name': 'Tom'}]
class Users(APIView):
    def get(self, request, *args, **kwargs):
        return Response({
            'status': 0,
            'msg': 'ok',
            'results': user_list
        })
    def post(self, request, *args, **kwargs):
        # request对formdata,urlencoded,json三个格式参数均能解析
        name = request.data.get('name')
        id = len(user_list) + 1
        user = {'id': id, 'name': name}
        user_list.append(user)
        return Response({
            'status': '0',
            'msg': 'ok',
            'results': user
        })

.

# 路由层
from app import views
urlpatterns = [
    url(r'^users/', views.Users.as_view()),
]

四. APIView和Request对象源码分析

APIView的使用
# as_view()
	# 核心走了父类as_view
	view = super(APIView, cls).as_view(**initkwargs)
    # 返回的是局部禁用csrf认证的view视图函数
    return csrf_exempt(view)
    
# dispatch(self, request, *args, **kwargs)
	# 二次封装request对象
	request = self.initialize_request(request, *args, **kwargs)
    # 自定义request规则
    self.initial(request, *args, **kwargs)
    
# initialize_request(self, request, *args, **kwargs)
	# 原生request封装在request._request
    
# initial(self, request, *args, **kwargs)
	# 认证
	self.perform_authentication(request)
    # 权限
    self.check_permissions(request)
    # 频率
    self.check_throttles(request)
Request对象

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值