DRF从入门到精通五(路由组件、认证组件、权限组件、频率组件及认证、权限源码分析)

本文围绕Django REST framework展开,介绍了路由、认证、权限、频率组件。路由组件可自动生成路由,搭配action装饰器处理自定义方法;认证、权限、频率组件均有局部和全局开启方式;还对权限和认证组件进行了源码分析。

一、路由组件

对于视图集ViewSetMixin,我们除了可以自己手动指明请求方式与动作action之间的对应关系外,还可以使用Routers来帮助我们快速实现路由信息。

REST framework提供了两个router

  • SimpleRouter
  • DefaultRouter

也就是通过路由组件帮助我们自动生成路由,它会根据URL及请求匹配对应的视图方法,而这些方法则是来自视图集,如果我们需要自定义方法来处理请求的话,后续可以搭配action装饰器实现。

SimpleRouter为每个URL添加一个斜杠后缀,可以在初始化的时候提供trailing_slash参数,并设置为False

在这里插入图片描述

创建router对象,并注册视图集

	'导入'
	from rest_framework.routers import SimpleRouter,DefaultRouter
	'导入的模块不是继承就是实例化'
	router = SimpleRouter() 或者DefaultRouter()  # 创建对象
	'''
	DefaultRouter会生成一个根路径/的配置项
	DefaultRouter生成的每个配置项后都可以跟上.json,直接返回json数据
	还可以显示注册过的路由以及美化的页面
	SimpleRouter和DefaultRouter用法一致,功能几乎一样
	'''


	'注册路径,可以注册多个'
	router.register('publish',views.PublishView)  # 注册路由,并选择视图函数
	'注册:第一个参数是路径,第二个参数为视图类,第三个参数起别名用得少所有这里没用'
	
	urlpatterns = []
	
	
	'把生成的路由添加到urlpatterns路由列表中,有两种方式:'
	# 将生成的路由加入到Django需要调用的路由列表内
	'方式一:直接添加+='
		urlpatterns += router.urls
	'方式二:直接添加到urlpatterns里面使用include'
		from django.urls import path,include
		urlpatterns = [path('',include(router.urls))]
	

def register(self, prefix, viewset, basename=None):

注册参数说明:

  • prefix:路由的前缀
  • viewset:视图集(内部必须继承了ViewSetMixin类)
  • basename:路由的别名

上序代码会生成如下路由:

	path('publish/',views.PublishView.as_view()),
    path('publish/<int:pk>',views.PublishView.as_view()),

	''''
		^publish/$' [name='publish-list
		^publish/(?P<pk>[^/.]+)/$' [name='publish-detail']
	'''

每个路由对应的接口功能

	publish/:get请求的话则会执行视图集里面的list方法
	publish/:post请求的话则会执行视图集里面的create方法

	publish/<int:pk>/:get请求执行视图集里面的retrieve方法
	publish/<int:pk>/:put请求执行视图集里面的update方法
	publish/<int:pk>/:delete请求执行视图集里面的destroy方法

实际展示
视图类

	from rest_framework.viewsets import ModelViewSet
	'必须是继承了ViewSetMixin类的视图类才能使用这种自动生成路由的方法'
	class PublishView(ModelViewSet):
	    queryset = models.Publish.objects.all()
	    serializer_class = PublishSerializer

路由

	from rest_framework.routers import SimpleRouter
	router = SimpleRouter()
	router.register('publish',views.PublishView)
	urlpatterns = []
	urlpatterns += router.urls

此时上面代码就可以自动生成路由了,完成了增、删、改、查(一条或多条数据)的接口了,但是不包括在视图集里面自定义的方法。

如果要给我们自定义的方法也加上路由,那么则需要使用action装饰器来声明。


SimpleRouter生成URL的方式
在这里插入图片描述


DefaultRouter生成URL的方式
在这里插入图片描述


action装饰器

在视图集中,如果想要让Router自动帮助我们为自定义的方法生成路由信息,需要使用rest_framework.decorators.action装饰器。

使用action装饰器的方法名会作为路由的后缀,例如:

	/publish/使用action装饰器的方法名/

并且action装饰器会接收两个参数:

  • methods:声明该action对应的请求方式,列表传递:['get','post']表示该路由get请求与post请求。
  • detail:声明该action的路由是否与单一资源(就是单条数据)对应,如果需要的话设置True。
	/publish/<int:pk>/使用action装饰器的方法名/
	
	True:表示路径格式是:/publish/pk/action方法名/
	False:表示路径格式是:/publish/action方法名/
  • url_path:控制生成的/使用action装饰器的方法名/后面的路径是什么,如果不写默认以方法名
  • url_name:别名,用于反向解析

实际案例
视图类

	from rest_framework.viewsets import ModelViewSet
	from rest_framework.response import Response
	from rest_framework.decorators import action
	class PublishView(ModelViewSet):
	    queryset = models.Publish.objects.all()
	    serializer_class = PublishSerializer
	
	    @action(methods=['post'], detail=False)
	    def login(self,request):
	        return Response({
   
   'message':'登录成功'})
	
	    @action(methods=['get'],detail=True)
	    def test(self,request,pk):
	        return Response({
   
   'message':'测试成功'})

效果展示
在这里插入图片描述
在这里插入图片描述
此时可以从浏览器上看到自动生成的路由

	api/v1/ ^publish/$ [name='publish-list']
	api/v1/ ^publish/login/$ 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值