Django应用中路径变量键被当作值读取的问题排查
问题分析与解决方案
这个问题不是DRF特有,是对Django路由匹配逻辑和Postman变量使用的误解导致的:
问题根源
- 路由配置缺失:你的
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的判断分支。 - Postman使用错误:
:account_number是Postman的变量占位符,若要测试“不提供账号”的场景,应直接请求{{my_host}}/api/v1/accounts/,而非带着未赋值的占位符发送请求。
解决步骤
- 补充无参数路由:在
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)), ]
- 修正Postman请求:测试无参数场景时,直接请求
{{my_host}}/api/v1/accounts/,此时视图中的account_number会是默认的None,你的判断逻辑即可正常工作。 - 可选:优化视图判断:如果需要防范空字符串参数的情况,可以优化判断逻辑:
# 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
相关产品推荐
相关产品推荐

