如何在Flask中仅允许同源请求?解决视图函数返回值错误
问题解决:Flask接口限制自有网站访问及返回值错误修复
问题分析
- 返回值错误:直接返回整数
401不符合Flask的响应规则,Flask要求视图函数必须返回字符串、字典、响应实例、带状态码的元组等类型,不能直接返回整数。 - 请求来源判断逻辑错误:
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
相关产品推荐
相关产品推荐

