首先我们来看我从知乎上保存的有关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)),
]