学习与转载自w3cschool,在w3cschool资料的基础上的个人摘录、实践与总结,如有错误望留言。

一、Flask 概述

2021-08-25 14:01 更新

1.1 什么是Web Framework?

Web Application Framework(Web应用程序框架)或简单的Web Framework(Web框架)表示一个库和模块的集合,使Web应用程序开发人员能够编写应用程序,而不必担心协议,线程管理等低级细节。

1.2 什么是Flask?

Flask是一个用Python编写的Web应用程序框架。 它由 Armin Ronacher 开发,他领导一个名为Pocco的国际Python爱好者团队。 Flask基于Werkzeug WSGI工具包和Jinja2模板引擎。两者都是Pocco项目。

1.3 WSGI

Web Server Gateway Interface(Web服务器网关接口,WSGI)已被用作Python Web应用程序开发的标准。 WSGI是Web服务器和Web应用程序之间通用接口的规范。

1.4 Werkzeug

它是一个WSGI工具包,它实现了请求,响应对象和实用函数。 这使得能够在其上构建web框架。 Flask框架使用Werkzeug作为其基础之一。

1.5 jinja2

jinja2是Python的一个流行的模板引擎。Web模板系统将模板与特定数据源组合以呈现动态网页。

Flask通常被称为微框架。 它旨在保持应用程序的核心简单且可扩展。Flask没有用于数据库处理的内置抽象层,也没有形成验证支持。相反,Flask支持扩展以向应用程序添加此类功能。一些受欢迎的Flask扩展将在本教程后续章节进行讨论。

二、Flask 环境

2022-04-22 18:53 更新

2.1为开发环境安装virtualenv

virtualenv是一个虚拟的Python环境构建器。它可以帮助用户并行创建多个Python环境。 因此,它可以避免不同版本的库之间的兼容性问题。

以下命令用于安装virtualenv:

pip install virtualenv

此命令需要管理员权限。您可以在Linux / Mac OS上的 pip 之前添加 sudo

如果您使用的是Windows,请以管理员身份登录。在Ubuntu上, virtualenv可以使用它的包管理器安装。

sudo apt-get install virtualenv

安装后,将在文件夹中创建新的虚拟环境。

mkdir newproj
cd newproj
virtualenv venv

要在 Linux / OS X 上激活相应的环境,请使用以下命令:

venv/bin/activate

要在 Windows 上激活相应的环境,可以使用以下命令:

venv\scripts\activate

我们现在准备在这个环境中安装Flask:

pip install Flask

上述命令可以直接运行,不需要系统范围安装的虚拟环境。

三、Flask 应用

2022-08-16 10:25 更新

为了测试 Flask 安装,请在编辑器中将以下代码输入 Hello.py:

from flask import Flask
app = Flask(__name__) @app.route('/')
def hello_world():
return 'Hello World' if __name__ == '__main__':
app.run()

必须在项目中导入Flask模块。

Flask类的一个对象是我们的WSGI应用程序。

Flask构造函数使用当前模块(__name __)的名称作为参数。

Flask类的route()函数是一个装饰器,它告诉应用程序哪个URL应该调用相关的函数。

app.route(rule, options)
  • rule 参数表示与该函数的URL绑定。
  • options 是要转发给基础Rule对象的参数列表。

在上面的示例中,'/ ' URL与hello_world()函数绑定。

因此,当在浏览器中打开web服务器的主页时,将呈现该函数的输出。

最后,Flask类的run()方法在本地开发服务器上运行应用程序。

app.run(host, port, debug, options)

所有参数都是可选的

序号 参数与描述
1 host 要监听的主机名。 默认为127.0.0.1(localhost)。设置为“0.0.0.0”以使服务器在外部可用
2 port 默认值为5000
3 debug 默认为false。 如果设置为true,则提供调试信息
4 options 要转发到底层的Werkzeug服务器。

上面给出的Python脚本是从Python shell执行的。

python Hello.py

Python shell中的消息通知您:

* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

在浏览器中打开上述URL(localhost:5000)。将显示“Hello World”消息。

这里注意,如果使用python自带的idle运行的时候可能会报以下错误:

Traceback (most recent call last): 

File “C:/learn/python/xuexi/web/demoflask/app.py”, line 27, in 

app.run(); 

File “C:\Users\zhang\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\app.py”, line 938, in run 

cli.show_server_banner(self.env, self.debug, self.name, False) 

File “C:\Users\zhang\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\cli.py”, line 629, in show_server_banner 

click.echo(message) 

File “C:\Users\zhang\AppData\Local\Programs\Python\Python36\lib\site-packages\click\utils.py”, line 217, in echo 

file = _default_text_stdout() 

File “C:\Users\zhang\AppData\Local\Programs\Python\Python36\lib\site-packages\click_compat.py”, line 621, in func 

rv = wrapper_func() 

File “C:\Users\zhang\AppData\Local\Programs\Python\Python36\lib\site-packages\click_compat.py”, line 385, in get_text_stdout 

rv = _get_windows_console_stream(sys.stdout, encoding, errors) 

File “C:\Users\zhang\AppData\Local\Programs\Python\Python36\lib\site-packages\click_winconsole.py”, line 261, in _get_windows_console_stream 

func = _stream_factories.get(f.fileno()) 

io.UnsupportedOperation: fileno

只要不用idle执行就不会出错了,不影响后续使用。改用cmd下Python执行或者pycharm等运行都能成功。

调试模式

通过调用run()方法启动Flask应用程序。但是,当应用程序正在开发中时,应该为代码中的每个更改手动重新启动它。为避免这种不便,请启用调试支持

如果代码更改,服务器将自行重新加载。它还将提供一个有用的调试器来跟踪应用程序中的错误。

在运行或将调试参数传递给run()方法之前,通过将application对象的debug属性设置为True来启用Debug模式

app.debug = True
app.run()
app.run(debug = True)

四、Flask 路由

2021-08-19 18:02 更新

现代Web框架使用路由技术来帮助用户记住应用程序URL。

可以直接访问所需的页面,而无需从主页导航。

Flask中的route()装饰器用于将URL绑定到函数。例如:

@app.route('/hello')def hello_world():
return 'hello world'

在这里,URL '/ hello' 规则绑定到hello_world()函数。

因此,如果用户访问http://localhost:5000/hello

hello_world()函数的输出将在浏览器中呈现。

application对象的add_url_rule()函数也可用于将URL与函数绑定,如上例所示,使用route()

装饰器的目的也由以下表示:

def hello_world():
return 'hello world'
app.add_url_rule('/', 'hello', hello_world)

五、Flask 变量规则

2022-08-16 10:36 更新

通过向规则参数添加变量部分,可以动态构建URL。

此变量部分标记为

它作为关键字参数传递给与规则相关联的函数。

在以下示例中,route()装饰器的规则参数包含附加到URL '/hello'

因此,如果在浏览器中输入http://localhost:5000/hello/w3cschool作为URL,则'w3cschool'将作为参数提供给 hello()函数。

from flask import Flask
app = Flask(__name__) @app.route('/hello/<name>')
def hello_name(name):
return 'Hello %s!' % name if __name__ == '__main__':
app.run(debug = True)

将上述脚本保存为hello.py并从终端运行它。

(YJ_py38) D:\szf\project\learn_flask>python Hello.py
* Serving Flask app 'Hello' (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

接下来,打开浏览器并输入URL http://127.0.0.1:5000/hello/boshu。

以下输出将显示在浏览器中:

Hello boshu!

除了默认字符串变量部分之外,还可以使用以下转换器构建规则:

序号 转换器 描述
1 int 接受整数
2 float 对于浮点值
3 **path ** 接受用作目录分隔符的斜杠

在下面的代码中,使用了所有这些构造函数:

from flask import Flask
app = Flask(__name__) @app.route('/blog/<int:postID>')
def show_blog(postID):
return 'Blog Number %d' % postID @app.route('/rev/<float:revNo>')
def revision(revNo):
return 'Revision Number %f' % revNo if __name__ == '__main__':
app.run()

运行上面的代码。访问浏览器中的URL http://http/127.0.0.1:5000/blog/11

给定的数字用作show_blog()函数的参数。浏览器显示以下输出:

Blog Number 11

在浏览器中输入此URL - http://localhost:5000/rev/2.5

revision()函数将浮点数作为参数。以下结果显示在浏览器窗口中:

Revision Number 2.500000

Flask的URL规则基于Werkzeug的路由模块。

这确保形成的URL是唯一的,并且基于Apache规定的先例。

考虑以下脚本中定义的规则:

from flask import Flask
app = Flask(__name__) @app.route('/flask')
def hello_flask():
return 'Hello Flask' @app.route('/python/')
def hello_python():
return 'Hello Python' if __name__ == '__main__':
app.run()

这两个规则看起来类似,但在第二个规则中,结尾增加斜杠(/)更规范。一个规范的URL,使用 /python/python/可以返回相同的输出。

但是,如果是第一个规则,/flask/ URL会产生“404 Not Found”页面。

六、Flask URL构建

2022-08-16 10:37 更新

url_for()函数对于动态构建特定函数的URL非常有用。

url_for()函数接受函数的名称作为第一个参数,以及一个或多个关键字参数,每个参数对应于URL的变量部分。

以下脚本演示了如何使用url_for()函数:

from flask import Flask, redirect, url_for
app = Flask(__name__)
@app.route('/admin')
def hello_admin():
return 'Hello Admin'
@app.route('/guest/<guest>')def hello_guest(guest):
return 'Hello %s as Guest' % guest
@app.route('/user/<name>')
def hello_user(name):
if name =='admin':
return redirect(url_for('hello_admin'))
else:
return redirect(url_for('hello_guest', guest = name))
if __name__ == '__main__':
app.run(debug = True)

上述脚本有一个函数hello_user (name),它接受来自URL的参数的值。

hello_user ()函数检查接收的参数是否与'admin'匹配。

如果匹配,则使用url_for()将应用程序重定向到hello_admin()函数,否则重定向到将接收的参数作为guest参数传递给它的hello_guest()函数。

运行。

打开浏览器并输入URL - http://localhost:5000/user/admin

浏览器中的应用程序响应是:

Hello Admin

在浏览器中输入以下URL - http://localhost:5000/user/boshu

应用程序响应现在更改为:

Hello boshu as Guest

七、Flask HTTP方法

2022-08-16 10:38 更新

HTTP协议是万维网中数据通信的基础。在该协议中定义了从指定URL检索数据的不同方法。

下表总结了不同的http方法:

序号 方法与描述
1 GET以未加密的形式将数据发送到服务器。最常见的方法。
2 HEAD和GET方法相同,但没有响应体。
3 POST用于将HTML表单数据发送到服务器。POST方法接收的数据不由服务器缓存。
4 PUT用上传的内容替换目标资源的所有当前表示。
5 DELETE 删除由URL给出的目标资源的所有当前表示。

默认情况下,Flask路由响应GET请求。但是,可以通过为route()装饰器提供方法参数来更改此首选项。

为了演示在URL路由中使用POST方法,首先让我们创建一个HTML表单,并使用POST方法将表单数据发送到URL。

将以下脚本另存为login.html

<html>
<body>
<form action = "http://localhost:5000/login" method = "post">
<p>Enter Name:</p>
<p><input type = "text" name = "nm" /></p>
<p><input type = "submit" value = "submit" /></p>
</form>
</body>
</html>

现在在Python shell中输入以下脚本:

from flask import Flask, redirect, url_for, request, render_template

app = Flask(__name__)

@app.route('/')
def index():
return render_template("login.html") @app.route('/success/<name>')
def success(name):
return 'welcome %s' % name @app.route('/login',methods = ['POST', 'GET'])
def login():
if request.method == 'POST':
print(1)
user = request.form['nm']
return redirect(url_for('success',name = user))
else:
print(2)
user = request.args.get('nm')
return redirect(url_for('success',name = user)) if __name__ == '__main__':
app.run()

开发服务器开始运行后,在浏览器中打开login.html,在文本字段中输入name,然后单击提交

表单数据将POST到表单标签的action子句中的URL。(#

)

http://localhost/login映射到login()函数。由于服务器通过POST方法接收数据(# if request.method == 'POST',

因此通过以下步骤获得从表单数据获得的“nm”参数的值:

user = request.form['nm']  # <p><input type = "text" name = "nm" /></p>  我们在text里写的是name,那么name就赋给了user

它作为变量部分传递给'/success' URL。浏览器在窗口中显示welcome 消息。

login.html中将方法参数更改为'GET',然后在浏览器中再次打开它。服务器上接收的数据是通过GET方法获得的。通过以下的步骤获得'nm'参数的值:

User = request.args.get('nm')

这里,args是包含表单参数对及其对应值对的列表的字典对象。与'nm'参数对应的值将像之前一样传递到'/ success' URL。

浏览器显示的结果还是一样的。

八、Flask 模板

2022-03-09 16:59 更新

在前面的实例中,视图函数的主要作用是生成请求的响应,这是最简单的请求。

视图函数有两个作用:

  • 处理业务逻辑
  • 返回响应内容

在大型应用中,把业务逻辑和表现内容放在一起,会增加代码的复杂度和维护成本.

  • 模板其实是一个包含响应文本的文件,其中用占位符(变量)表示动态部分,告诉模板引擎其具体的值需要从使用的数据中获取
  • 使用真实值替换变量,再返回最终得到的字符串,这个过程称为'渲染'
  • Flask 是使用 Jinja2 这个模板引擎来渲染模板

使用模板的好处

  • 视图函数只负责业务逻辑和数据处理(业务逻辑方面)
  • 而模板则取到视图函数的数据结果进行展示(视图展示方面)
  • 代码结构清晰,耦合度低

模板基本使用

在项目下创建 templates 文件夹,用于存放所有模板文件,并在目录下创建一个模板文件 html 文件 hello.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
我的模板html内容
</body>
</html>

创建视图函数,将该模板内容进行渲染返回

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def index():
return render_template('hello.html')

模板变量

代码中传入字符串,列表,字典到模板中

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def index():
# 往模板中传入的数据
my_str = 'Hello Word'
my_int = 10
my_array = [3, 4, 2, 1, 7, 9]
my_dict = {
'name': 'xiaoming',
'age': 18
}
return render_template('hello.html',
my_str=my_str,
my_int=my_int,
my_array=my_array,
my_dict=my_dict
)

模板中代码

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
我的模板html内容
<br />{{ my_str }}
<br />{{ my_int }}
<br />{{ my_array }}
<br />{{ my_dict }}
</body>
</html>

运行效果

我的模板html内容
Hello Word
10
[3, 4, 2, 1, 7, 9]
{'name': 'xiaoming', 'age': 18}

示例代码:

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def index():
my_int = 18
my_str = 'curry'
my_list = [1, 5, 4, 3, 2]
my_dict = {
'name': 'durant',
'age': 28
} # render_template方法:渲染模板
# 参数1: 模板名称 参数n: 传到模板里的数据
return render_template('hello.html',
my_int=my_int,
my_str=my_str,
my_list=my_list,
my_dict=my_dict) if __name__ == '__main__':
app.run(debug=True)
<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<title>Title</title>
</head> <body>
<h2>我是模板</h2>
{{ my_int }}
<br>
{{ my_str }}
<br>
{{ my_list }}
<br>
{{ my_dict }}
<hr>
<h2>模板的list数据获取</h2>
<hr>
{{ my_list[0] }}
<br>
{{ my_list.1 }}
<hr>
<h2>字典数据获取</h2>
<hr>
{{ my_dict['name'] }}
<br>
{{ my_dict.age }}
<hr>
<h2>算术运算</h2>
<br>
{{ my_list.0 + 10 }}
<br>
{{ my_list[0] + my_list.1 }}
</body> </html>

浏览器显示

Flask学习记录:在w3cschool资料的基础上的个人摘录、实践与总结的更多相关文章

  1. [ZHUAN]Flask学习记录之Flask-SQLAlchemy

    From: http://www.cnblogs.com/agmcs/p/4445583.html 各种查询方式:http://www.360doc.com/content/12/0608/11/93 ...

  2. Vue学习记录第一篇——Vue入门基础

    前面的话 Vue中文文档写得很好,界面清爽,内容翔实.但文档毕竟不是教程,文档一上来出现了大量的新概念,对于新手而言,并不友好.个人还是比较喜欢类似于<JS高级程序设计>的风格,从浅入深, ...

  3. zigbee 学习记录之一:资料搜索

    先从网络来一段资料吧,在学习过程中慢慢整理资料. <由于zigbee 以cc2530 51单片机为基础,Zstack为源头,比较成熟了,学习和摸索就从Zstack开始吧.没有师傅,就有从网络上大 ...

  4. Flask学习记录之Flask-SQLAlchemy

    Flask-SQLAlchemy库让flask更方便的使用SQLALchemy,是一个强大的关系形数据库框架,既可以使用orm方式操作数据库,也可以使用原始的SQL命令. Flask-Migrate ...

  5. 学习记录 java泛型资料

    java泛型资料: 1. 概述在引入范型之前,Java类型分为原始类型.复杂类型,其中复杂类型分为数组和类.引入范型后,一个复杂类型就可以在细分成更多的类型.例如原先的类型List,现在在细分成Lis ...

  6. Flask学习记录之Flask-Login

    Flask-Loging 可以方便的管理用户会话,保护路由只让认证用户访问 http://flask-login.readthedocs.org/en/latest/ 一.初始化Flask-Login ...

  7. Flask学习记录之Flask-Admin

    相信用过Django框架的都不会忘记它强大的Admin功能,Flask-admin是一款能够与Django Admin所媲美的扩展,能够快速创建Web管理界面,实现了用户.文件增删改查等常用功能:也可 ...

  8. Flask学习记录之MarkDown编辑文本

    为了让网页支持markdown编辑文本,使用如下了4个库 PageDown : 在前端提供一个可以实时将markdown内容转换成html文本进行效果预览的编辑器 Flask-PageDown: 这个 ...

  9. Flask学习记录之Flask-Migrate

    一.配置Flask-Migrate from flask.ext.migrate import Migrate, MigrateCommand migrate = Migrate(app,db) #第 ...

  10. Flask学习记录之Flask-WTF

    Flask-wtf时Wtforms库的flask框架扩展,能够方便的处理Web表单 一.定义一个web表单 使用flask-wtf时,每个web表单都由一个继承自flask.ext.wtf.Form的 ...

随机推荐

  1. 力扣141(Java)-环形链表(简单)

    题目: 给你一个链表的头节点 head ,判断链表中是否有环. 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环. 为了表示给定链表中的环,评测系统内部使用整数 pos ...

  2. TiDB、OceanBase、PolarDB-X、CockroachDB二级索引写入性能测评

    简介: 二级索引是关系型数据库相较于NoSQL数据库的一个关键差异.二级索引必须是强一致的,因此索引的写入需要与主键的写入放在一个事务当中,事务的性能是二级索引性能的基础.本次测试将重点关注不同分布式 ...

  3. Fluid — 云原生环境下的高效“数据物流系统”

    简介: 为了解决大数据.AI 等数据密集型应用在云原生计算存储分离场景下,存在的数据访问延时高.联合分析难.多维管理杂等痛点问题,南京大学 PASALab.阿里巴巴.Alluxio 在 2020 年 ...

  4. 配置审计(Config)配合开启OSS防盗链功能

    简介: 本文作者:紫极zj 本文将主要介绍利用[配置审计]功能,如何快速发现企业上云过程中,针对未配置防盗链的 OSS Bucket 定位及修复案例. 前言 配置审计(Config)将您分散在各地域的 ...

  5. Spring官方RSocket Broker 0.3.0发布: 快速构建你的RSocket架构

    ​简介:Spring官方的RSocket Broker其实开发已经非常久了,我以为会伴随着Spring Cloud 2021.0发布的,但是没有发生.不过Spring RSocket Broker还是 ...

  6. 阿里云CDN操控2.0版本正式发布

    ​简介: 2021年8月,阿里云边缘云CDN完成过去3年来最大的一次版本升级. 2021年8月,阿里云边缘云CDN完成过去3年来最大的一次版本升级.本次升级根据上万企业客户的使用反馈和行业应用特征,从 ...

  7. [FE] uViewUI u-navbar 曲线解决 uni onNavigationBarButtonTap 的限制与失效

    uni 自带的 navigation bar 对于普通的导航需求是够用的,也允许 onNavigationBarButtonTap 加点击事件. 但是会出现异常Bug,表现为在内部页面一番操作后,再返 ...

  8. [Auth] 浅谈 jwt token 的妙处

    无状态(易扩展). 有过期时间限制,相对安全(可以有多个有效的 token). 更轻量(适合少量信息),类似传统 query string 签名方式. 标准统一(跨语言). Refer:JWT Aut ...

  9. 使用 Uno Islands 在现有 WPF 里面嵌入 Uno 框架

    随着 2022 9 月份 Uno 发布了 4.5 版本,现有的 WPF 应用多了一个新的开发模式,那就是通过 Uno Islands 技术,在现有的 WPF 应用里面嵌入 Uno 应用.通过此方式可以 ...

  10. WPF 获取本机所有字体拿到每个字符的宽度和高度

    本文主要采用 GlyphTypeface 类尝试获取每个字符的宽度和高度的值,尽管这个方法和最终 WPF 布局使用的文本的宽度和高度是不相同的,但是依然可以作为参考 获取系统字体文件夹的文件 系统字体 ...