如何在DRF中路由含路径分隔符/的URL参数?
问题描述
在Django REST Framework(DRF)中,需要将URL模式api/v1/{resourceId}/owners路由到对应视图,但resourceId本身包含路径分隔符/(例如请求api/v1/somethings/value/owners),额外的/会触发404资源未找到错误。如何实现该URL路由并在视图中正确获取resourceId?
现有配置代码如下:
urls.py
path('api/v1/<str:resource_id>/owners', ResourceOwnershipView.as_view())
views.py
class ResourceOwnershipView(APIView): def get(self, request: HttpRequest, resource_id: str) -> Response: # 处理resource_id的业务逻辑
解决方案
使用Django内置的path路径转换器替换原有的str转换器即可解决问题。str转换器仅匹配不含/的字符串,而path转换器会匹配包含/在内的任意非空字符串,直到URL中/owners部分之前的所有内容。
修改后的urls.py配置:
path('api/v1/<path:resource_id>/owners', ResourceOwnershipView.as_view())
此时请求api/v1/somethings/value/owners时,resource_id会被正确解析为somethings/value,视图中的resource_id参数可直接获取完整的带/的字符串。
注意事项
- 该路由需放在其他更具体的API路由之后定义,避免拦截正常路由请求。例如若存在
api/v1/users/owners这类明确路由,需先定义它,再定义带path转换器的路由,否则users会被误识别为resource_id的一部分。
内容的提问来源于stack exchange,提问作者jebaseelan ravi
相关产品推荐
相关产品推荐

