Flask开发中同一表单同时使用GET与POST方法的场景及相关问题解答
Flask路由同时支持GET/POST方法相关问题解答
首先澄清一个认知误区:你看到的 methods = ['POST', 'GET'] 是写在Flask后端路由的配置项里的,不是HTML表单的属性,不是「同一表单同时支持两种提交方法」,是接收表单提交数据的后端接口同时兼容两种请求类型的调用。
1. 路由同时配置两种请求方法的作用
你给出的示例里这么配置的核心作用是「兼容异常访问场景,避免接口直接报错」:
- 正常的登录流程是:用户访问首页
/拿到登录表单,表单的提交地址是/login、提交方法固定为POST,用户填完信息提交后,POST请求会发到/login路由做校验 - 如果有用户直接在浏览器地址栏输入
/login地址访问、或者通过其他跳转链接误访问到/login,此时发的就是GET请求,如果路由只支持POST,用户就会直接看到405方法不允许的错误页,体验很差;配置兼容GET之后,就可以统一把这类异常请求重定向到正常的登录首页。
你给出的示例代码如下:
from flask import Flask, redirect, url_for, render_template, request, abort app = Flask(__name__) @app.route('/') def index(): return render_template('log_in.html') @app.route('/login',methods = ['POST', 'GET']) def login(): if request.method == 'POST': if request.form['username'] == 'admin' : return redirect(url_for('success')) else: abort(401) else: return redirect(url_for('index')) @app.route('/success') def success(): return 'logged in successfully' if __name__ == '__main__': app.run(debug = True)
2. if request.method == 'POST' 条件判断的作用
这个判断是为了区分不同请求类型的处理逻辑,是Flask多请求方法路由的标准写法:
- 如果判断为POST,说明是正常的表单提交请求,此时可以从
request.form里拿到表单提交的账号参数,走校验逻辑,校验通过跳成功页,失败返回401未授权 - 如果判断为非POST(也就是GET请求),说明是异常访问,直接走重定向到登录首页的逻辑
如果不加这个判断,所有请求都会走表单校验逻辑,GET请求里根本没有request.form的表单参数,会直接抛出参数缺失的报错。
3. 用户能不能自行选择用GET方法提交表单?
完全可以,常见的触发场景包括:
- 用户直接在浏览器地址栏手动拼接
/login?username=xxx这类带参数的链接访问,就是GET请求提交参数 - 用户可以通过浏览器开发者工具,手动修改前端表单的
method属性为GET,点击提交就会用GET方法发送参数 - 攻击者可以构造带登录参数的GET链接,诱导已登录用户点击,尝试发起CSRF攻击
所以后端必须做请求方法的校验,不能默认所有到达接口的请求都是前端表单发送的POST请求,否则很容易出现逻辑漏洞或者服务报错。
内容的提问来源于stack exchange,提问作者Shoumik Das
相关产品推荐
相关产品推荐

