咳咳咳...我们终于来到了第二章,在上一章节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 :当前应用实例

  

看起来是不是有点懵逼,没关系,后面遇到了我们再了解,现在先回到requestrequest提供丰富的属性和方法,有了这些属性与方法,我们就又有了更加丰富的工具,我们一来看看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

评论

Felix 管理员

回复 @杰弟: 666

回复

杰弟

斌哥我来了

回复

  • 最新随笔

  • 这个桥去年来看的时候貌似还没有
  • 中秋经典BGM:滴滴滴
  • 猫确实喜欢在各种犄角旮旯里睡觉
  • 尝试让DALLE生成一些连续的精灵图,让gpt帮忙生成一些提示词,如果能稳定输出的话就很强大了。
    让gpt帮忙生成的DALLE提示词
    "Generate a pixel art sprite sheet of a character walking in four directions (north, south, east, west) in a retro video game style."
    "Create a series of pixel art frames showing a character performing different actions like walking, running, jumping, and attacking in a classic 2D game aesthetic."
  • 路过别人山庄的门口,被一条大黑狗边叫边追过来,幸好骑电动车,不然还不一定跑得过,哈哈哈哈哈哈哈哈哈哈。
  • 最近两周也没咋出去玩,主要也是觉得没啥好玩的(笑哭)。看完布莱恩阿瑟的《复杂经济学》后,里面那个酒吧问题勾起我的兴趣,最近空了就花了些时间实现个python版本,顺便搞了篇博文,很享受这种新知识能和已有知识碰撞的感觉。(配张前段时间拍的图片,梧桐山门口前面那条路,挺漂亮的)
  • 盐田港夜景
  • 为啥这猫总喜欢喝杯子里的水