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

调用电影API后打印数据出现UnicodeEncodeError问题求助

解决UnicodeEncodeError及电影数据传递问题

一、修复打印时的编码错误

出现UnicodeEncodeError: 'charmap' codec can't encode characters是因为Windows终端默认编码(如GBK)无法兼容部分Unicode字符,可通过以下两种方式解决:

1. 强制终端使用UTF-8输出

在Python文件开头添加代码,让标准输出流强制使用UTF-8编码:

import sys
sys.stdout.reconfigure(encoding='utf-8')

之后直接打印new_movie_data即可正常显示Unicode字符:

print(new_movie_data)

2. 写入UTF-8编码文件查看

如果终端仍有问题,可将数据写入本地文件查看:

import json
with open('movie_data.json', 'w', encoding='utf-8') as f:
    json.dump(new_movie_data, f, ensure_ascii=False, indent=4)

打开生成的movie_data.json文件,就能看到完整的Unicode内容。

二、修复代码跳转及数据传递问题

你的代码存在两个问题:一是redirect未加return导致跳转不生效;二是未实现将new_movie_data传递到home页面,以下是两种可行方案:

1. 使用Flask Session传递数据

适合传递中等规模数据,先导入session,再将数据存入session后跳转:

from flask import session, redirect, url_for

@app.route("/add", methods=["GET", "POST"])
def add():
    add_form = FindMovieForm()
    if add_form.validate_on_submit():
        movie_title = add_form.add_movie.data
        response = requests.get(f"{MOVIE_DB_SEARCH}{api_key}&query={movie_title}")
        new_movie_data = response.json()["results"]
        # 将数据存入session(需确保Flask已配置SECRET_KEY)
        session['movie_data'] = new_movie_data
        # 必须添加return才会触发跳转
        return redirect(url_for("home"))
    return render_template("add.html", form=add_form)

在home路由中取出数据并传递给模板:

@app.route("/home")
def home():
    # 从session获取数据,默认值为空列表
    movie_data = session.get('movie_data', [])
    return render_template("home.html", movie_data=movie_data)

2. 使用查询参数传递数据

适合少量数据传递,将JSON数据转为字符串作为URL参数:

import json
from flask import redirect, url_for

@app.route("/add", methods=["GET", "POST"])
def add():
    add_form = FindMovieForm()
    if add_form.validate_on_submit():
        movie_title = add_form.add_movie.data
        response = requests.get(f"{MOVIE_DB_SEARCH}{api_key}&query={movie_title}")
        new_movie_data = response.json()["results"]
        # 转为JSON字符串
        movie_data_str = json.dumps(new_movie_data, ensure_ascii=False)
        return redirect(url_for("home", movie_data=movie_data_str))
    return render_template("add.html", form=add_form)

在home路由中解析参数:

import json
from flask import request

@app.route("/home")
def home():
    movie_data_str = request.args.get('movie_data', '[]')
    movie_data = json.loads(movie_data_str)
    return render_template("home.html", movie_data=movie_data)

三、模板中渲染数据

在home.html模板中直接遍历数据即可:

{% for movie in movie_data %}
    <div class="movie-item">
        <h3>{{ movie.title }}</h3>
        <p>{{ movie.overview }}</p>
    </div>
{% endfor %}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 11:20:10