直观对比django与DRF

首先我们来看我从知乎上保存的有关django与DRF的流程图,思考两者之间的区别与联系!

直观对比django与DRF

直观对比django与DRF

Django就是将数据库的东西通过ORM的映射取出来,通过view文件,按照template文件排出的模板渲染成HTML。当用户请求相应的url时,返回相应的结果。

DRF是将数据库的东西通过ORM的映射取出来,通过view和serializers文件绑定REST接口,当前端请求时,返回序列化好的json。

那么DRF在Django的基础上做了什么呢?

DRF是Django的超集,去掉了模板的部分,提供了一个REST的接口,同时也提供了满足该接口的代码工作流。同时,在REST的规范下,升级了权限和分页等功能,增加了限流和过滤搜索等功能。

接下来我们引入DRF的概念

一、DRF是 Django rest framework的简称,是一种后台框架,它可以帮我们封装好序列化的底层实现,使django具备了restful接口。

二、restful API设计规范:

1.API与用户的通信协议,总是使用https协议

2.域名  子域名方式  url方式

      直观对比django与DRF

 

    3.版本

     url,如:https://api.example.com/v1/  用/v什么表示

     请求头  跨域时,引发发送多次请求

面向资源编程:路径、视图网上任何东西都是资源,url里必须是名词或名词复数

4、Method

GET(查询数据) 从服务器取出资源(一项或多项)

POST(创建数据) 在服务器新建一个资源

PUT(修改数据) 在服务器更新资源(客户端提供改变后的完整资源)

PATCH(修改属性) 在服务器更新资源(客户端提供改变的属性)

DELETE(删除数据) 在服务器删除资源

5、过滤、分页、排序:通过在URL上传参的形式传递搜索条件

   直观对比django与DRF

 

6、状态码

http状态码:

直观对比django与DRF

公司内部状态码:查询成功  200

                查无此人  404

                查询出错,请稍后再试  500

三、API View使用

这里我们先省略,下面我们做个例题来详细说明。

最后我们一起来做一个习题感受一下两者魅力吧!

一、django (View)

首先我们要先进入Django环境,创建新项目,从终端进入自己的文件夹输入:

workon django
django-admin startproject project02

将文件拖入pycharm,配置环境,运行。

直观对比django与DRF

如上图输入python manage.py startapp user 创建子应用 

接下来配置settings

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # 跨域
    'corsheaders',
    # 注册子应用
    'user'
]
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'corsheaders.middleware.CorsMiddleware', # 配置跨域
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME':  'project02', #项目名
        'HOST':'localhost',  
        'PORT':3306, # 端口号
        'USER':'root',  # 数据库用户名
        'PASSWORD':'zf1234'  # 数据库密码
    }
}

设置models模型类

from django.db import models

# Create your models here.
class User(models.Model):
    id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=20)
    classroom = models.CharField(max_length=20)
    class Meta:
        db_table = 'user'

终端执行:

python manage.py makemigrations
python manage.py migrate
迁移生成表

创建views视图

from django.views import View
from django.http.response import JsonResponse
from .models import *

# 查询、添加全部、
class UserView(View):
    def get(self,request):
        # 1、获取查询集
        users = User.objects.all()
        # 2、解析数据
        data = [
            {
                'id':user.id,
                'name':user.name,
                'classroom':user.classroom
            }
            for user in users
        ]
        # 3、返回响应
        return JsonResponse(data,safe=False)

    def post(self,request):
        # 1、接收添加的数据
        id = request.POST.get('id')
        name = request.POST.get('name')
        classroom = request.POST.get('classroom')
        # 2、校验参数
        if not all([id,name,classroom]):
            return JsonResponse({'msg':'缺少参数'},status=400)
        # 3、入库
        try:
            User.objects.create(id=id,name=name,classroom=classroom)
        except Exception as e:
            print(e)
            return JsonResponse({'msg': '添加失败'}, status=500)
        # 4、返回响应
        return JsonResponse({'msg': '添加成功'}, status=201)

#   查询单个、修改、删除
class UserDetail(View):
    def get(self,request,pk):
        try:
            user = User.objects.get(id=pk)
        except User.DoesNotExist:
            return JsonResponse({'msg':'NOT FOUND'},status=404)
        # 解析对象
        data = {
            'id': user.id,
            'name': user.name,
            'classroom': user.classroom
        }
        # 返回响应
        return JsonResponse(data, safe=200)

    def post(self,request,pk):
        try:
            user = User.objects.get(id=pk)
        except User.DoesNotExist:
            return JsonResponse({'msg': 'NOT FOUND'}, status=404)
        name = request.POST.get('name',user.name)
        classroom = request.POST.get('classroom', user.classroom)
        user.name = name
        user.classroom = classroom
        user.save()
        # 返回响应
        return JsonResponse({'msg':'更新成功'},status=201)

    def delete(self,request,pk):
        # 先根据条件查询,然后删除
        User.objects.filter(id=pk).delete()
        # 返回响应
        return JsonResponse({'msg': '删除成功'}, status=204)

最后配置路由

from django.contrib import admin
from django.urls import path
from user.views import *

urlpatterns = [
    path('admin/', admin.site.urls),
    path('user/',UserView.as_view()),
    path('user/<int:pk>/', UserDetail.as_view()),
]

二、APIView

迁移生成表后,需要添加序列化器文件

from rest_framework.serializers import ModelSerializer
from user.models import User

class UserSer(ModelSerializer):
    class Meta:
        model = User
        fields = '__all__'

创建views视图

from rest_framework.views import APIView
from rest_framework.response import Response
from user.models import User
from user.sers import UserSer

class User1(APIView):
    def get(self,request):
        id = request.query_params.get('id')
        user_data = User.objects.filter(id=id)
        ser = UserSer(user_data,many=True)
        data = ser.data
        return Response({'code':0,'data':data})
    def post(self,request):
        data = request.data
        ser = UserSer(data=data)
        ser.is_valid()
        ser.save()
        return Response({'code':201})
    def put(self,request):
        id = request.data.get('id')
        data = request.data
        user_data = User.objects.get(id=id)
        ser = UserSer(user_data,data=data)
        ser.is_valid()
        ser.save()
        return Response({'code': 201})
    def delete(self,request):
        id = request.query_params.get('id')
        User.objects.filter(id=id).delete()
        return Response({'code': 204})

最后配置路由

from django.contrib import admin
from django.urls import path
from user.views import *
urlpatterns = [
    path('admin/', admin.site.urls),
    path('user1/',User1.as_view()),
]

三、ModelViewSet

视图views中

from user.sers import UserSer
from rest_framework.viewsets import ModelViewSet
class User3(ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSer
路由
from django.contrib import admin
from django.urls import path,include
from user.views import *
# 导入ModelViewSet所需导包
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register('user1',User3)

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include(router.urls)),
]

上一篇:0基础学安卓--初识安卓Activity


下一篇:CBV源码分析;drf之APIView执行流程分析;drf之Request对象;序列化组件之Serializer的使用 # day66