Flask简介

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 类的对象,经常使用下述代码创建:

from flask import Flaskapp = Flask(__name__)

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

路由和视图函数

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

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

启动服务器

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

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

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

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

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

image.png

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

image.png

一个完整的程序

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 使用上下文临时把某些对象变为全局可访问。有了上下文,就可以写出下面的视图函数:

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:

@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:

@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() 辅助函数,用于生成这种响应:

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

5、Flask扩展

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/5639.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《MySQL对库的基本操作》

文章目录 一、查看数据库列表查看数据库中的所有表想知道当前处于哪个数据库里 二、创建一个数据库三、删除一个数据库知道两个集1.字符集2.校验集修改数据库的字符集和编码集 不同的校验码对数据库的影响四、数据库的备份与恢复注意事项&#xff1a;备份数据库中的表 总结 一、…

现代神经网络总结(AlexNet VGG GoogleNet ResNet的区别与改进)

VGG NIN GoogleNet 1.VGG&#xff0c;NIN&#xff0c;GoogleNet的块结构图对比(注意:无AlexNet) 这些块带来的区别与细节 AlexNet未使用块,主要对各个层进行了解: 卷积:捕捉特征 relu:增强非线性 池化层:减少计算量 norm:规范数据分布 全连接层:分类VGG块的改善(对比AlexNe…

开源博客项目Blog .NET Core源码学习(18:App.Hosting项目结构分析-6)

本文学习并分析App.Hosting项目中后台管理页面的_AminLayout.cshtml模版页面和登录页面。 _AminLayout.cshtml模版页面 后台管理页面中的大部分页面都使用_AminLayout.cshtml作为模板页面&#xff0c;如下图所示&#xff0c;后台页面的视图内容放置在表单中&#xff0c;使用la…

wps用js宏给文档增加用户名密码验证

偶然看见别人一个给office文档增加验证的vba教程&#xff0c;觉得很有意思&#xff0c;就打开wps验证了一下 wps在windows版本支持vba和js&#xff0c;js默认&#xff0c;vba需要自己下载相关插件折腾&#xff0c;linux版本wps个人版默认没有支持2次开发的高级功能&#xff0c…

unity想让方法带一个默认参数怎么写

在C#中&#xff0c;包括Unity使用的C#版本&#xff0c;你可以为方法参数提供默认值。这允许你在调用方法时省略某些参数&#xff0c;并使用这些参数的默认值。以下是如何为一个方法参数设置默认值的示例&#xff1a; using UnityEngine; public class MyClass : MonoBehaviou…

【C++航海王:追寻罗杰的编程之路】C++11(四)

目录 1 -> 相关文章 【C航海王&#xff1a;追寻罗杰的编程之路】C11(一) 【C航海王&#xff1a;追寻罗杰的编程之路】C11(二) 【C航海王&#xff1a;追寻罗杰的编程之路】C11(三) 2 -> lambda表达式 2.1 -> C98中的一个例子 2.2 -> lambda表达式 2.3 ->…

Python 与 TensorFlow2 生成式 AI(三)

原文&#xff1a;zh.annas-archive.org/md5/d06d282ea0d9c23c57f0ce31225acf76 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第七章&#xff1a;使用 GAN 进行风格转移 神经网络在涉及分析和语言技能的各种任务中正在取得进步。创造力是人类一直占有优势的领域&…

关于ChatGPT的论文Demo

ChatGPT: 解锁人工智能的无限可能 引言 随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;逐渐成为改变世界的强大力量。而在众多AI技术中&#xff0c;ChatGPT以其独特的魅力和广泛的应用领域&#xff0c;吸引了全球的关注。本文将深入探讨ChatGPT的技术原理…

MetaGPT初体验之HelloWorld-Git教程编写

[目录] 1.环境准备 2.效果预览 3.总结 4.智能体完整输出 5.源码及教程点我去AIGIS公众号查看本文 前言 5.1假期坚持研究智能体的玩法可以说非常敬业了。今天我们来小试一把目前GitHub最火爆智能体框架MetaGPT,让它给我们写一篇Git教程&#xff0c;看看是不是像传说中的那么神奇…

如何使用KCF算法。

KCF&#xff08;Kernelized Correlation Filters&#xff09;算法是一种高效的目标跟踪算法&#xff0c;它结合了核技巧和相关滤波器的思想。以下是使用KCF算法进行目标跟踪的一般步骤&#xff1a; 初始化&#xff1a; 在视频的第一帧中&#xff0c;手动选择或自动检测要跟踪的…

VSCode编译C++连接lib文件

期货CTP在Windows上需要连接静态链接库&#xff0c;在VS2022一切正常&#xff0c;在VSCode却始终失败。 原因是Windows系统的dll用的vs编译器&#xff0c;导出的Dll没有用extern c &#xff0c;gcc 编译各种坑。 最后通过在VSCode中配置VS2022的编译器&#xff0c;才终于成功。…

判断循环链表以及其环入口

文章目录 题目题目链接题目要求 解题思路方法一&#xff1a;哈希表方法二&#xff1a;双指针 进阶思考快指针一次走三步 进阶问题&#xff08;入口点&#xff09;题目链接题目要求问题思路 总结 题目 题目链接 环形链表 题目要求 解题思路 显而易见的是&#xff0c;单纯的遍…

day7 c++

整理代码 1、unique_ptr 指针 #include <iostream> #include <memory> using namespace std; class Demo {public:Demo(){cout<<"无参构造"<<endl;}~Demo(){cout<<"Demo的析构函数"<<endl;} };int main() {//unique…

python 笔记:cls VS self

cls&#xff1a; 用于类方法&#xff1a; cls 通常作为类方法&#xff08;用 classmethod 装饰&#xff09;中的第一个参数。它指代调用该方法的类本身&#xff0c;无论该类有没有被实例化访问类级别的属性和方法 通过 cls&#xff0c;可以访问类级别的属性和方法。可以通过 c…

【IDEA】IDEA自带Maven/JDK,不需要下载

IDEA是由Java编写的&#xff0c;为了保证其运行&#xff0c;内部是自带JDK的。IDEA 2021 及 之后的版本是自带Maven的&#xff1a; 视频连接&#xff1a; https://www.bilibili.com/video/BV1Cs4y1b7JC?p4&spm_id_frompageDriver&vd_source5534adbd427e3b01c725714cd…

理解Linux文件系统

文章目录 一、引言二、Linux文件系统概述1、文件系统的结构2、文件系统目录树的逻辑结构 二、文件系统的特性1、super block&#xff1a;文件系统的超级块2、inode&#xff1a;文件系统的索引节点3、inode table4、block&#xff1a;文件系统的数据块5、块组描述符表&#xff0…

链表例题(分割链表)

链接&#xff1a; . - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 即将小于特定值的节点放在前面&#xff0c;大于特定值的节点接在后面 思路&#xff1a; 我们可以创建两个链表分别存放大于的值和小于的值。5个变量&#xff08;记录链表当前位置的指针st…

Spring Kafka——基于 Spring Kafka 实现动态管理 Kafka 连接和 topic 的监听

文章目录 使用 Spring Kafka 动态管理 Kafka 连接和主题监听1. 前言2. 简单的消费程序配置3. Spring Kafka 主要的相关类的说明4. KafkaListener 注解的加载执行流程解析5. 动态监听消费订阅的设计与实现 使用 Spring Kafka 动态管理 Kafka 连接和主题监听 文章内容较长&#x…

云托管 代码 项目

代码(云)托管平台 国内&#xff1a; Coding&#xff08;https://coding.net&#xff09;&#xff1a;Coding是国内知名的代码托管平台&#xff0c;支持Git和SVN版本控制系统。它提供了代码托管、项目管理、协作开发、持续集成等功能&#xff0c;并且支持与其他开发工具的集成&a…

css div块标签内的多个英语单词怎样设置换行

背景&#xff1a; 在<div>标签内&#xff0c;当接口返回的字符串全是英文字母&#xff0c;不会自动换行。 原因&#xff1a;查过相关资料后才知道&#xff0c;只有英文文本才会出现不能自动换行的情况&#xff0c;&#xff08;中文不存在&#xff09;而原因是因为英文文本…