OMDB API循环仅返回首个结果问题求助
问题分析与修复方案
一、核心问题排查
OMDB API 请求路径错误
当前代码里的请求URL是{API_BASE_URL}search/movies/,但OMDB的搜索接口不需要额外的search/movies路径,正确接口就是直接用基础URL加s参数请求。错误路径会导致API返回异常数据,可能仅返回单个结果或无效内容。模板未传递搜索关键词
show_search_results函数里,模板search_results.html用了{{s}}但没在render_template里传入这个变量,会导致页面显示异常。电影详情接口两处错误
- 没获取请求里的IMDB ID:
id变量未定义,得从request.args.get("i")拿参数 - 没解析API返回的JSON:直接返回了requests的Response对象,不是解析后的JSON数据
- 没获取请求里的IMDB ID:
详情页链接未传参数
搜索结果页的详情链接没带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
相关产品推荐
相关产品推荐

