You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django应用中路径变量键被当作值读取的问题排查

问题分析与解决方案

这个问题不是DRF特有,是对Django路由匹配逻辑和Postman变量使用的误解导致的:

问题根源

  1. 路由配置缺失:你的urls.py里只定义了带<str:account_number>参数的路由,没有配置不带参数的/api/v1/accounts/路径。当你在Postman里发送{{my_host}}/api/v1/accounts/:account_number/且未给:account_number赋值时,Postman会把:account_number当成普通字符串发送,Django路由会匹配到带参数的路径,将:account_number作为参数值传入视图,自然不会触发None的判断分支。
  2. Postman使用错误::account_number是Postman的变量占位符,若要测试“不提供账号”的场景,应直接请求{{my_host}}/api/v1/accounts/,而非带着未赋值的占位符发送请求。

解决步骤

  1. 补充无参数路由:在urls.py中添加不带参数的路径,注意路由匹配顺序(无参数的路由要放在带参数的前面,避免被带参数的路由提前匹配):
# urls.py
urlpatterns = [
    path('api/v1/accounts/', accounts.AccountsViewSet.as_view()),  # 优先匹配无参数请求
    path('api/v1/accounts/<str:account_number>/', accounts.AccountsViewSet.as_view()),
    url('api/v1/', include(router.urls)),
]
  1. 修正Postman请求:测试无参数场景时,直接请求{{my_host}}/api/v1/accounts/,此时视图中的account_number会是默认的None,你的判断逻辑即可正常工作。
  2. 可选:优化视图判断:如果需要防范空字符串参数的情况,可以优化判断逻辑:
# view.py
def get(self, request, account_number=None, *args, **kwargs):
    print(account_number)

    if account_number is not None and account_number.strip() != '':
        print('account_number was provided')
    else:
        print('account_number not provided')

内容的提问来源于stack exchange,提问作者Damon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 16:50:18