Flask 中的 HTTP 方法

上一个小节中我们创建了第一个 Flask 程序,并且在浏览器中成功看到了 Flask 程序给我们返回的 Hello World。但是你有没有注意到,我们看到的内容只是在后台进行写死的,也就是说无论你怎么请求,看到的永远是 Hello World,无法根据自己的需求让 Flask 程序返回给你想要的内容?

这该怎么办呢?

不要急,我们有 HTTP 协议,HTTP 协议提供了多种方法访问服务端资源,本小节讲解常用的 HTTP 方法。并通过一个个具体的例子,说明如何在 Flask 中使用不同的 HTTP 方法。

Tips:本节课所有代码已经上传到了 Github,可以点击这里进行下载。

1. HTTP 协议简介

1.1 概述

HTTP 协议是 Hyper Text Transfer Protocol(超文本传输协议)的缩写, 用于从万维网(World Wide Web)服务器传输超文本到本地浏览器的传送协议。

HTTP 协议工作于客户端-服务端架构为上。浏览器作为 HTTP 客户端通过 URL 向 服务端发送请求,服务端根据接收到的请求 URL,向客户端发送响应信息。HTTP 请求-响应模型如下所示:

图片描述

1.2 HTTP 请求消息

HTTP 协议是一个简单的请求-响应协议,它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以 ASCII 码形式给出;而消息内容则具有一个类似 MIME 的格式。

浏览器向 Web 服务器发出请求时,它向服务器传递了一个请求信息,HTTP 请求信息由 3 部分组成:

  • 请求行;
  • 请求头;
  • 请求正文。

以下是一个 HTTP 请求消息的例子:

GET / HTTP/1.1
Host: www.imooc.com
Connection: keep-alive
User-Agent: Mozilla/5.0 AppleWebKit/537.36 Chrome/81.0
Accept: text/html,application/xml;image/webp,image/png,*/*;
...
省略
...

第一行是请求行,用来说明请求方法,要访问的资源,以及所使用的 HTTP 版本。在这个例子中,请求方法是 GET,要访问的资源是 /,HTTP 版本是 1.1,表示要获取网站首页 / 的内容。

紧接着请求行之后的部分是请求头部,用来说明服务器要使用的附加信息。例如:Host 指出请求的主机名,这里是 www.imooc.com

请求头部之后是请求正文,在请求正文中可以添加任意的其他数据,这个例子的请求正文为空。

1.3 常用的 HTTP 方法

根据 HTTP 标准,常用的 HTTP 请求如下所示:

请求方法 功能
GET 请求指定 URL 的页面,这是最常见的方法
HEAD 类似于 GET 请求,但返回的响应中没有具体的内容,用于获取报头
POST 向指定 URL 的页面提交数据进行处理请求,例如提交表单或者上传文件
PUT 从客户端向服务器传送数据,取代指定 URL 的页面
DELETE 请求服务器删除指定 URL 的页面

3. Flask 中的 HTTP 方法

上面我们已经大概了解了什么是 HTTP 协议,简单来说就是客户端与服务端用来通信的协议,HTTP 协议中规定和很多 HTTP 方法来让我们根据不同的需求向服务端发起请求。下面我们通过一个具体的例子,说明如何在 Flask 中使用不同的 HTTP 方法:

from flask import Flask, request
app = Flask(__name__)

首先,导入类 flask.Flask 和 flask.request,request 封装了请求消息,可以获取请求的各种参数。

@app.route('/login', methods = ['GET'])
def login():
    return '''
<form action="/check_login" method="POST">
  <p><input type="text" name="name"/></p>
  <p><input type="password" name="password"/></p>
  <p><input type="submit" value="submit"/></p>
</form>
'''

定义处理路径 /login 的函数 login,装饰器 @app.route(’/login’, methods = [‘GET’]) 表示使用 GET 方法处理路径 /login 的请求。

函数 login 返回一段用于登录的 HTML 表单,表单包括 2 个字段: name 和 password。在第 4 行,指定使用 POST 方法提交表单给服务端的 /check_login 页面。

@app.route('/check_login', methods = ['POST'])
def check_login():
    name = request.form['name']
    password = request.form['password']
    if name == 'guest' and password == '123':
        return 'Login succeed'
    else:
        return 'Login failed'

定义处理路径 /check_login 的函数 check_login,装饰器 @app.route(’/check_login’, methods = [‘POST’]) 表示使用 POST 方法处理路径 /check_login 的请求。

函数 check_login 根据请求的参数 name 和 password 是否正确,返回给用户相应的信息。在第 3 行,提取参数 name 的值,在第 4 行,提取参数 password 的值。如果 name 是 guest,password 是 123,则返回登录成功消息,否则返回登录失败消息。

if __name__ == '__main__':
    app.run()

调用 app.run() 运行程序。用户在浏览器中输入 http://localhost:5000/login,浏览器显示:

图片描述

用户输入正确的 name 和 password 后,浏览器跳转到页面 http://localhost:5000/check_login,显示:

图片描述

4. 小结

本节讲解了 HTTP 协议中的不同方法,通过一个具体的例子,讲解在 Flask 应用中,如何处理指定 HTTP 方法的请求。对常用的 HTTP 方法,使用思维导图概括如下:

图片描述