Flask

541 阅读4分钟

Flask 是什么

  • 当用户访问一个 URL,浏览器便生成对应的 HTTP 请求,经由互联网发送到对应的 Web 服务器。
  • Web 服务器接收请求,通过 WSGI 将 HTTP 格式的请求数据转换成我们的 Flask 程序能够使用的 Python 数据。
  • 在程序中,Flask 根据请求的 URL 执行对应的视图函数,获取返回值生成响应。
  • 响应依次经过 WSGI 转换生成 HTTP 响应,再经由 Web 服务器传递,最终被发出请求的客户端接收。
  • 浏览器渲染响应中包含的 HTML 和 CSS 代码,并执行 JavaScript 代码,最终把解析后的页面呈现在用户浏览器的窗口中。

HTTP请求

  • URL 是一个请求的起源。
  • 不论服务器运行在哪里,当我们输入指向服务器所在地址的 URL,都会向服务器发送一个 HTTP 请求。 一个标准的 URL 由很多部分组成,以下面这个 URL 为例:
http://helloflask.com/hello?name=Eric
信息说明
http://协议字符串,指定要使用的协议
helloflask.com服务器的地址(域名)
/hello?name=Eric要获取的资源路径(path)
这个URL后面的 ?name=Grey 部分是查询字符串(query string)。URL 中的查询字符串用来向指定的资源传递参数。查询字符串从问号 ? 开始,以键值对的形式写出,多个键值对之间使用 & 分隔。

请求报文

  • 当我们在浏览器中访问这个 URL 时,随之产生的是一个发向 helloflask.com 所在服务器的请求。
  • 请求的实质是发送到服务器上的一些数据,这种浏览器与服务器之间交互的数据被称为报文(message),请求时浏览器发送的数据被称为请求报文(request message),而服务器返回的数据被称为响应报文(response message)
  • 请求报文由请求的方法、URL、协议版本、首部字段(header)以及内容实体组成。
  • 前面的请求产生的请求报文示意如下表所示:
组成说明请求报文内容
报文首部:请求行(方法/ URL /协议)GET /hello HTTP/1.1
报文首部:各种首部字段Accept-Ranges: bytes
Access-Control-Allow-Origin: *
Cache-Control: max-age=600
Content-Type: application/json
空行
报文主体name=Eric
  • 报文由报文首部和报文主体组成,两者由空行分隔,请求报文的主体一般为空。
  • 如果 URL 中包含查询字符串,或是提交了表单,那么报文主体将会是查询字符串和表单数据。
  • 报文首部包含了请求的各种信息和设置,比如客户端的类型、是否设置缓存、语言偏好等。
  • 以下为常见的HTTP方法: | 方法 | 说明 | 方法 | 说明 | | --- | --- | --- | --- | | GET | 获取资源 | DELETE | 删除资源 | | POST | 传输数据 | HEAD | 获得报文首部 | | PUT | 传输文件 | OPTIONS | 询问网站支持的方法 |

Request对象

  • Flask 的请求对象 request,封装了从客户端发来的请求报文,我们能从它获取请求报文中的所有数据。

  • 假设请求的URL为: http://helloflask.com/hello?name=Eric

  • 使用request对象获取URL: | 属性 | 值 | 属性 | 值 | | ---- | ---| -- | -- | | path | hello | base_url | helloflask.com/hello | | full_path | hello?name=Eric | url | helloflask.com/hello?name=… | | host | helloflask.com | url_root | helloflask.com | | host_url | helloflask.com |

  • request 常用的属性和方法: request 常用属性和方法

在Flask中请求处理

  • URL 是指向网络上资源的地址。
  • 在 Flask 中,我们需要让请求的 URL 匹配对应的视图函数,视图函数返回值就是 URL 对应的资源。

路由匹配

  • 为了便于将请求分发到对应的视图函数,程序实例中存储了一个路由表(app.url_map),其中定义了URL规则和视图函数的映射关系。
  • 当请求发来后,Flask 会根据请求报文中的URL(path部分)来尝试与这个表中的所有URL规则进行匹配,调用匹配成功的视图函数。
  • 如果没有找到匹配的URL规则,说明程序中没有处理这个URL的视图函数,Flask会自动返回404错误响应(Not Found,表示资源未找到)

设置监听的HTTP方法

  • 在 app.route() 装饰器中使用 methods 参数传入一个包含监听的 HTTP 方法的可迭代对象。
  • 比如,下面的视图函数同时监听 GET 请求和 POST 请求:
@app.route("/hello", methods=["GET", "POST"])
def hello():
    return "hello"
  • 当某个请求的方法不符合要求时,请求将无法被正常处理。
  • 比如,在提交表单时通常使用 POST 方法,而如果提交的目标 URL 对应的视图函数只允许 GET 方法,这时 Flask 会自动返回一个 405 错误响应(Method Not Allowed,表示请求方法不允许)。