如何在Flask中调用API并根据HTTP响应状态触发flash消息
解决方案
你当前代码的核心问题是直接对请求返回结果调用.json(),未提前判断HTTP响应状态,404响应时返回的结构和200成功响应完全不同,直接访问stats['achievements']会触发KeyError导致服务报错。按照以下步骤修改即可实现404时触发flash消息:
1. 前置配置确认
flash消息依赖Flask的session功能,必须先配置SECRET_KEY才能正常使用,在你的Flask初始化部分添加如下代码:
# 密钥可自行设置任意字符串 app.secret_key = "自定义的安全密钥字符串"
2. 修改视图函数逻辑
调整请求处理逻辑,先保存完整的响应对象,再根据状态码分支处理:
import urllib.parse import requests from flask import request, render_template, flash, redirect, url_for @app.route('/player', methods=['GET', 'POST']) def player(): # GET请求直接渲染搜索页面 if request.method == 'GET': return render_template('player.html') headers = header url = 'https://api.clashofclans.com/v1/players/{}' query = request.form.get('search') # 空输入校验 if not query: flash("请输入要搜索的玩家ID") return redirect(url_for('player')) player_id = urllib.parse.quote(query) # 先获取完整响应对象,不直接转JSON resp = requests.get(url.format(player_id), headers=headers) if resp.status_code == 200: # 响应正常时解析数据渲染页面 stats = resp.json() return render_template('player.html', stats=stats, data=stats['achievements']) elif resp.status_code == 404: # 404时触发flash提示,重定向回搜索页 flash("未查询到对应玩家,请检查输入的ID是否正确") return redirect(url_for('player')) else: # 其他异常状态的通用提示 flash(f"请求失败,错误码:{resp.status_code}") return redirect(url_for('player'))
3. 模板添加flash消息渲染
在player.html模板的页面顶部合适位置添加如下代码,用于展示flash消息:
{% with messages = get_flashed_messages() %} {% if messages %} {% for msg in messages %} <div class="alert">{{ msg }}</div> {% endfor %} {% endif %} {% endwith %}
内容的提问来源于stack exchange,提问作者Sameer Joshi
相关产品推荐
相关产品推荐

