咳咳咳...我们终于来到了第二章,在上一章节Python Web开发基于flask的博客系统教程(1)——入门中,我们学习了Flask的一些基础知识,而在这一章中,我们将学习一下关于Flask在http请求与响应上的一些知识与操作,那么话不多说,让我们开始吧!
在web服务中,我们除了接受到客户端的请求,有时我们还需要访问请求对象的一些内容,比如客户端的UA信息,请求的方法是什么等等,所以Flask为我们封装了一个全局变量request
,虽说是全局变量,但web服务不可能只有一个客户端访问,所以这个变量其实是Flask用上下文临时将一些对象变成全局访问,这里不展开,有兴趣的同学可以看看flask官方文档的操作请求数据这一篇。我们现在来试一下。
frog.py
from flask import request
@app.route('/')
def index():
method=request.method
user_agent=request.headers['User_Agent']
return '请求方法为%s<br>你的UA为%s' % (method,user_agent)
Flask一共有4种上下文全局变量
请求上下文:
request
: 请求对象,封装了客户端的请求内容,如headers,请求方法之类的。
session
:用户会话,用于储存请求之间的值,返回为一个字典,类似于cookies,一般是储存在服务器中,不过flask是将session加密储存在客户端的cookie中,所以使用session需要设置secret_key。
应用上下文:
g
:请求时用于临时储存的变量,每次请求会重设。
current_app
:当前应用实例
看起来是不是有点懵逼,没关系,后面遇到了我们再了解,现在先回到request
,request
提供丰富的属性和方法,有了这些属性与方法,我们就又有了更加丰富的工具,我们一来看看Flask常用的一些属性与方法吧(更多属性方法参见Flask文档的Incoming-request-data)!
常用属性名 | 说明 |
---|---|
form | 返回一个字典,为提交表单的所有字段,如{'username':'Felix','password':'123456'} |
args | 返回一个字典,为请求url的查询字符串传递的所有参数,如{'page':'1'} |
values | 返回一个字典,为form与args的合集 |
cookies | 返回一个字典,为用户的所有cookie,如{'username':'Felix','pw_hash':'d45......ae17f'} |
headers | 返回一个字典,为请求头部,如{'User-Agent': 'Mozilla/5.0...','Cache-Control':'max-age=0',...} |
files | 返回一个字典,为表单上传的所有文件,键名为input标签里的name属性,键值为二进制数据,如{'img':'bytes'} |
method | 返回当前请求方法,如'GET' |
endpoint | 返回处理请求的路由端点名,默认为视图函数的名称。如'index' |
blueprint | 返回处理请求的蓝本名称,后面会讲到,这里先不展开。 |
scheme | 返回url的协议,如'http'或'https' |
host | 返回服务器IP地址与端口,如'127.0.0.1:5000' |
path | 返回请求的路径,如'/'、'/about' |
query_string | 返回url的查询字符串,为二进制形式,如b'page=1' |
full_path | 返回路径与查询字符串,类型为字符串,如'/posts/?page=2' |
url | 返回绝对路径,如'http://127.0.0.1:5000/posts/?page=2' |
base_url | 返回同url但无查询字符串部分,如'http://127.0.0.1:5000/posts/' |
remote_addr | 返回服务器ip地址,如'127.0.0.1' |
常用方法名 | 说明 |
---|---|
is_secure() | 返回布尔值,连接是否安全,若请求协议为https则返回True,反之为False |
看到上面是不是头晕眼花,不用烦恼,这些都不需要死记硬背,后面我们用的时候自然会记住了,再不济,记不住也可以回来查查。
除了以上的方法与属性,flask还提供四种请求钩子,实现为装饰器。
钩子 | 说明 |
---|---|
before_request | 注册到一个函数上,每次请求前运行 |
before_first_request | 注册到一个函数上,只在第一次请求前运行 |
after_request | 注册到一个函数上,若无异常抛出,每次请求后运行 |
teardown_request | 注册到一个函数上,无论有无异常抛出,每次请求后都运行。 |
示例写法
@app.before_request
def first():
pass
运行顺序类似于before_request函数
=>视图函数
=>after_request函数
,通过g变量,请求钩子函数能与视图函数共享数据。
响应是指服务器对客户端的响应,说到这里,相信大家在浏览网页时都有见过404这个数字吧,它表示对应资源不存在或被删除,其实这个数字还有另一个名称叫做状态码,类似的还有200,302,500等等,数字不同表示的含义也不同,比如200表示OK,响应成功,302表示重定向,500表示服务器内部错误等等。状态码是响应的重要组成部分,那么我们下面来试一下如何设置返回的状态码吧!
frog.py
@app.route('/404')
def return404():
return '404 not found',404
然后我们打开浏览器并打开开发者工具的网络页
我们可以看到状态变为了404,当然只返回状态码显然是不够用的,有时我们可能还需要返回一些cookies,或者修改一下响应的头部,所以flask为我们提供了一个函数make_response()
来生成响应对象,然后按需在对象上修改。
frog.py
from flask import make_response
@app.route('/login')
def login():
response=make_response('登录成功,并记住密码!')
response.set_cookie('username','Felix')
response.set_cookie('pw_hash','d45...ae17f')
return response
然后我们打开浏览器并打开开发者工具的存储页
成功!除了上面的set_cookie
,response对象还支持很多属性与方法,下面列举一些常用的属性方法(更多属性与方法请访问flask文档response objects查看)
常用属性名 | 说明 |
---|---|
status_code | 响应的状态码,接受int类型 |
headers | 响应的头部,接受dict类型 |
content_length | 响应主体长度,接受int类型 |
content_type | 响应主体媒体类型,接受str类型 |
常用方法名 | 说明 |
---|---|
set_cookie() | 响应对象添加一个cookie |
delete_cookie() | 响应对象删除一个cookie |
除了上面的响应,flask还封装了一个redirect()
函数用于302重定向
from flask import redirect
@app.route('/baidu')
def baidu():
return redirect('https://www.baidu.com')
打开浏览器访问127.0.0.1:5000/baidu
就会重定向到百度首页
好啦,关于flask的请求与响应就讲到这里,前面两章只是积累一下基础知识,从下一章开始,我们将正式进入Frog项目的开发学习中,下一章我们讲讲客户端的门面,“前端”。
点击这里进入下一篇
当前Frog项目仓库地址:http://codemole.cn/felix/Frog/src/frog2