Flask简介

devtools/2024/11/9 16:33:00/

Flask简介

  • 安装
    • 概述
    • 使用PyCharm创建一个Flask程序
  • Flask程序的基本结构
    • 初始化
    • 路由和视图函数
    • 启动服务器
    • 请求-响应循环

安装

概述

Flask算是小型框架,小到可以称为“微框架”。Flask 非常小,因此你一旦能够熟练使用它,很可能就能读懂它所有的源码。但是,小并不意味着它比其他框架的功能少。Flask 自开发伊始就被设计为可扩展的框架,它具有一个包含基本服务的强健核心,其他功能则可通过扩展实现。你可以自己挑选所需的扩展包,组成一个没有附加功能的精益组合,从而完全精确满足自身需求

使用PyCharm创建一个Flask程序

1、打开PyCharm,选择“Create New Project”,然后选择一个合适的位置并命名你的项目。点击“Create”来创建项目。建议在项目中创建一个虚拟环境以隔离项目的依赖

image.png

2、PyCharm会自动下载flask包,创建venv虚拟环境,并完成初始模版的构建,如下图

image.png

之后的开发,如果你想在虚拟环境中执行命令,只需点击Terminal,PyCharm会自动进入项目下面的venv虚拟环境:

image.png


Flask程序的基本结构

初始化

所有 Flask 程序都必须创建一个程序实例。Web 服务器使用一种名为 Web 服务器网关接口(Web Server Gateway Interface,WSGI)的协议,把接收自客户端的所有请求都转交给这个对象处理。程序实例是 Flask 类的对象,经常使用下述代码创建:

python">from flask import Flaskapp = Flask(__name__)

Flask 类的构造函数只有一个必须指定的参数,即程序主模块或包的名字。在大多数程序中,Python 的 __name__ 变量就是所需的值。Flask 用这个参数决定程序的根目录,以便稍后能够找到相对于程序根目录的资源文件位置

路由和视图函数

在 Flask 程序中定义路由的最简便方式,是使用程序实例提供的 app.route 修饰器,把修饰的函数注册为路由,例如:

python">@app.route('/')
def hello_world():return 'Hello World!'

启动服务器

程序实例用 run 方法启动 Flask 集成的开发 Web 服务器:

python">if __name__ == '__main__':app.run()

有一些选项参数可被 app.run() 函数接受用于设置 Web 服务器的操作模式。在开发过程中启用调试模式会带来一些便利,比如说激活调试器和重载程序。要想启用调试模式,我们可以把 debug 参数设为 True:

python">if __name__ == '__main__':app.run(debug=True)

右键运行Flask项目,控制台会输出项目的地址信息:

image.png

访问http://127.0.0.1:5000/,会看到一个初始的Flask应用程序,返回一个Hello World!

image.png

一个完整的程序

python">from flask import Flaskapp = Flask(__name__)@app.route('/')
def hello_world():return 'Hello World!'if __name__ == '__main__':app.run(debug=True)

请求-响应循环

1、程序和请求上下文

Flask 从客户端收到请求时,要让视图函数能访问一些对象,这样才能处理请求。请求对象就是一个很好的例子,它封装了客户端发送的 HTTP 请求
要想让视图函数能够访问请求对象,一个显而易见的方式是将其作为参数传入视图函数,不过这会导致程序中的每个视图函数都增加一个参数。除了访问请求对象,如果视图函数在处理请求时还要访问其他对象,情况会变得更糟。为了避免大量可有可无的参数把视图函数弄得一团糟,Flask 使用上下文临时把某些对象变为全局可访问。有了上下文,就可以写出下面的视图函数:

python">from flask import Flask, requestapp = Flask(__name__)@app.route('/')
def index():user_agent = request.headers.get('User-Agent')return f'<p>Your browser is {user_agent}</p>'if __name__ == '__main__':app.run(debug=True)

image.png

在 Flask 中有两种上下文:程序上下文和请求上下文:

  • 在程序上下文中,你可以访问应用程序的全局变量,比如 current_app(当前应用程序实例)和 g(用于存储每个请求中的临时数据)
  • 在请求上下文中,你可以访问请求相关的全局变量,比如 request(代表当前请求对象)、session(用于存储用户会话数据)等

2、请求调度

程序收到客户端发来的请求时,要找到处理该请求的视图函数。为了完成这个任务,Flask会在程序的 URL 映射中查找请求的 URL。URL 映射是 URL 和视图函数之间的对应关系
Flask 使用 app.route 修饰器或者非修饰器形式的 app.add_url_rule() 生成映射

3、请求钩子

有时在处理请求之前或之后执行代码会很有用。例如,在请求开始时,我们可能需要创建数据库连接或者认证发起请求的用户。为了避免在每个视图函数中都使用重复的代码,Flask 提供了注册通用函数的功能,注册的函数可在请求被分发到视图函数之前或之后调用
请求钩子使用修饰器实现。Flask 支持以下 4 种钩子:

  • 注册一个函数,在处理第一个请求之前运行。before_first_request
  • 注册一个函数,在每次请求之前运行。before_request
  • 注册一个函数,如果没有未处理的异常抛出,在每次请求之后运行。after_request
  • 注册一个函数,即使有未处理的异常抛出,也在每次请求之后运行。teardown_request

4、响应

Flask 调用视图函数后,会将其返回值作为响应的内容
HTTP 协议需要的不仅是作为请求响应的字符串。HTTP 响应中一个很重要的部分是状态码,Flask 默认设为 200,这个代码表明请求已经被成功处理
如果视图函数返回的响应需要使用不同的状态码,那么可以把数字代码作为第二个返回值,添加到响应文本之后,例如返回404:

python">@app.route('/')
def index():user_agent = request.headers.get('User-Agent')return f'<p>Your browser is {user_agent}</p>', 404

image.png

视图函数返回的响应还可接受第三个参数,这是一个由首部(header)组成的字典,可以添加到 HTTP 响应中,例如下例创建了一个响应对象,然后设置了 cookie:

python">@app.route('/')
def index():response = make_response('<h1>This document carries a cookie!</h1>')response.set_cookie('answer', '42')return response

image.png

重定向经常使用 302 状态码表示,指向的地址由 Location 首部提供。重定向响应可以使用 3 个值形式的返回值生成,也可在 Response 对象中设定。不过,由于使用频繁,Flask 提供了 redirect() 辅助函数,用于生成这种响应:

python">@app.route('/')
def index():return redirect('https://www.baidu.com')

5、Flask扩展

Flask 被设计为可扩展形式,故而没有提供一些重要的功能,例如数据库和用户认证
社区成员开发了大量不同用途的扩展,如果这还不能满足需求,你还可使用所有Python 标准包或代码库


http://www.ppmy.cn/devtools/27728.html

相关文章

Matlab无法使用GBK编码保存文件,改用UTF-8编码(已解决)

系统不让保存GBK格式编码。但是可以通过matlab另存为 的方式保持为UTF-8编码&#xff0c;如下操作。 然后 在弹出的窗口中&#xff0c;选择 UTF-8 可以保持在与源文件相同的文件夹内&#xff0c;将源文件覆盖掉。就可以了。

Unity镂空图像做法

问题和解决方案 现在要完成一个需求&#xff0c;即镂空中间部分的image&#xff0c;外围image可以定义颜色并可选屏蔽点击&#xff0c;而中间的image需要透明且可以穿透&#xff0c;必须不能屏蔽点击。 由此拆分成了两个问题&#xff1a; 1.定义外围image颜色&#xff0c;内…

docker seata

docker pull seataio/seata-server:1.6.1 数据库脚本&#xff1a; incubator-seata/script/server/db at master apache/incubator-seata GitHub #先启动服务 docker run -d --name seata -p 8091:8091 -p 7091:7091 seataio/seata-server:1.6.1 #将配置文件拷贝出来 …

项目运行到手机端

运行到真机 手机和点到连在同一个wifi网络下面点击hbuiler上面的预览得到一个&#xff0c;network的网址这个时候去在手机访问&#xff0c;那么就可以访问网页了 跨域处理 这个时候可能会访问存在跨域问题 将uniapp的H5版本运行到真机进行调试&#xff0c;主要涉及到跨域问题…

stable diffusion controlnet前处理中的图像resize

在SD controlnet应用中&#xff0c;一般都要先安装controlnet_aux&#xff0c;并在项目代码中import相关前处理模块&#xff0c;如下所示。 在对control image进行前处理&#xff08;比如找边缘&#xff0c;人体特征点&#xff09;之前&#xff0c;往往会图像进行resize&#x…

移动端H5页面使用Vant组件库下拉刷新和页面滚动事件冲突

Vant组件库van-pull-refresh踩坑 van-pull-refresh在开发过程会和内容中最近的拥有overflow的元素的滚动发生冲突&#xff0c;造成向上滑动的时候会下拉加载 <van-pull-refresh v-model"refreshing" refresh"onRefresh"><van-listv-model"…

FFmpeg基础知识详解:音频视频处理的强大工具

FFmpeg&#xff0c;这个强大的开源多媒体框架&#xff0c;已经成为全球范围内音频、视频处理和流媒体传输领域的基石。它集合了音频解码、编码、转码、混合、抓取、流化等多种功能于一身&#xff0c;几乎能满足任何与音视频处理相关的技术需求。本文将带你走进FFmpeg&#xff0…

FebHost:英国.UK域名种类详细讲解

英国域名管理机构负责监管英国的国家代码顶级域名.uk及其系列的二级域名&#xff0c;在域名分配方面&#xff0c;该域名后缀遵循严格的先到先得原则。与部分其他域名不同&#xff0c;大多数.uk域名并无明确注册要求限制。然而&#xff0c;也有例外&#xff0c;例如.ltd.uk等域名…