之前示例讲解了可以通过request.args.get
方法在地址栏获取一些参数,下面我们来看下怎么在视图中设置和区分HTTP请求方式。
在HTTP中常用的请求方式有GET和POST两种。
GET的意思就是客户端向一个地址发送请求,目的就是获取这个地址上的信息,目标地址向发送请求的客户端提供信息供其浏览。而POST的目的是将自己的信息提交到目标地址,一般用于客户端向服务器端发送一些数据,具体场景有注册、登录等等。
在我们定义一个视图函数时,默认情况下是被当作GET方式请求的,如果想接受POST请求,我们需要在视图函数上做一些额外的设置。
假设我们有一个前端的登录页面,文件名为login.html,页面中有三个元素(用户名、密码、提交按钮)。元素name为username、pwd、submit,用户填写完毕通过提交按钮可以将信息提交到一个handler视图函数进行进一步的处理。
# handler视图函数
@app.route('/handler/')
def handler():
return "处理用户提交数据"
与此同时,在login页面中将form表单中的action属性指定到handler地址,说明将表单数据提交到handler,提交方式默认为GET(将我们填写的值放到地址栏里,作为键值对参数传递)。这个时候我们也可以通过地址栏可以访问到handler这个视图函数。作为用户名密码这种敏感数据,我们实际上应该使用POST方式提交。
请求方式的具体设置
将GET方式改为POST,前台需要做的工作,是要将login文件下的form表单中加一条属性method="post"
告知当点击submit提交表单时,使用POST方式提交数据。如果不指定method属性,则默认为GET方式提交。
<form action="." method="post"> <!-- 使用POST方式提交数据 -->
<p>
用户名:<input type="text" name="username">
</p>
<p>
密码:<input type="password" name="pwd">
</p>
<p>
<input type="submit" value="登录">
</p>
</form>
如果在这个时候重新提交数据会出现Method Not Allowed提示,即当前所提交的数据是不被允许的,原因是我们只设置了前端页面使用POST方式提交数据,而后端的视图参数默认仍为GET方式。所以我们接下来要将后端视图参数一并改为POST方式接收前端提交的数据。
@app.route('/handler/', methods=['POST']) #指定为POST
def handler():
username = request.form.get('username', None)
pwd = request.form.get('pwd', None)
return f"处理用户数据:用户名{username}, 密码:{pwd}"
这个时候我们只能通过login来访问handler视图函数,而不能在地址栏中直接访问handler函数,原因是地址栏访问handler属于GET请求,而当前handler被指定为POST,所以只能通过login表单提交数据后请求访问。如果想通过地址栏访问,可以同时设置为GET、POST,即method=['POST','GET']
。
通过add_url_rule方法设置请求方式
app.add_url_rule('/handler/', 'handler', handler, methods=['POST'])
在同一个页面中实现GET、POST的不同处理
我们也可以在同一个页面中使用GET请求呈现表单,同时在提交表单时使用POST请求传递并且呈现数据。
@app.route('/login/', endpoint='userlogin', methods=['GET','POST'])
def login():
if request.method == 'POST': #当POST请求出现执行下列代码
username = request.form.get('username', None)
pwd = request.form.get('pwd', None)
return f"处理用户数据:用户名{username}, 密码:{pwd}" # 呈现提交数据
return render_template('login.html') #GET请求时return一个login.html页面
总结:
我们可以在前端页面及后端视图函数中指定请求方式,常用的有GET、POST两种方法·。不管是通过装饰器还是app_add_rule方式实现的地址规则,都可以用method = ['GET', 'POST]
来设置请求方式。