如何移除Django Rest Framework创建的API URL中的尾斜杠
Django REST API 移除不必要尾斜杠的解决方案
一、解决URL路径的尾斜杠问题
Django默认通过APPEND_SLASH配置(默认值为True)处理URL尾斜杠,会自动将不符合规范的请求重定向到匹配的URL格式。要统一使用无尾斜杠的URL规范,按以下步骤调整:
- 修正各层级URL配置
确保路径定义既保持段分隔,又避免多余尾斜杠:
- 主项目
urls.py:
urlpatterns = [ path("admin/", admin.site.urls), path("api/v1/", include("api.urls")) # 保留斜杠作为路径段分隔,api/v1作为统一前缀 ]
- api文件夹下的
urls.py:
urlpatterns = [ path("product", include("api.product.urls")) # 移除末尾斜杠,让product作为独立路径段 ]
- product文件夹下的
urls.py:
urlpatterns = [ path("<str:id>", ProductView.as_view(), name="product") # 无尾斜杠,最终URL为/api/v1/product/xyz123 ]
配置完成后,请求localhost:8000/api/v1/product/xyz123/(带尾斜杠)会被自动重定向到无尾斜杠的规范版本。若要禁用自动重定向,可在项目settings.py中设置:
APPEND_SLASH = False
注:禁用后需确保所有请求严格匹配URL定义,否则会返回404。
- 统一URL生成方式
代码中使用reverse()生成URL,会自动遵循URLconf的定义,避免手动拼接URL导致的尾斜杠错误。
二、解决查询参数中的尾斜杠问题
针对查询参数值带尾斜杠(如sorting_field_name=product_name/)的情况,需在后端做参数清洗:
在ProductView的业务逻辑中,对接收的参数进行首尾斜杠和空格的去除:
class ProductView(APIView): def get(self, request, *args, **kwargs): sorting_field = request.query_params.get('sorting_field_name', '') # 清洗参数:去除首尾空格和斜杠 sorting_field = sorting_field.strip().strip('/') # 后续使用清洗后的参数处理业务逻辑 # ...
若多个视图需处理此类问题,可自定义查询参数解析器或装饰器,实现全局统一的参数清洗。
内容的提问来源于stack exchange,提问作者Gerry Volta
相关产品推荐
相关产品推荐

