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

OMDB API循环仅返回首个结果问题求助

问题分析与修复方案

一、核心问题排查

  1. OMDB API 请求路径错误
    当前代码里的请求URL是{API_BASE_URL}search/movies/,但OMDB的搜索接口不需要额外的search/movies路径,正确接口就是直接用基础URL加s参数请求。错误路径会导致API返回异常数据,可能仅返回单个结果或无效内容。

  2. 模板未传递搜索关键词
    show_search_results函数里,模板search_results.html用了{{s}}但没在render_template里传入这个变量,会导致页面显示异常。

  3. 电影详情接口两处错误

    • 没获取请求里的IMDB ID:id变量未定义,得从request.args.get("i")拿参数
    • 没解析API返回的JSON:直接返回了requests的Response对象,不是解析后的JSON数据
  4. 详情页链接未传参数
    搜索结果页的详情链接没带IMDB ID参数,点击后详情页无法获取对应电影的ID。

二、修复后的代码

app.py 修复版

@app.route('/movies/search_results', methods=['GET'])
def show_search_results():
    """Logic for sending an API request and displaying the JSON response as an HTML. Expects a GET request."""
    
    movies = []
    s = request.args.get("search")
    # 修正OMDB API请求路径,直接用基础URL加参数
    results = requests.get(f"{API_BASE_URL}", params={"s": s}).json()

    # 先判断Search是否存在,避免无结果时报错
    if 'Search' in results:
        results = results['Search']
        for movie in results:
            movies.append(movie)
    # 传递搜索关键词给模板
    return render_template('movies/search_results.html', movies=movies, s=s)


@app.route('/movies/detail')
def show_movie_details():
    """For displaying information about the individual movie. Not a list. GET request only."""
    # 获取IMDB ID参数
    imdb_id = request.args.get("i")
    if not imdb_id:
        return "缺少IMDB ID参数", 400
    # 请求详情并解析JSON
    movie_response = requests.get(f'{API_BASE_URL}', params={"i": imdb_id})
    movie = movie_response.json()
    return render_template('movies/detail.html', movie=movie)

search_results.html 修复版

{% block title %} {% endblock %}

{% block nav1 %} active {% endblock %}

{% block content %}
<div class="container-fluid" id="movie-list">
<div class="row row-cols-2 justify-content-center mt-2" style="--bs-gutter-x:0; ">
<p> Search Results for "{{s}}"</p>
<table>
    <thead>
        <tr>
            <th>IMDB ID</th>
            <th>Movie Title</th>
            <th>Year Released</th>
        </tr>
    </thead>
    <tbody>
        {% for movie in movies %}
            <tr>
            <td>  
                <!-- 修正链接,传递IMDB ID作为查询参数 -->
                <a href="/movies/detail?i={{ movie['imdbID'] }}">
                        {{ movie['imdbID'] }}
                </a> 
            </td> 
            <td>   
                    {{ movie['Title'] }}
            </td> 
            <td>
                {{ movie['Year'] }}
            </td> 
            </tr>
        {% endfor %}
    </tbody>
</table>              
    </div>
</div>
{% endblock %}

{% block footer %} {% endblock %}

detail.html 优化版(补充描述显示)

{% extends 'base.html' %}

{% block content %}
<div class="card mb-3">
  <div class="card-body">
    <h5 class="card-title">Title: {{ movie.get('Title', '未知') }}</h5>
    <p>
      <span class="text-info">Description: </span> 
      {{ movie.get('Plot', '暂无描述') }}
    </p>
    <div><h5 class="card-title text-success">包含该影片的播放列表:</h5></div>
    <p class="card-text"></p>
  </div>
</div>
{% endblock %}

三、额外注意事项

  • 确保API_BASE_URL设置为https://www.omdbapi.com/,并且携带apikey参数(OMDB API需要密钥,可在官网申请后拼入URL,比如https://www.omdbapi.com/?apikey=你的密钥)
  • 可以添加无搜索结果的提示逻辑,比如当movies为空时,页面显示“未找到相关影片”
  • 建议给API请求添加异常捕获,避免网络问题导致程序崩溃

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 03:05:49