Flask-大体了解介绍


初识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 Flaskapp = 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: offWARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.* Running on http://127.0.0.1:5000Press 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 Fooapp = 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:helloroutes  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.mzph.cn/bicheng/9868.shtml

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

相关文章

ICode国际青少年编程竞赛- Python-4级训练场-太阳能板1

ICode国际青少年编程竞赛- Python-4级训练场-太阳能板1 1、 Dev.step(3) Dev.turnRight() Dev.step(2) while Dev.energy < 60:wait() Dev.step(-6)2、 Dev.step(7) while Dev.energy < 90:wait() Dev.step(-1) Dev.turnRight() Dev.step(7)3、 Dev.step(4) Dev.turn…

C++面向对象的四大特征

抽象&#xff08;Abstraction&#xff09;&#xff1a; 抽象是指从众多事物中提取出共性的、本质的特征&#xff0c;并忽略非本质的细节&#xff0c;从而形成一种对事物更高级、更一般的描述。在C中&#xff0c;类&#xff08;class&#xff09;是抽象的体现&#xff0c;它定义…

区块链 | NFT 水印:Review on Watermarking Techniques(三)

&#x1f34d;原文&#xff1a;Review on Watermarking Techniques Aiming Authentication of Digital Image Artistic Works Minted as NFTs into Blockchains 一个 NFT 的水印认证协议 可以引入第三方实体来实现对交易的认证&#xff0c;即通过使用 R S A \mathsf{RSA} RSA…

(十)JSP教程——config对象

config对象是脚本程序配置对象&#xff0c;表示当前JSP页面的配置信息。由于JSP页面通常无需配置&#xff0c;因此该对象在JSP页面中比较少见。 config对象可以读取一些初始化参数的值&#xff0c;而这些参数一般在web.xml配置文件中可以看到&#xff0c;并通过config对象的相应…

国内护眼台灯品牌哪些实用?推荐五款物美价廉的台灯品牌

近年来&#xff0c;我们注意到儿童近视的现象呈现出增多且趋于低龄化的趋势。这一变化&#xff0c;部分原因可以归咎于孩子们越来越多地使用电子产品&#xff0c;另一部分则与他们面临的学业压力增加有关。鉴于此&#xff0c;家长们在挑选儿童学习用品时变得格外谨慎&#xff0…

GESP 四级题单(困难) • 附免费参考答案

GESP 四级题单 [GESP202309 四级] 变长编码题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 样例 #3样例输入 #3样例输出 #3 参考答案代码解析 [GESP202403 四级] 做题题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示数据规…

Sqli-labs第五~八关(布尔盲注)

目录 首先找到他们的闭合方式 操作 总结&#xff1a; 第五关根据页面结果得知是字符型但是和前面四关还是不一样是因为页面虽然有东西。但是只有对于请求对错出现不一样页面其余的就没有了。这个时候我们用联合注入就没有用&#xff0c;因为联合注入是需要页面有回显位。如果…

微信小程序父子组件通信

1. 属性传值 属性传值是最常见、也是最基础的父子组件通信方式之一。在微信小程序中&#xff0c;父组件可以通过在子组件上绑定属性的方式向子组件传递数据&#xff0c;子组件则可以通过监听属性的变化来获取父组件传递过来的数据。 实现原理 父组件在使用子组件时&#xff…

UDP socket编程示例

服务端&#xff1a; #include <iostream> #include <cstring> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h>const int BUFFER_SIZE 1024;//TODO 使用多线…

鸿蒙开发接口Ability框架:【@ohos.application.Want (Want)】

Want Want模块提供系统的基本通信组件的能力。 说明&#xff1a; 本模块首批接口从API version 8 开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import Want from ohos.application.Want; 开发前请熟悉鸿蒙开发指导文档&#xff1…

nginx--rewrite

功能 Nginx服务器利用ngx_http_rewrite_module 模块解析和处理理rewrite请求&#xff0c;此功能依靠PCRE(Perl Compatible Regular Expressions)&#xff0c;因此编译之前要安装PCRE库&#xff0c;rewrite是nginx服务器的重要功能之一&#xff0c;用于实现URL的重写&#xff0…

力扣:300. 最长递增子序列(Java,动态规划)

目录 题目描述&#xff1a;示例 1&#xff1a;示例 2&#xff1a;代码实现&#xff1a; 题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中…

《Video Mamba Suite》论文笔记(4)Mamba在时空建模中的作用

原文翻译 4.4 Mamba for Spatial-Temporal Modeling Tasks and datasets.最后&#xff0c;我们评估了 Mamba 的时空建模能力。与之前的小节类似&#xff0c;我们在 Epic-Kitchens-100 数据集 [13] 上评估模型在zero-shot多实例检索中的性能。 Baseline and competitor.ViViT…

【网络编程】UDP协议和TCP协议1

UDP协议格式 UDP 报文分为 UDP 报头和 UDP 数据区两部分。报头由 4 个 16 位长&#xff08;2字节&#xff09;字段组成&#xff0c;分别说明该报文的源端口、目的端口、报文长度和校验值。 UDP协议如何将报头和有效载荷分离 UDP报头是一种定长报头&#xff0c;长度为8个字节。…

QCC3071/QCC3081/QCC3083/QCC3084/QCC5171/QCC5181/QCC3091/QCC3095平台LDAC解码

QCC3071/QCC3081/QCC3083/QCC3084/QCC5171/QCC5181/QCC3091/QCC3095平台LDAC解码 LDAC Decoder Evaluation Kit for QCC5181 and QCC5171 (The 5181 Kit) 随着Qualcomm DSP向下开放&#xff0c;QCC3071/QCC3081/QCC3083/QCC3084目前可以可以实现LDAC Decoder。 QCC3071/QCC3…

【Shell脚本】Shell编程之循环语句

目录 一.循环语句 1.for语句的结构 1.1.格式 1.2.实操案例 案例1. 案例2. 案例3. 案例4. 2.while语句的结构 2.1.格式 2.2.实操案例 案例1. 案例2. 案例3. 案例4. 3.until循环命令 3.1.格式 3.2.实操案例 案例1. 二.补充 1.常用转义符 一.循环语句 1.for…

56 关于 linux 的 oom killer 机制

前言 这里主要讲的是 linux 的 oom killer 机制 在系统可用内存较少的情况下&#xff0c;内核为保证系统还能够继续运行下去&#xff0c;会选择杀掉一些进程释放掉一些内存。 通常oom_killer的触发流程是&#xff1a;进程A想要分配物理内存&#xff08;通常是读写内存&#…

笨方法自学python(九)-读写文件

读取文件 前面已经学过了 input 和 argv&#xff0c;这些是你开始学习读取文件的必备基础。你可能需要多多实验才能明白它的工作原理&#xff0c;这节练习涉及到写两个文件。一个正常的 ex15.py 文件&#xff0c;另外一个是 ex15_sample.txt&#xff0c;第二个文件并不是脚本&…

如何从yaml取值,如何处理编码,使用BeautifulSoup解析网页获取数据

import requests from bs4 import BeautifulSoup import yaml import chardet #从doctor.yaml里面引入网址 with open(doctor.yaml, r, encodingutf-8) as file:urls_data yaml.safe_load(file) #把查出的数据写入doctor_info.txt中 with open(doctor_info.txt, w, encodingut…

图像锐化——非锐化掩膜USM和锐化掩膜SM(附代码)

非锐化掩膜 (USM) 和锐化掩膜 (SM) 都是常用的图像锐化技术。它们都可以通过增强图像的边缘信息来提高图像的清晰度。 目录 一、非锐化掩膜USM1.1 USM原理1.2 USM实现步骤1.3 优点1.4 代码 二、锐化掩膜SM2.1 SM原理2.2 SM实现步骤2.3 优点2.4 代码 三、锐化效果四、总结4.1 效…