IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 直观对比django与DRF -> 正文阅读

[Python知识库]直观对比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方式

??????

?

????3.版本

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

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

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

4、Method

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

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

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

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

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

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

???

?

6、状态码

http状态码:

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

????????????????查无此人 ?404

????????????????查询出错,请稍后再试 ?500

三、API View使用

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

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

一、django (View)

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

workon django
django-admin startproject project02

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

如上图输入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)),
]

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-09-23 11:25:08  更:2021-09-23 11:26:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/28 5:57:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计