调用Stack Overflow API时遇WSGIRequest无get属性错误求助
问题原因与修复方案
嘿,我一眼就看穿问题出在哪了!你的错误根源是命名冲突,再加上一点小的代码健壮性问题,我来一步步帮你解决:
核心问题拆解
- 视图参数与requests库重名:你把视图函数的参数命名为
requests,这直接覆盖了你导入的requestsHTTP请求库。所以函数里的requests.GET["query"],其实是在调用Django的WSGIRequest对象的属性,而不是你用来调用Stack Overflow API的那个库——这就是报错'WSGIRequest' object has no attribute 'Get'的根本原因。 - 参数获取不够健壮:直接用
["query"]索引GET参数,如果请求里没带这个参数,会直接抛出KeyError导致崩溃。
修复后的完整代码
视图层(Views)
import requests from django.http import JsonResponse def search(request): # 把参数名改成request,避免和requests库冲突 # 用.get()方法获取参数,query不存在时返回空字符串,避免崩溃 query = request.GET.get("query", "") if not query: return JsonResponse({"message": "请提供查询参数query"}, status=400) # 用params参数传递查询条件,自动处理URL编码,更安全 api_params = { "order": "desc", "sort": "activity", "q": query, "site": "stackoverflow" } # 现在这里的requests才是你导入的HTTP请求库 response = requests.get( 'https://api.stackexchange.com/2.2/search/advanced', params=api_params ) api_data = response.json() return JsonResponse({"message": api_data})
URL配置(URLs)
你的URL配置完全没问题,保持原样即可:
urlpatterns = [ path('search/', views.search, name='search'), ]
为什么这样改?
- 解决命名冲突:把视图参数改成
request(Django的标准命名),这样函数内部的requests就会正确指向你导入的HTTP请求库,不会再和Django的请求对象混淆。 - 提升代码健壮性:用
request.GET.get()代替直接索引,当请求里没有query参数时,会返回默认的空字符串,还能提前判断并返回友好提示。 - 更安全的URL拼接:用
params参数传递查询条件,requests库会自动处理特殊字符的URL编码(比如空格、&等),避免因为参数格式问题导致API请求失败。
内容的提问来源于stack exchange,提问作者indianLeo
相关产品推荐
相关产品推荐

