Django多参数端点action装饰器的url_path如何指定
DRF @action装饰器多路径参数场景配置方案
正确配置代码
直接将url_path按Django路由参数捕获规则编写即可,完整视图方法装饰器示例:
from rest_framework.decorators import action class TableColumnViewSet(viewsets.ViewSet): @action( detail=False, url_path=r'table-meta/(?P<catalog>[^/.]+)/(?P<schema>[^/.]+)/(?P<table>[^/.]+)', url_name='table-meta' ) def table_meta(self, request, catalog=None, schema=None, table=None): # 业务逻辑实现 return Response()
配置完成后最终生成的接口路径为:/utils/table-meta/{catalog值}/{schema值}/{table值}/
配置规则说明
- 因为设置了
detail=False,该action的路由前缀为注册的utils/,不会自动注入单资源对应的pk路径参数 - 路径中
(?P<参数名>匹配规则)是Django标准的命名路径捕获语法,参数名必须和视图方法接收的关键字参数名完全一致,即catalog/schema/table三个名称不能写错 - 匹配规则用
[^/.]+是DRF生态通用写法:匹配除路径分隔符/、格式后缀分隔符.之外的所有字符,避免和router自带的.json/.api这类格式后缀路由产生匹配冲突 - 如果项目使用Django 2.0及以上版本、DRF版本在3.10以上,也可以用更简洁的path转化器写法:
url_path='table-meta/<str:catalog>/<str:schema>/<str:table>',正则写法是全版本兼容的通用方案 - 建议同时指定
url_name参数,后续可以通过reverse('TableColumn-table-meta', args=[catalog, schema, table])反向生成接口地址
内容的提问来源于stack exchange,提问作者Brett
相关产品推荐
相关产品推荐

