Web开发——Flask框架

Flask框架——response响应对象及request对象

2021-11-19  本文已影响0人  白巧克力LIN

在上篇文章中我们学习了Flask框架——路由(Route)、环境配置,这篇文章学习Flask框架——response响应及request请求。

在学习之前,我们简单地了解一下客户端和服务端的请求与响应过程,如下图所示:



很简单,客户端需要访问某个服务器的网站,首先发送Request请求(请求头、请求体和请求行),当服务端接收到我们的Request请求后,就会根据请求的内容来返回Response对象(响应行、响应头、响应体),其中响应体是我们网页显示的内容。

简单了解了请求与响应后,我们开始学习response响应及request请求。

Response响应

可以说响应对象其实是在路由中视图函数返回的值,其中视图函数返回值可以为元组、字符串、字典、对象,

示例代码如下所示:

from flask import Flask, Response, make_response

app=Flask(__name__)

# 元组
@app.route('/tuple')
def index1():
    return ('元组',200)

# 字典
@app.route('/dict')
def index2():
    return {'a':'北京','b':'上海','c':'广州'}

# 字符串
@app.route('/str')
def index3():
    return "字符串"

# 对象
@app.route('/object')
def index4():
    return Response('对象')   #使用Response()方法获取对象

if __name__ == '__main__':
    app.run(port=8080,debug=True)

运行Flask程序后,分别访问以下URL链接:

http://127.0.0.1:8080/tuple
http://127.0.0.1:8080/dict
http://127.0.0.1:8080/str
http://127.0.0.1:8080/object

网页显示的内容分别为:

元组
{
  "a": "\u5317\u4eac", 
  "b": "\u4e0a\u6d77", 
  "c": "\u5e7f\u5dde"
}
字符串
对象

return后面返回字符串其实是做了一个response对象的封装。

注意:返回值为元组数据时,不能以以下形式返回:

return ('a','b','c')

必须要以下面的形式返回:

# return '内容',响应码
return '11111',200

打开开发者工具,观察Response Headers内容如下图所示:



这里我们是选取了字典的Response Headers,在Response Headers展示了响应码、媒体类型、字符长度、服务名、访问时间的信息。当返回值为字符串、元组、对象时,媒体类型为text/html的响应对象;

那么我们想在Response Headers响应头中定值属于自己的内容怎么办呢?

这时可以使用make_response()方法获取响应对象,定制请求头,示例代码如下所示:

@app.route('/make_response')
def index5():                       
    response=make_response('make_response')     #获取响应对象
    response.headers['aaaa']='aaaa'             #定值名为aaaa,值为aaaa的响应头内容
    return response

这样我们就成功定制了属于自己的响应头,运行结果如下图所示:



当我们返回内容是一个完整的HTML文件,该如何返回呢?

当我们返回内容是一个完整的HTML网页时,该怎么办呢?这时我们可以通过render_template()方法就可以渲染完整的HTML文件为字符类型,其语法格式如下:

render_template('html文件')

准备一个html文件,然后编写以下代码:

from flask import Flask, render_template
app=Flask(__name__)
@app.route('/register')
def register2():
    r=render_template('register.html')
    return r
if __name__ == '__main__':
    app.run(port=8080,debug=True)

运行程序后,访问以下URL链接:

http://127.0.0.1:8080/register

网页返回结果如下图所示:


这样就成功把HTML文件呈现在网页上了,注意:由于render_template()默认是从templates文件夹中获取HTML文件,所以我们一般都是把HTML文件放在templates中,如下图所示:


当然我们也可以创建一个字符串变量,并把HTML文件内容写在字符串变量中,代码如下:

@app.route('/register')
def register():
    s='''
    html文件代码
    '''
    return s

当我们HTML代码很长时,写在路由函数就会很长,很麻烦,所以我们一般不会把HTML写在路由函数中。

request请求

我们学习了response响应对象,那么如何发送request请求呢?首先我们创建一个名为register.html文件,代码如下所示:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div>
    <form action="/get_data" method="get">
        <p><input type="text" name="username" placeholder="请输入用户名"></p>
        <p><input type="text" name="address" placeholder="请输入地址"></p>
        <p><input type="submit" value="提交"></p>
    </form>
</div>
</body>
</html>

我们利用了form标签的action属性,当点击提交时,网页将跳转到get_data网页中,并设置了method值为get,表示提交后发送请求为get请求。

其register.html网页展示内容如下图所示:


Flask示例代码如下所示:

from flask import Flask, render_template

app=Flask(__name__)

@app.route('/register')
def register():
    return render_template('register.html')         #渲染register.html文件

@app.route('/get_data')
def get_data():        
    return '提交成功'           
if __name__ == '__main__':
    app.run(port=8080,debug=True)

首先我们创建@app.route('/register')路由并将register视图函数来绑定URL:register,,该视图函数作用为渲染register.html文件返回给,再创建@app.route('/get_data')路由并将视图函数绑定在URL(/get_data)中,运行程序并打开http://127.0.0.1:8080/register,如下图所示:


这里我们输入了小明、北京这两个数据,然后点击提交,如下图所示:

可以发现,请求方法是get,跳转的URL为:
http://127.0.0.1:8080/get_data?username=小明&address=北京

那么为什么是这个URL呢,首先我们在HTML设置了action属性,当点击提交时,就会跳转到http://127.0.0.1:8080/get_data页面中,通过问号将表单的值拼接起来,其中username、address分别为HTML文件中input标签的name值。

那么发送post请求是不是只要将HTML文件中,form中的method的值改为post就可以了呢?

答案是:不是。

首先我们通过url_map()方法查看路由表,代码如下图所示:

if __name__ == '__main__':
    print(app.url_map)      #路由规则表
    app.run(port=8080,debug=True)

运行结果如下图所示:


我们发现URL路由中默认只接收GET、HEAD、OPTIONS请求,

其中OPTIONS请求方法的主要用途有两个:

  1. 获取服务器支持的HTTP请求方法;

  2. 用来检查服务器的性能。

由于没有接收POST请求,所以只是修改HTML中form的method值是不行的,会报如下图错误:



错误大概意思是该方法不被允许请求URL。

这时我们可以通过在app.route中添加接收post请求的方法,代码如下所示:

@app.route('/get_data',methods=['POST'])
def get_data():
    return '提交成功'

这时我们的路由表如下图所示:



这时路由表中的get_data只接收了POST、OPTIONS两种请求了,当然我们可以设置更多接收请求的方法,代码如下:

@app.route('/get_data',methods=['POST','GET','...','请求方法'])
def get_data():
    return '提交成功'

这样我们再访问http://127.0.0.1:8080/register网页中点击提交按钮就不会保存,并会发送post请求了,如下图所示:


好了,关于Flask框架——response响应及request请求就讲到这里了,下篇文章学习Flask框架——重定向、url_for!!!
公众号:白巧克力LIN

上一篇下一篇

猜你喜欢

热点阅读