m0_69693998 2025-01-14 19:17 采纳率: 38%
浏览 4
已结题

(标签-flask|关键词-ddl)

为什么flask框架,写的接口,浏览器网络响应里面看不到后端放回的json,正常来说我前端请求头里面Authorization故意写为空,后端代码中间件也确定出发了,但是浏览器网络响应里面看不到return jsonify({"msg": "Token is missing!"}), 403,其他接口也一样,成功或者失败都看不懂我后端return 的jsonify,这是为什么
app.py代码:

# app.py
from flask import Flask
import config
from exts import init_exts
import middleware
from blueprint.auth import dp as auth_dp
from blueprint.qa import dp as qa_dp
from flask_cors import CORS

app = Flask(__name__)
CORS(app, supports_credentials=True)
# 加载配置
app.config.from_object(config)
# 初始化扩展
init_exts(app)
# #设置中间件
middleware.init_app(app)
# 注册蓝图
app.register_blueprint(auth_dp)
app.register_blueprint(qa_dp)

if __name__ == '__main__':
    app.run(debug=True)

中间件代码# middleware.py

# middleware.py
from flask_jwt_extended import decode_token
from flask import request, jsonify,g

import mrd

#不需要token验证接口
check_list=[
    'auth.login',
    'auth.register'
     ]
def token_required():
    token = request.headers.get('Authorization', '')
    if not token:
        return jsonify({"msg": "Token is missing!"}), 403
    try:
        token = decode_token(token)
        g.token = token
    except Exception as e:
        print(f"Token decoding error: {e}")
        return jsonify({"msg": "Invalid Token!", "error": str(e)}), 403

def init_app(app):
    """
    @app.before_request 修饰器
    before_request 是一个 Flask 钩子(hook),它会在每次请求处理之前执行。
    这里通过 @app.before_request 注册了一个函数 before_request(),在每次请求时检查某些条件并可能执行额外逻辑。
    """
    @app.before_request
    def before_request():
        # 获取当前请求的端点
        endpoint = request.endpoint
        # 如果是登录或注册的端点,则跳过验证
        if endpoint in check_list:
            return None
        # 对其他以 'auth' 开头的端点执行 token 验证
        return token_required()

接口代码qa.py

@dp.route("/my", methods=["GET", "POST"])
def my():
    data = request.get_json(silent=True) or {}
    user = getattr(g, "token", None)
    search = data.get("search", '')
    if not search:
        query = db.session.query(models.blog).filter(models.blog.user_id == user["id"]).all()
    else:
        query = db.session.query(
            models.blog.title,
            models.blog.id,
        ).filter(
            models.blog.user_id == user["id"],
            models.blog.title.like(f"%{search}%")
        ).all()
    result = [{"id": item.id, "title": item.title} for item in query]
    return jsonify({"data": result})

前端代码blog.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>我的博客</title>
    <link rel="stylesheet" href="styles.css">
</head>
<body>
    <header>
        <nav>
            <ul>
                <li><a href="index.html">首页</a></li>
                <li><a href="search.html">搜索</a></li>
                <li><a href="my.html">我的</a></li>
                <li><a href="register.html">注册</a></li>
                <li><a href="login.html">登录</a></li>
            </ul>
        </nav>
    </header>
    <section class="blog-header">
        <h1>我的博客</h1>
    </section>
    <main>
        <div class="blog-container" id="blog-container">
            <!-- 博客内容将通过 JavaScript 动态插入 -->
        </div>
    </main>
    <footer>
        <p>© 2025 我的博客</p>
    </footer>

    <!-- 内联 JavaScript,放在 body 标签结束前 -->
    <script>
        const apiUrl = "http://127.0.0.1:5000/ruan/my";

        const blogContainer = document.getElementById("blog-container");

        fetch(apiUrl, {
        method: 'GET',
        headers: {
            'Authorization': "",
            // 'Authorization': `Bearer ${token}`,
            'Content-Type': 'application/json'
        },
        mode: 'no-cors' // 会让响应无法访问内容
    })
    .then((response) => {
        // If response is not OK (not a 2xx status)
        if (!response.ok) {
            // If the response body is empty or text, handle it
            return response.text().then((text) => {
                console.error("后台错误:", text);  // Log raw text response for debugging
                throw new Error(text || "请求失败!");
            });
        }

        // Try to parse the response body as JSON
        return response.json().catch((err) => {
            // If there's an error parsing the JSON (e.g., empty or malformed JSON)
            console.error("无法解析 JSON:", err);
            throw new Error("无法解析返回的 JSON 数据");
        });
    })
    .then((data) => {
        // If data is successfully fetched and parsed
        console.log("Data fetched:", data);
        if (data && Array.isArray(data.data)) {
            data.data.forEach((item) => {
                const blogCard = document.createElement("div");
                blogCard.className = "blog-card";

                const blogTitle = document.createElement("h2");
                blogTitle.textContent = item.title;
                blogCard.appendChild(blogTitle);

                const blogLink = document.createElement("a");
                blogLink.className = "blog-link";
                blogLink.href = `/blog/${item.id}`;
                blogLink.textContent = "查看详情";
                blogCard.appendChild(blogLink);

                blogContainer.appendChild(blogCard);
            });
        } else {
            blogContainer.innerHTML = "<p>没有找到博客内容。</p>";
        }
    })
    .catch((error) => {
        // Catch any errors that occur during the fetch or JSON parsing
        console.error("数据获取失败:", error.message);
        blogContainer.innerHTML = `<p>加载数据失败: ${error.message}</p>`;
    });
    </script>
</body>
</html>

img

  • 写回答

2条回答 默认 最新

  • 关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    从你提供的代码和描述来看,你在使用 Flask 框架开发后端 API,并且使用了中间件进行 Token 验证。你在前端请求时故意将 Authorization 头设置为空,以测试中间件是否能返回你期望的 JSON 响应({"msg": "Token is missing!"}, 403)。然而,你在浏览器的网络响应中看不到这个返回的 JSON。

    这可能是由以下几个原因导致的:

    1. CORS设置问题:你设置了 CORS,但在你的app.py代码中并未设置allowed_origins列表,这样会导致某些跨域请求无法正确响应。请确认你的前端请求的域名是否在允许的列表中。
    2. 返回的数据被浏览器拦截:某些浏览器可能会出于安全原因拦截某些类型的响应数据。尝试使用其他浏览器或开发者工具进行测试。
    3. 响应头设置问题:确认你的 Flask 应用是否设置了正确的响应头,以便前端能够正确解析 JSON 数据。例如,确保设置了正确的 Content-TypeAccess-Control-Allow-Origin 头。
    4. 浏览器开发者工具设置问题:确保你在浏览器的开发者工具中正确地查看了网络响应。有时候,响应可能被折叠或隐藏在某些子菜单下。尝试刷新页面并仔细检查每一个请求的响应详情。
    5. 代码问题:确保你的 Flask API 确实返回了你期望的 JSON 数据。你可以在 Flask 的路由处理函数中添加一些打印语句来确认返回的数据是正确的。

    针对你的具体情况,我建议首先检查浏览器的开发者工具中的网络响应,确保你正在查看正确的请求和响应。然后,检查你的 Flask 应用是否设置了正确的响应头。如果问题仍然存在,可以尝试在其他浏览器中测试,或者检查你的前端代码是否正确处理了响应数据。如果问题依然存在,可能需要进一步检查你的 Flask 应用和中间件代码。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月22日
  • 已采纳回答 1月14日
  • 创建了问题 1月14日