django-rest-framework
使用命令安装:
pip install djangorestframework
配置restframework
在settings中的INSTALLED_APPS里添加'rest_framework',
添加restframework的配置
REST_FRAMEWORK = {
# Use Django's standard `django.contrib.auth` permissions,
# or allow read-only access for unauthenticated users.
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.AllowAny'
]
}
在django中以resful规则写框架时的难点就在于模型的序列化,在rest-frame-work中提供了serializers模块 进行模型序列化
使用django-rest-framework建立一个简单的服务器:
-
在应用中创建一个serializers.py的文件,用来存放序列化器相关的代码
创建一个serializer类,继承自HyperlinkedModelSerializer,
然后在serializer类中指定class Meta,
需要包含的属性有model(模型)和fields(需要序列化的字段名),fields需要是一个列表或元组class Model_NameSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = ModelName fields = ['url', 'id', 'name', ]
-
在views.py中创建视图集合Mode_NameViewset类,继承自ModelViewSet
在类中指定queryset(查询结果集)和serializer_class(序列化器类)class Mode_NameViewset(ModelViewSet): queryset = Model_name.objects.all() serializer_class = Model_NameSerializer
在viewset中直接集成了对模型对象的增删改查(单个查询+列表查询)
-
在urls中调用DefaultRouter方法创建router
使用创建的router注册路由,
在项目中的urls.py中的urlpatterns中注册router# 应用中的url文件里添加:app.urls router = DefaultRouter() router.register('url_name', Mode_NameViewset) # 项目中的uurl文件里添加:django_project.urls urlpatterns = [ ... re_path('url_name/', include(router.urls)), ]
记得在settings.py中添加restframework相关配置
serializer
序列化器
serializers.Serializer
原生序列化
需要手动编写每个序列化的字段
需要手动实现对象的创建和更新
手动序列化(
在serializers..py中创建继承serializers.Serializer的类,
然后创建和models.py中对应模型所拥有的相同属性,
使用serializers.字段属性[Charfield等、和models中相同即可]。
然后创建crate和update方法;可以在类名上使用alt+enter快速创建,
create方法需要返回类名.objects.create(**validated_data),update里则需要根据字段名获取对应属性:instance.p_name = validated_data.get('p_name', instance.p_name),
若获取不到返回默认值,需要的属性获取完毕之后保存返回instance实例即可
调用Serializer(实例),则会返回改实例对应的json字符串
)
serializers.ModelSerializer
模型序列化
在classMeta中定义model模型和field字段属性即可
指定字段
fields
获取列表中声明的属性
exclude
剔除列表中声明的属性
serializers.HyperLinkedSerializer
序列化模型,并添加超链接
带超链接的模型序列化
在classMeta中定义model模型和field字段属性即可
字段扩充了url
使用StudentSerializer来对查询结果集转化为json:
student_serializer = StudentSerializers(students, many=True) # 添加many属性
return JsonResponse(data=student_serializer.data, safe=False) # 返回添加safe属性
restframework中的双R,request和response
Request
rest_framework重新定义的一个类
扩充django中的request
_request就是django中的request
data
POST、PUT、PATCH请求方法的参数
user
登录的用户
auth
用户的令牌
Response
HttpResponse的子类
status
常量类
View的包装
@api_view
通过使用装饰器的形式来修改既有视图函数
可以添加请求控制
APIView
继承自View
封装了一些函数
as_view的重写
dispatch
dispatch重写
初始化request
构建新的request
使用django中的request和一些过滤类,生成了rest_framework中的request
初始化各种工具
认证
认证成功返回的是一个元祖
第一个元素:用户 user
第二个元素:令牌 auth、token
权限
所有权限都满足才正常
节流
判断请求频率是否被允许,若不允许则等待
csrf_exempt 在view中返回时调用,添加了csrf全局豁免
添加格式化,添加结尾标识,返回不同格式
APIView的子类和方法:
generics模块 # 封装好的APIView,都是通过多继承来实现的
GenericAPIView # 主要增加了操作序列化器和数据库查询的方法,作用是为下面Mixin扩展类的执行提供方法支持。
CreateAPIView # 创建的类视图
ListAPIView # 列表的类视图
RetrieveAPIView # 查询单个的类视图
DestroyAPIView # 删除数据的类视图
UpdateAPIView # 更新数据的类视图
ListCreateAPIView # 获取列表数据,创建数据的类视图
RetrieveUpdateAPIView # 获取单个数据,更新单个数据的类视图
RetrieveDestroyAPIView # 获取单个数据,删除单个数据的类视图
RetrieveUpdateDestroyAPIView # 获取单个数据,更新、删除单个数据的类视图
mixins模块 # 存放一些增删改查的一些类
CreateModelMixin # 创建
ListModelMixin # 查询多个
RetrieveModelMixin # 查询单个
DestroyModelMixin # 删除
UpdateModelMixin # 更新
viewsets模块
ViewSetMixin # 重写了as_view
ViewSet # 默认什么都不支持,需要自己手动实现
GenericViewSet # 继承自ViewSetMixin和generics.GenericAPIView
ReadOnlyModelViewSet # 只读的模型的视图集合
ModelViewSet # 继承自mixins中的增删改查类和GenericViewSet ,集成了上述的所有方法
GenericAPIView
增加了模型的获取操作:
get_queryset
get_object
lookup_field 默认pk,可以通过赋值更改
get_serializer
获取序列化实例
get_serializer_class
获取序列化类
get_serializer_context
获取序列化上下文内容
filter_queryset
对查询结果集进行过滤
paginator
分页器,使用@propety定义成了一个属性
paginate_queryset
对查询结果集进行分页
级联数据的处理
ex:
人和地址
人的操作简单
地址的操作也简单
每个人只能管理自己的地址
获取自己的
get_queryset根据用户自己来获取
用户获取通过认证实现
用户状态使用权限实现
增加
post处理的时候绑定用户
修改
双重认证
确认地址是我们自己的
确认用户登录状态和权限