Django中同一视图函数如何区分不可修改的不同端点?
Django视图区分不同固定端点请求的解决方案
问题场景
有3个无法修改的端点,需指向同一个视图函数,urls.py配置如下:
urlpatterns = [ ... url(r'^a/', views.functionz.as_view(), name='a'), url(r'^b/', views.functionz.as_view(), name='b'), url(r'^c/', views.functionz.as_view(), name='c'), ... ]
由于不能将端点a/、b/、c/修改为带参数的形式(如xyz/a或xyz/b),需要在视图函数functionz中区分来自不同端点的请求,询问是否可以通过判断request.endpoint的方式实现,伪代码如下:
Class XYZ(API View): def post(self, request, format=None): if request.endpoint == '/a/': # 仅当客户端访问/a/时执行操作
可行方案
方法1:通过request.path或request.path_info判断
Django的request对象没有endpoint属性,但可以直接用request.path获取请求的完整路径。如果项目部署在子路径下,request.path_info会返回去除前缀后的路径,更可靠:
class XYZ(APIView): def post(self, request, format=None): path = request.path_info if path == '/a/': # 处理/a/的请求逻辑 pass elif path == '/b/': # 处理/b/的请求逻辑 pass elif path == '/c/': # 处理/c/的请求逻辑 pass
方法2:利用URL名称反向匹配
每个URL配置都设置了name参数,可以通过resolve函数解析当前请求对应的URL名称,以此区分请求来源:
from django.urls import resolve class XYZ(APIView): def post(self, request, format=None): url_name = resolve(request.path_info).url_name if url_name == 'a': # 处理name为a的请求 pass elif url_name == 'b': # 处理name为b的请求 pass elif url_name == 'c': # 处理name为c的请求 pass
这种方式更灵活,后续即使修改端点路径,只要name参数不变,视图逻辑无需调整。
方法3:URL配置传递额外参数
在URL配置时给视图传递自定义参数,视图直接读取该参数即可区分请求,代码可读性最高:
# urls.py urlpatterns = [ ... url(r'^a/', views.functionz.as_view(endpoint='a'), name='a'), url(r'^b/', views.functionz.as_view(endpoint='b'), name='b'), url(r'^c/', views.functionz.as_view(endpoint='c'), name='c'), ... ] # views.py class XYZ(APIView): endpoint = None def post(self, request, format=None): if self.endpoint == 'a': # 处理a端点请求 pass elif self.endpoint == 'b': # 处理b端点请求 pass elif self.endpoint == 'c': # 处理c端点请求 pass
内容的提问来源于stack exchange,提问作者Dyaksa Hanindito
相关产品推荐
相关产品推荐

