快速搭建Django-rest-frame框架,适合给用过但忘记了具体步骤的人。
1.settings配置信息
添加’rest_framework’到您的INSTALLED_APPS设置
INSTALLED_APPS = [
...
'rest_framework',
# 或者选这个
'corsheaders',
]
2.models创建以及上传
from django.db import models
# 创建Student表格
class Student(models.Model):
name = models.CharField(max_length=10)
sex = models.BooleanField(default=False)
time = models.DateTimeField(auto_now_add=True) # 创建时自动添加时间,auto_now:每次更新都会刷新一次
class Meta:
db_table = 'student'
上传表单
python manage.py makemigrations
python manage.py migrate
3.序列化models
创建一个serilizer.py
from rest_framework import serializers
from APIViews.models import Student
# 创建序列化Student表格的类,这是从表
class StudentSerializer(serializers.ModelSerializer):
#序列化外键全部字段
#snippet(外键的related_name) = SnippetSerializers(read_only=True, many=True)这是序列化外键 ,many=True不能缺少
# 序列化单个字段
# questionnaire_title = serializers.CharField(source='questionnaire.title', read_only=True) source='外键的字段.title'
# questionnaire_id = serializers.IntegerField() 如果与models字段一样就可以自动识别
class Meta:
model = Student # 要序列化的模型
fields = ['name' , 'sex'] # 要序列化的字段
# fields ='__all__' # 序列化全部
4.Views处理
from rest_framework.generics import ListCreateAPIView , RetrieveUpdateDestroyAPIView , CreateAPIView
from APIViews.models import Student # 导入Student表格
from APIViews.serializer import StudentSerializer # 导入Student序列化的类
# 查询合集和创建数据
class StudentsViews(ListCreateAPIView , CreateAPIView):
queryset = Student.objects.filter(sex=False)
serializer_class = StudentSerializer
# 查询单个,更新和删除
class StudentsViews(RetrieveUpdateDestroyAPIView):
queryset = Student.objects.filter(sex=False) # 这里可以直接筛选出某一些数据,也可以直接all获取全部
serializer_class = StudentSerializer # 指定序列化类
ListCreateAPIView: GET objects -> 查询一个集合
CreateAPIView:create object -> 创建一个记录
RetrieveAPIView: GET a object -> 查询一个记录
UpdateAPIView: Update a object -> 更新一个记录
DestroyAPIView: Delete a object -> 删除某个记录
还有各种基于以上功能Mixin的类
5.URL配置
注意格式,pk是表的主键,只适合更新,删除和查询单个。
urlpatterns = [
# 查询合集和创建数据的URL
path('students/' , views.StudentsViews.as_view() , name='students') ,
# 查询单个,更新和删除的URL
re_path('student/(?P<pk>\d+)' , views.StudentsViews.as_view()) ,
]
接下来是进阶篇
1.用户身份验证
个别页面的操作需要用户登录时候使用,仅提供思路,创建一个专门用来校验的py文件:APISettings.py
from django.core.cache import cache
from rest_framework.authentication import BaseAuthentication
from rest_framework.permissions import BasePermission
from rest_framework import exceptions
from Authentication.models import User
class UserAuthentication(BaseAuthentication):
'''认证用户是否登录'''
def authenticate(self , request):
if request.method == 'GET':
try:
token = request.query_params.get('token') # 获取请求中的token
userid = cache.get(token) # 从缓存中获取到用户ID
user = User.objects.get(id=userid) # 从数据库获取到该用户实例
return user , token # 返回的用户实例和token,将会被封装到request里
except:
raise exceptions.NotAuthenticated
随后再把它添加到你需要验证的View中即可
class UsersViewset(ListCreateAPIView):
queryset = User.objects.filter(is_delete=False)
serializer_class = UserSerializer
authentication_classes = (UserAuthentication ,)
Tip:由于继承自BaseAuthentication,而父类默认返回raise NotImplementedError
2.用户权限认证
在APISettings.py中添加一个继承BasePermission的类
class UserPermission(BasePermission):
'''认证用户权限'''
def has_permission(self , request , view):
if request.method == 'GET':
# 根据源代码,如果认证过用户,用户实例会成为request的user属性.如果没有认证过,只能自己去获取用户实例.若是true则通过
return request.user.is_super
else:
return True
随后再把它添加到你需要验证的View中即可
class UsersViewset(ListCreateAPIView):
queryset = User.objects.filter(is_delete=False)
serializer_class = UserSerializer
authentication_classes = (UserAuthentication ,)
permission_classes = (UserPermission ,) # 权限认证
3.节流的使用
from django.core.cache import cache
from rest_framework.throttling import UserRateThrottle
from App.models import User
class UserThrottle(UserRateThrottle):
scope = 'user' # 给该类命名,设置时候要使用
def get_cache_key(self , request , view):
if isinstance(request.user , User):
ident = request.auth # 如果身份验证后,token会变成request的auth属性。如果没有认证过,自行获取token
else:
ident = self.get_ident(request)
return self.cache_format % {
'scope': self.scope ,
'ident': ident
}
添加配置,设定时间:
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES': [
'App.Throttles.UserThrottle', # 注册UserThrottle
],
'DEFAULT_THROTTLE_RATES': {
'user': '5/min', # 设置scope是user的频率
'address': '10/m' # 设置注册AddressRateThrottle的频率
}
}
View添加频率类:
class UsersViewset(ListCreateAPIView):
queryset = User.objects.filter(is_delete=False)
serializer_class = UserSerializer
throttle_classes = [UserThrottle, ]
4.序列化的级联查询
当表与表之间出现多对多的关系时(以user和address为例):
from rest_framework import serializers
from App.models import User , Address
class AddressSerializer(serializers.ModelSerializer):
class Meta:
model = Address
fields = ['owner' , 'address']
class UserSerializer(serializers.ModelSerializer):
address_set = AddressSerializer(many=True , read_only=True) # address作为次要表
class Meta:
model = User
fields = ['username' , 'id' , 'password' , 'address_set']
5.admin后台管理简单操作
from django.contrib import admin
# Register your models here.
from Admin.models import Human , Pet
@admin.register(Human)
class HumanAdmin(admin.ModelAdmin):
# exclude = ('age',)
search_fields = ('name' ,) # 搜索属性
list_filter = ('name' ,) # 筛选属性
list_per_page = 5 # 设置每行5条数据
def parse_sex(self): # 由于性别是true和false所以这里做解析
if self.sex:
return '男'
else:
return '女'
parse_sex.short_description = '性别' # 简介
list_display = ('name' , 'age' , parse_sex) # 展现的属性
坑点1:经过Django-rest-frame封装过后,请求的参数是在query_params里获取,参考代码如下:
request.query_params.get('action')
坑点2:经过Django-rest-frame封装过后,Post的参数是在data里获取,参考代码如下:
request.data.get('name')
坑点3:由于Django的封装,默认是不能修改request上传的数据。只要把_mutable属性修改便可以
request.data._mutable = True # 默认是False,修改为True后便能操作
request.data['description'] = 'soadhasogdoasdoasdg'
request.data._mutable = False # 记得将其关闭
坑点4:方法重造
有时候Django-rest-frame提供的方法不能满足需求,需要重造时,最好别用super,容易出错