PythonWeb开发框架—Django之DRF框架的使用详解
1.安装依赖包
pip install djangorestframework
2.配置应用
在settings.py中的INSTALLED_APPS中添加rest_framework应用
3.创建序列化器
序列化器是用来操作models的
- 第一步:定义models
##models.py
from django.db import models
# Create your models here.
class User(models.Model):
name = models.CharField(verbose_name='用户名', max_length=32)
password = models.CharField(verbose_name='登录密码', max_length=64)
userid = models.CharField(verbose_name='用户ID', max_length=64)
phonenumber=models.CharField(verbose_name='手机号',max_length=11)
class Meta:
db_table = 'user'
- 第二步:在业务模块文件夹下先新增serializers.py文件
- 第三步:在serializers.py中创建序列化器
from rest_framework import serializers
from testmodule.models import User
##系列化器是用来操作models的
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = '__all__' #操作user表时返回所有字段
# fields = ('id', 'name') #操作user表时只返回name字段
4 序列化操作
- 在views.py中定义视图类
#views.py
from testmodule.models import User
from rest_framework.viewsets import ModelViewSet
from testmodule.serializers import UserSerializer
class UserDRFView(ModelViewSet):
##下面两行代码已经自动定义了GET、POST、PUT、PATCH和DELETE方法
queryset = User.objects.all()
serializer_class = UserSerializer
- 设置接口调用路径
from rest_framework.routers import DefaultRouter
from django.urls import include
router = DefaultRouter()
router.register('user', testmodule.views.UserDRFView,basename="user")
urlpatterns = [
path('', include(router.urls))
]
- 调用接口测试
get方法:序列化操作
和数据库表里数据一致
增加主键查询:
POST方法:反序列化操作
post的数据已经新增到数据库
5.数据校验
5.1 数据长度校验
在序列化器里对字段的长度进行校验:
用postman测试校验规则是否生效:
5.2 重复校验
在序列化器里对数据进行是否重复校验
需要导入UniqueValidator类:from rest_framework.validators import UniqueValidator
用postman测试校验规则是否生效
5.3 自定义校验规则
- 单字段校验
需要用到ValidationError
先导入:from rest_framework.exceptions import ValidationError
校验方法命名规则:validate_校验字段名
用postman测试校验规则是否生效:
- 多字段校验
需要用到ValidationError
校验方法命名固定为:validate
用postman测试校验规则是否生效:
6.多条件查询
- 全局配置的写法
第一步:先安装pip install django-filter
第二步:在setting.py中的INSTALLED_APPS中配置应用:
第三步:在setting.py中添加
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
}
第四步:在views.py的视图类中添加要过滤的多条件
测试:
- 局部配置的写法
第一步:在views.py中导入:from django_filters.rest_framework import DjangoFilterBackend
第二步:在视图类中添加:
filter_backends = [DjangoFilterBackend]
filterset_fields = ('name', 'phonenumber')
测试:
7.模糊搜索
第一步:导入from rest_framework import filters
第二步:在views.py的视图类中添加模糊过滤条件
测试:查询参数的字段是:search
如果需要多字段都支持模糊查询,在视图类的search_fields = ('name',)中增加字段即可
8.排序
第一步:导入from rest_framework import filters
第二步:在views.py的视图类中添加filters.OrderingFilter和排序字段
测试:查询参数的字段是:ordering
9.分页支持
在settings.py中添加:
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination','PAGE_SIZE': 2
测试:
10.权限token支持
- 安装
pip install djangorestframework_simplejwt
- 在settings.py 中REST_FRAMEWORK添加
'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework_simplejwt.authentication.JWTAuthentication' ]
- 在urls.py 中添加
from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView, TokenVerifyView
urlpatterns = [
path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'), # rest_framework_simplejwt自带的得到token
path('api/v1/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'), # 刷新JWT
path('api/token/verify/',TokenVerifyView.as_view(), name='token_verify') # 验证token
]
- 测试:不传token时访问报错
- 获取token
获取token需要管理员账号密码,就是访问http://localhost:8000/admin/ 的账号和密码
如果没有就先创建一个:执行命令 python manage.py createsuperuser
然后访问:http://localhost:8000/api/token/
填写管理员账号和密码:
点击【POST】获取到access
组装Token:Bearer+空格+access
请求头加上Authorization再次测试:
11.DRF认证方式
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework_simplejwt.authentication.JWTAuthentication',
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication' ]
DEFAULT_AUTHENTICATION_CLASSES 这是认证类列表,用于定义用户身份的验证方式。Django REST 框架会按列表顺序尝试这些认证方式,直到有一个成功验证用户身份
- JWTAuthentication token认证,适用于无状态 API
- SessionAuthentication Session 认证,需要检查 Cookie 或请求头中的 Session,使用时需要启用 Django 的 Session 中间件,且会触发 CSRF 校验
- BasicAuthentication 基本认证:用户名和密码 Base64 编码后放在请求头 Authorization: Basic credentials