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

如何在Flask中仅允许同源请求?解决视图函数返回值错误

问题解决:Flask接口限制自有网站访问及返回值错误修复

问题分析

  1. 返回值错误:直接返回整数401不符合Flask的响应规则,Flask要求视图函数必须返回字符串、字典、响应实例、带状态码的元组等类型,不能直接返回整数。
  2. 请求来源判断逻辑错误:request.environ['werkzeug.request']不是获取请求来源的正确方式,这种写法无法准确识别请求是否来自你的自有网站example.org。

修复方案

1. 修正返回值问题

可以通过以下几种方式返回合法的401未授权响应:

  • 使用Flask的abort函数:
from flask import abort

@app.route('/create-api')  
def create_api():  
    # 后续判断逻辑
    abort(401)
  • 返回带状态码的元组:
@app.route('/create-api')  
def create_api():  
    # 后续判断逻辑
    return "Unauthorized", 401
  • 返回Response实例:
from flask import Response

@app.route('/create-api')  
def create_api():  
    # 后续判断逻辑
    return Response("Unauthorized", status=401)

2. 正确判断请求来源

要限制仅自有网站example.org发起的请求,应该检查请求的Referer或Origin请求头(根据实际请求场景选择):

from flask import request, abort

@app.route('/create-api')  
def create_api():  
    # 获取请求来源的Referer头
    referrer = request.headers.get('Referer')
    # 跨域场景下可改用Origin头
    # origin = request.headers.get('Origin')
    
    # 验证来源是否为example.org(需处理头不存在的情况)
    if referrer and "example.org" in referrer:
        # 你的业务逻辑代码
        return "Success", 200
    else:
        abort(401)

完整示例代码

from flask import Flask, request, abort

app = Flask(__name__)

@app.route('/create-api')  
def create_api():  
    referrer = request.headers.get('Referer')
    if referrer and "example.org" in referrer:
        # 这里编写你的业务逻辑
        return {"status": "success", "data": {}}, 200
    else:
        abort(401)

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

注意事项

  • Referer头可能被浏览器或代理隐藏,若为跨域AJAX请求,优先检查Origin头。
  • 仅通过请求头验证来源不是绝对安全的,生产环境建议结合签名验证等更可靠的方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 03:05:24