使用Django调用Yelp API重复返回相同结果的问题排查
Django + Yelp API 搜索结果重复的问题诊断与修复
问题根源
嘿,我一眼就瞅到问题出在哪了!你看search_result函数里的这段代码:
if query_item: items = yelp_query(keyword='query_item', location='London')
这里犯了个超容易踩的小坑——你把keyword参数硬写成了字符串'query_item',而不是用从请求里拿到的变量query_item!不管用户在搜索框里输入啥(比如Italian Food或者Pizza),你的代码都一直在给Yelp API发“query_item”这个固定关键词的请求,结果自然永远和第一次一模一样。
修复方案
只需要把硬编码的字符串改成变量就行,另外建议把location也改成可配置的(比如从请求参数里获取),这样灵活性更高。修复后的代码如下:
视图函数修复版
def yelp_query(keyword, location): headers = {'Authorization': 'Bearer %s' % YELP_API_KEY} params = {'term': keyword, 'location': location} query = requests.get(YELP_SEARCH, headers=headers, params=params) return query.json() def search_result(request): items = [] query_item = request.GET.get('q') # 可选:让地点也支持从请求参数获取,默认保留London location = request.GET.get('location', 'London') if query_item: # 把硬编码的'query_item'换成变量query_item items = yelp_query(keyword=query_item, location=location) return render(request, 'locator/search.html', {'results': items})
HTML模板优化(可选)
如果想支持自定义地点搜索,可以给页面加个地点输入框,同时保留上次搜索的参数:
<body> <h1>Search</h1> <form method="get"> <input type="text" name="q" placeholder="输入美食关键词" value="{{ request.GET.q }}"> <input type="text" name="location" placeholder="输入地点" value="{{ request.GET.location|default:'London' }}"> <button type="submit">搜索</button> </form> {% for biz in results.businesses %} {{biz.name}}, {{biz.location.city}}<br> {% endfor %} </body>
额外小提示
- 记得处理API请求失败的情况,比如Yelp返回401权限错误、404资源不存在等,可以加个
try-except块,避免页面直接崩溃。 - 如果后续遇到莫名的缓存问题(比如Django缓存了视图结果),可以给
search_result函数加上@never_cache装饰器,确保每次请求都重新调用API。
内容的提问来源于stack exchange,提问作者Anand
相关产品推荐
相关产品推荐

