Flask向带login_required验证的路由发起POST请求的实现问题
Flask内部调用登录校验接口的解决方案
你遇到的问题本质是requests.post发起的是独立的外部HTTP请求,默认不会携带当前用户的session cookie,所以无法通过login_required装饰器的校验。可以根据你的业务场景选择以下方案解决:
方案1:直接调用业务逻辑(最推荐)
同应用内的接口互相调用不需要走HTTP请求,直接把公共逻辑抽离复用即可,没有额外开销,也不需要处理上下文传递问题:
# 抽离公共业务逻辑 def post_business_logic(): return "hello world" @app.route('/post',methods=['POST']) @login_required def handle_post(): return post_business_logic() @app.route('/',methods=['GET','POST']) def home(): # 注意:如果当前路由需要登录后访问,可加@login_required装饰器,确保session有效 res_content = post_business_logic() return (res_content, 200)
方案2:透传cookie发起HTTP请求(必须走HTTP场景)
如果确实需要发起真实HTTP请求(比如调用的是第三方服务接口、必须走完整的请求中间件链路),把当前用户的cookie透传给requests即可:
from flask import request # 需先导入request对象 @app.route('/',methods=['GET','POST']) def home(): res = requests.post( 'http://127.0.0.1:5000/post', cookies=request.cookies # 携带当前用户的所有cookie,包含session信息 ) return (res.text, res.status_code, res.headers.items())
方案3:使用Flask内置测试客户端
不需要依赖requests库,用Flask自带的测试客户端发起内部请求,自动适配应用上下文:
from flask import request @app.route('/',methods=['GET','POST']) def home(): with app.test_client() as client: # 同步当前用户的cookie到测试客户端 for k, v in request.cookies.items(): client.set_cookie(k, v) res = client.post('/post') return (res.data, res.status_code, res.headers.items())
注意如果
/路由本身就需要登录访问,直接给home视图加上@login_required装饰器即可,三种方案都能直接复用当前已登录的session信息。
内容的提问来源于stack exchange,提问作者sokar
相关产品推荐
相关产品推荐

