调用电影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
相关产品推荐
相关产品推荐

