ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

直观对比django与DRF

2021-09-22 19:34:25  阅读:383  来源: 互联网

标签:data request django user import 直观 id 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)),
]

标签:data,request,django,user,import,直观,id,DRF
来源: https://blog.csdn.net/weixin_61422097/article/details/120418391

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有