咳咳咳...我们终于来到了第二章,在上一章节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

回复

杰弟

斌哥我来了

回复

  • 最新随笔

  • 对我来说,写东西很好的一点是,自己写的东西,后面基本都会再看,一遍或者很多遍。这样就可以很好地发现自己之前的漏洞,并看看现在有什么变化。
  • 前段时间应该是百度更新了页面结构,那个黑帽泛目录网站我也没有去更新代码,就导致了文章页没有相关推荐,没想到这时候谷歌开始收录了,而且效果还不错。其实之前在谷歌一直不收录的时候就有怀疑过没有尽头的相关推荐很可能是导致不收录的原因,不过也一直没有去管它,而这次误打误撞的收录也恰恰证实了这个想法。(btw,其实这个网站从出现固定链接开始叫泛目录应该不太准确)
  • 最近吉他谱网站iloveguitar上线了,这几天在填充一些内容花了一些时间,这个网站也是使用flask作为后端框架的,前端UI框架使用的是bootstrap4,喜欢吉他的小伙伴欢迎来这里逛一逛哟,有什么建议欢迎在留言板提一下哟。
  • 那个泛目录网站发布了几个星期了,百度没怎么来爬,收了一个首页,谷歌直接就不收了,倒是一个查外链的网站天天来爬(笑哭),还有建议一点就是泛目录还是用在有建站历史的域名比较好(因为已经过了审核期),新域名就尽量不要用了。
  • 刚刚又发了一篇,最近文章百度都不太收录,orz,哈哈
  • 之前那个用python做的静态资源服务器,我又发现了一大用处,现在我都用来在局域网里的不同电脑之间传输文件,真的好用哈哈
  • 今天交换到了博客有史以来第一条友情链接
  • 刚刚更新了一下博客,修复了一些bug,添加了一个项目页