Flask-大体了解介绍

news2024/11/24 9:50:18


初识Flask

Flask是使用 Python编写的Web微框架。Web框架可以让我们不用关心底层的请求响应处理,更方便高效地编写Web程序。

Flask主要有两个依赖,一个是WSGI(Web Server Gateway Interface,Web服务器网关接口)工具集——Werzeug,另一个是Jinja2模板引擎

一、搭建开发环境

1.1、pip安装包

1.1.1、安装Flask

 $ pip install flask

Flask的依赖包:

名称与版本说明
Jinja2模板渲染引擎
MarkupSafeHTML字符转义工具
WerkzeugWSGI工具集,处理请求与响应,内置WSGI开发服务器、调试器和重载器
click命令行工具
itsdangerous提供各种加密签名功能

1.1.2、集成开发环境

(1)下载PyCharm

(2)创建项目

(3)设置Python解释器

二、Hello,Flask!

2.1、创建程序实例

安装Flask时,它会在Python解释器中创建一个flask包。

 from flask import Flask
 app = Flask(__name__)

2.2、注册路由

在一个Web应用里,客户端和服务器上的Flask程序的交互概况为:

  • 用户在浏览器输入URL访问某个资源
  • Flask接受用户请求并分析请求的URL
  • 为这个URL找到对应的处理函数
  • 执行函数并生成响应,返回给浏览器
  • 浏览器接收并解析响应,将信息显示在页面中

我们建立处理请求的函数,并为其定义对应的URL规则。只需为函数附加app.route()装饰器,并传入URL规则作为参数,我们就可以让URL与函数建立关联。这个过程称为注册路由,路由负责管理URL和函数之间的映射,这个函数则被称为视图函数

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

2.2.1、为视图绑定多个URL

把/h1和/hello都绑定到say_hello()函数上,用户访问这两个URL都会触发say_hello()函数

 @app.route('h1')
 @app.route('/hello')
 def say_hello():
     return '<h1>Hello Flask!</h1>'

2.2.2、动态URL

在URL规则中添加变量部分,使用“<变量名>”的形式表示。

@app.route('/greet/<name>')
 def greet(name):
     return f'<h1>Hello, %s</h1>' % name

这个视图的URL规则为/greet/<name>,那么类似/greet/foo、/greet/bar的请求都会触发这个视图函数。

当URL规则中包含变量时,如果用户访问的URL中没有添加变量,比如/greet,那么Flask在匹配失败后会返回一个404错误响应。解决:在app.route()装饰器里使用defaults参数设置URL变量的默认值

 @app.route('/greet',defaults={'name':'Programmer'})
 @app.route('/greet/<name>')
 def greet(name):
     return f'<h1>Hello, %s</h1>' % name
 ​
 # 上述代码等同于:
 @app.route('/greet')
 @app.route('/greet/<name>')
 def greet(name='Programmer'):
     return f'<h1>Hello, %s</h1>' % name

三、启动开发服务器

3.1、Run、Flask、Run!

Flask通过依赖包Click内置了一个CLI(Command Line Interface,命令行交互界面)系统。我们可以通过flask命令执行内置命令、扩展提供的命令或是我们自己定义的命令。其中flask run命令用来启动内置的开发服务器:

 $ flask run 
  * Debug mode: off
 WARNING: This is a development server. Do not use it in a p
 roduction deployment. Use a production WSGI server instead.
  * Running on http://127.0.0.1:5000
 Press CTRL+C to quit

打开浏览器访问这个地址,会看到网页上显示“Hello World!”

3.1.1、自动发现程序实例

一般需要提供程序实例所在模块的位置。Flask的自动探测存在以下规则:

  • 从当前目录寻找app.pywsgi.py模块,并从中寻找名为app或application的程序实例
  • 从环境变量FLASK_APP对应的值寻找名为app或application的程序实例

如果你的程序主模块是其他名称,比如hello.py,那么需要设置环境变量FLASK_APP,将包含程序实例的模块名赋值给这个变量。

 # Linux或macOS系统使用export命令:
 $ export FLASK_APP=hello
 ​
 # Windows系统中使用set命令:
 > set FLASK_APP=hello

3.1.2、管理环境变量

Flask的自动发现程序实例机制还有第三条规则:如果安装了python-dotenv,那么在使用flask run或其他命令时会使用它自动从.flaskenv文件和.env文件中加载环境变量。

3.1.3、使用PyCharm运行服务器

在PyCharm中,虽然我们可以使用内置的命令行窗口执行命令以启动开发服务器,但是在开发时使用PyCharm内置的运行功能更加方便。

类似配置:

Django项目编辑运行/调试配置_django run/debug configurations,怎么配置-CSDN博客

3.2、更多的启动选项

3.2.1、使服务器外部可见

上述启动的Web服务器默认是对外不可见的,可以在run命令后添加--host选项将主机地址设为0.0.0.0使其对外可见:

$ flask run --host=0.0.0.0

这会让服务器监听所有外部请求、个人计算器(主机)一般没有公网IP(公有地址),所以你的程序只能被局域网内的其他用户通过你的个人计算机的内网IP(私有地址)访问。

3.2.2、改变默认端口

Flask提供的Web服务器默认监听5000端口,可以在启动时传入参数来改变它:

$ flask run --port=8000

3.3、设置运行环境

开发环境(development enviroment)和生产环境(production environment)。

开发环境是指我们在本地编写和测试程序时的计算机环境,而生产环境与开发环境相对,它指的是网站部署上线供用户访问时的服务器环境

为了区分程序运行环境,Flask提供了一个FLASK_ENV环境变量用来设置环境,默认为production。在开发时,我们可以将其设为development,这回开启所有支持开发的特性。为了方便管理,我们将环境变量FLASK_ENV的值写入.flaskenv文件中:

$ flask run 
 * Debug mode: off
WARNING: This is a development server. Do not use it in a p
roduction deployment. Use a production WSGI server instead.
 * Running on http://127.0.0.1:5000
Press CTRL+C to quit

在开发环境下,调试模式(Debug Mode)将被开启,这时执行flask run启动程序会自动激活Werkzeug内置的调试器(debugger)和重载器(reloader)

3.3.1、调试器

当程序出错时,我们可以在网页上看到详细的错误追踪信息,这在调试错误时非常有用。

3.3.2、重载器

当我们对代码做了修改后,期望的行为是这些改动立刻作用到程序上。重载器的作用就是检测文件变动,然后重新启动开发服务器。当我们修改了脚本内容并保存后,会在命令行看到下面的输出:

Detected change in '/path/to/app.py',reloading
* Restarting with stat

四、Python Shell

在开发Flask程序时,我们并不会直接使用python命令启动Python Shell,而是直接使用flask shell命令:

$ flask shell
Python 3.11.5 (tags/v3.11.5:cce6ba9, Aug 24 2023, 14:38:34) [MSC v.1936 64 bit (AMD64)] on win32
App: app
Instance: D:\Python Web\Pycharm-project\flask\instance
>>>

# 可以执行exit()或quit()退出,在Windows系统上可以使用Crtl+Z并按住Enter退出,在Linux和macOS使用Ctrl+D退出

使用flask shell命令打开的Python Shell自动包含上下文,并且已经导入app实例:

>>> app
<Flask 'app'>
>>> app.name
'app'

五、Flask扩展

扩展(extension)即使用Flask提供的API接口编写的Python库,可以为Flask程序添加各种各样的功能。大部分Flask扩展用来集成其他库,作为Flask和其他库之间的薄薄的一层胶水。

以扩展实现Foo功能为例,这个扩展的名称将是Flask-Foo或Foo-Flask:

from flask import Flask
from flask_foo import Foo

app = Flask(__name__)
foo = Foo(app)

六、项目配置

在一个项目中,会用到许多配置:Flask提供的配置,扩展提供的配置、还有程序特定的配置。和平时的变量不同,这些配置变量都是通过Flask对象的app.config属性作为统一的接口来设置和获取,它指向的Config类实际上是字典的子类。

Flask提供了很多种方式来加载配置,比如:

app.config['ADMIN_NAME'] = 'Peter'

使用update()方法则可以一次加载多个值:

app.config.update(
	TESTING=True,
	SECRET_KEY='_5#...'
)

还可以把配置变量存储在单独的Python脚本、JSON格式的文件或是Python类中,config对象提供了相应的方法来导入配置。

和操作字典一样,读取一个配置就是从config字典里通过将配置变量的名称作为键值对取对应的值

value = app.config['ADMIN_NAME']

七、URL和端点

使用Flask提供的url_for()函数获取URL,当路由中定义的URL规则被修改时,这个函数总会返回正确 的URL。

调用url_for()函数时,第一个参数为端点(endpoint)值。在Flask中,端点用来标记一个视图函数以及对应的URL规则。端点的默认值为视图函数的名称,至于为什么不直接使用视图函数名,而要引入端点这个概念,会在后面了解:

# 比如
@app.route('/')
def index():
    return 'Hello Flask!'

这个路由的端点即视图函数的名称index,调用url_for('index')即可获取对应的URL,即"/"。

如果URL含有动态部分,那么我们需要在url_for()函数里面传入相应的参数,示例:

@app.route('/hello/<name>')
def greet(name):
	return 'Hello %s!' % name

这时使用url_for('say_hello',name='Jack')得到的URL为“/hello/Jack”。

八、Flask命令

通过创建任意一个函数,并为其添加app.cli.command()装饰器,我们就可以注册一个flask命令

# 创建一个自定义的hello()命令函数:打印一行问候
@app.cli.command()
def hello():
	click.echo('Hello Human!')
    
# 借助click模块的echo()函数,我们可以在命令行界面输出字符。

函数的名称即为命令名称,这里注册的命令即hello,我们可以使用flask hello命令来触发函数。作为替代,也可以在app.cli.command()装饰器中传入参数来设置命令名称,比如app.cli.command('say_hello')会把命令名称设置为say_hello,完整的命令即flask say_hello。

$ flask hello
Hello, Hunan

在命令行执行flask --help可以查看Flask提供的命令帮助文档,我们自定义的hello命令也会出现在输出的命令列表中:

$ flask --help
...
Commands:
  hello
  routes  Show the routes for the app.
  run     Run a development server.
  shell   Run a shell in the app context.

九、模板与静态文件

使用模板(template)和静态文件(static file)来生成更加丰富的网页。模板即包含程序页面的HTML文件,静态文件则是需要在HTML文件中加载的CSS和JavaScript文件,以及图片、字体文件等资源文件。

默认情况下,模板文件放在项目根目录中的templates文件夹中,静态文件存放在static文件夹下,这个两个文件夹需要和包含程序实例的模块处于同一个目录下,对应的项目结构示例如下:

hello/
	- templates/
	- static/
	- app.py

十、Flask与MVC架构

在MVC架构中,程序被分为三个组件:数据处理(Model)、用户界面(View)、交互逻辑(Controller Function)

粗略归类,如果想要使用Flask来编写一个MVC架构的程序,那么视图函数可以作为控制器(Controller),视图(View)则是Jinja2渲染的HTML模板,而模型(Model)可以使用其他库来实现。

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

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

相关文章

森林消防新利器:高扬程水泵的革新与应用/恒峰智慧科技

随着全球气候变化的加剧&#xff0c;森林火灾的频发已成为威胁生态安全的重要问题。在森林消防工作中&#xff0c;高效、快速的水源供给设备显得尤为重要。近年来&#xff0c;高扬程水泵的广泛应用&#xff0c;为森林消防工作带来了新的希望与突破。 一、高扬程水泵的技术优势 …

聚观早报 | 比亚迪首款新能源皮卡;苹果M4芯片有望登场

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 5月8日消息 比亚迪首款新能源皮卡 苹果M4芯片有望登场 红旗首款手机外观揭晓 一加13设计细节曝光 长城汽车4月销…

5本书带你走进大厂的云原生世界

大家好&#xff0c;我是王有志&#xff0c;一个分享硬核 Java 技术的金融摸鱼侠&#xff0c;欢迎大家加入 Java 人自己的交流群“共同富裕的 Java 人”。 今天和大家分享的主题是&#xff1a;大厂的云原生架构设计。公众号内回复关键字&#xff1a;【20240508】&#xff0c;即…

AI智能分析赋能EasyCVR视频汇聚平台,为安全生产监管提供保障

一、背景需求 为提升公共及生产安全监管&#xff0c;深入贯彻落实中央关于智慧城市、数字乡村的部署要求&#xff0c;视频设备融合管理已成为视频治理的必然趋势。针对当前部分地区在视频监控系统建设中存在的问题&#xff0c;如重点地区视频监控系统建设零散、视频监控数据孤…

行业新应用:电机驱动将成为机器人的动力核心

电机已经遍布当今社会人们生活的方方面面&#xff0c;不仅应用范围越来越广&#xff0c;更新换代的速度也日益加快。按照工作电源分类&#xff0c;可以将它划分为直流电机和交流电机两大类型。直流电机中&#xff0c;按照线圈类型分类&#xff0c;又可以分为有铁芯的电机、空心…

在Unity中制作和使用图集

文章目录 使用Unity内置Sprite Packer使用图集NGUI图集制作&#xff08;如果使用NGUI&#xff09;TextMeshPro中文支持 应用案例&#xff1a;在Unity中创建一个使用图集的UI界面场景设定步骤概览1. 准备UI元素2. 创建Sprite Atlas3. 使用图集中的Sprite4. 调整与布局5. 动态加载…

Chromium编译指南2024 Windows11篇-获取 Chromium 的源代码(五)

前言 在《Chromium编译指南2024&#xff08;四&#xff09;》中&#xff0c;我们完成了Git 的初始化配置。 现在&#xff0c;我们将进一步讨论如何获取 Chromium 的源代码&#xff0c;并准备构建所需的文件。 1. 获取Chromium的源代码 在合适的位置准备一个文件夹&#xff…

QSplitter分裂器的使用方法

1.QSplitter介绍 QSplitter是Qt框架提供的一个基础窗口控件类&#xff0c;主要用于分割窗口&#xff0c;使用户能够通过拖动分隔条来调节子窗口的大小。 2.QSplitter的添加方法 &#xff08;1&#xff09;通过Qt Creator的界面设计工具添加&#xff1b; &#xff08;2&#xf…

提升滞销商品处理效能,精细化库存管理的关键要素

一、明确滞销商品的概念 1. 什么是滞销商品 滞销商品是指在一定期限内&#xff0c;其销售量大大低于预期或市场需求的商品。具体来说&#xff0c;这些商品可能因为款式不新颖、功能落后、价格不合理、过时、质量不佳或其他因素而不受消费者欢迎&#xff0c;导致销售速度极慢或…

Java中Maven的依赖管理

依赖介绍 是指当前项目运行所需要的jar包&#xff0c;一个项目中可以引入多个依赖 配置 在pom.xml中编写<dependencies>标签 在<dependencies>中使用<dependency>引入标签 定义坐标的groupId、rtifactId、version 点击刷新按钮、引入新坐标 例如引入下…

Git与GitHub交互

注册 https://github.com/ 本地库与远程库交互方式 创建本地库并提交文件 创建远程库 在本地库创建远程库地址别名 查看现有远程库地址的别名 git remote -v 创建远程库地址别名 git remote add [别名] [远程地址] 远程路地址位置 示例 成员1推送 git push [别名] [分支…

21物联1班常用网络命令

常用网络命令 ipconfig&#xff08;配置&#xff09;ping(测试)命令1&#xff1a;ping 172.16.0.12&#xff1a;ping ip -t3&#xff1a;ping ip -l 3000&#xff08;注意每个之间都存在空格&#xff09;4&#xff1a;ping ip -n count netstat&#xff08;网络&#xff09;命令…

数据库数据恢复—SQL Server数据库ndf文件变为0KB的数据恢复案例

SQL Server数据库故障&#xff1a; 存储设备损坏导致存储中SQL Server数据库崩溃。对数据库文件进行恢复后&#xff0c;用户发现有4个ndf文件的大小变为0KB。该SQL Server数据库每10天生成一个大小相同的NDF文件&#xff0c;该SQL Server数据库包含两个LDF文件。 SQL Server数据…

C语言 | Leetcode C语言题解之第76题最小覆盖子串

题目&#xff1a; 题解&#xff1a; char* minWindow(char* s, char* t) {int tLen strlen(t);int hash[256] { 0 };for (int i 0; i < tLen; i)hash[t[i]];for (int i 0; i < 256; i) {if (0 hash[i])hash[i] INT_MIN;}int left, right, count, start, minLen, s…

一文搞懂大厂商品中心设计!

点击下方“JavaEdge”&#xff0c;选择“设为星标” 第一时间关注技术干货&#xff01; 免责声明~ 任何文章不要过度深思&#xff01; 万事万物都经不起审视&#xff0c;因为世上没有同样的成长环境&#xff0c;也没有同样的认知水平&#xff0c;更「没有适用于所有人的解决方案…

SOCKET编程(1):基本概念

基本概念 socket分类 socket提供了**流(stream)和数据报(datagram)**两种通信机制&#xff0c;即流socket和数据报socket 流socket基于TCP协议&#xff0c;是一个有序、可靠、双向字节流的通道&#xff0c;传输数据不会丢失、不会重复、顺序也不会错乱 数据报socket基于UDP…

面试笔记——工厂模式(简单工厂、工厂方法模式、抽象工厂模式)

场景需求&#xff1a;设计一个咖啡店点餐系统。 设计一个咖啡类&#xff08;Coffee&#xff09;&#xff0c;并定义其两个子类&#xff08;美式咖啡【AmericanCoffee】和拿铁咖啡【LatteCoffee】&#xff09;&#xff1b;再设计一个咖啡店类&#xff08;CoffeeStore&#xff09…

提升Go语言数学运算能力:math包使用指南

提升Go语言数学运算能力&#xff1a;math包使用指南 介绍数学函数的使用基本数学运算幂和根的计算三角函数对数计算 特殊数学常数和函数数学常数超越数学函数错误处理和精度问题 高级应用实例统计数据的标准偏差计算利用三角函数解决实际问题 性能优化技巧避免不必要的函数调用…

FebHost:为什么注册法国.FR域名?

注册 .FR 域名&#xff0c;意味着您的网站将主要面向法国市场。法国不仅是欧盟内购买力第二强的经济体&#xff0c;也是全球第七大经济体。值得注意的是&#xff0c;法语是29个国家的官方语言&#xff0c;使用人数约达2.7亿。一旦您拥有了 .FR 域名&#xff0c;就能向这个具有强…

如何查看近50年的历史影像?

天地图最近上线了2024版&#xff0c;全面更新了覆盖全国的在线地图服务。 本次更新首次开放多时相卫星影像&#xff0c;可查看32个省级节点近半个世纪的历史影像。 2024版天地图有哪些更新&#xff1f; 2024版天地图的更新优化主要包括&#xff1a; 1、新增上海市黄浦区、徐…