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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:00:24