Flask知识学习
PART 1 基础部分
一、Flask 概述
什么是Web Framework?
Web Application Framework(Web应用程序框架)或简单的Web Framework(Web框架)表示一个库和模块的集合,使Web应用程序开发人员能够编写应用程序,而不必担心协议,线程管理等低级细节。
什么是Flask?
Flask是一个用Python编写的Web应用程序框架。 它由 Armin Ronacher 开发,他领导一个名为Pocco的国际Python爱好者团队。 Flask基于Werkzeug WSGI工具包和Jinja2模板引擎。两者都是Pocco项目。
WSGI
Web Server Gateway Interface(Web服务器网关接口,WSGI)已被用作Python Web应用程序开发的标准。 WSGI是Web服务器和Web应用程序之间通用接口的规范。
Werkzeug
它是一个WSGI工具包,它实现了请求,响应对象和实用函数。 这使得能够在其上构建web框架。 Flask框架使用Werkzeug作为其基础之一。
jinja2
jinja2是Python的一个流行的模板引擎。Web模板系统将模板与特定数据源组合以呈现动态网页。
Flask通常被称为微框架。 它旨在保持应用程序的核心简单且可扩展。Flask没有用于数据库处理的内置抽象层,也没有形成验证支持。相反,Flask支持扩展以向应用程序添加此类功能。
二、Flask 应用
为了测试 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)
上面给出的Python脚本是从Python shell执行的。
Python Hello.py
Python shell中的消息通知您:
- Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
三、Flask 路由
现代Web框架使用路由技术来帮助用户记住应用程序URL。可以直接访问所需的页面,而无需从主页导航。
Flask中的route()装饰器用于将URL绑定到函数。例如:
@app.route(‘/hello’)
def hello_world():
return ‘hello world’
在这里,URL ‘/ hello’ 规则绑定到hello_world()函数。 因此,如果用户访问http:// localhost:5000 / hello URL,hello_world()函数的输出将在浏览器中呈现。
application对象的add_url_rule()函数也可用于将URL与函数绑定,如上例所示,使用route()。
装饰器的目的也由以下表示:
def hello_world():
return ‘hello world’
app.add_url_rule(‘/’, ‘hello’, hello_world)
四、Flask 变量规则
通过向规则参数添加变量部分,可以动态构建URL。此变量部分标记为。它作为关键字参数传递给与规则相关联的函数。
在以下示例中,route()装饰器的规则参数包含附加到URL '/hello’的。因此,如果在浏览器中输入http://localhost:5000/hello/w3cschool作为URL,则’w3cschool’将作为参数提供给hello()函数。
from flask import Flask
app = Flask(name)
@app.route(’/hello/’)
def hello_name(name):
return ‘Hello %s!’ % name
if name == ‘main’:
app.run(debug = True)
将上述脚本保存为hello.py并从Python shell运行它。接下来,打开浏览器并输入URL http:// localhost:5000/hello/w3cschool。
以下输出将显示在浏览器中:
Hello w3cschool!
除了默认字符串变量部分之外,还可以使用以下转换器构建规则:
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()
从Python Shell运行上面的代码。访问浏览器中的URL http://localhost:5000/blog/11。
给定的数字用作show_blog()函数的参数。浏览器显示以下输出:
Blog Number 11
在浏览器中输入此URL - http://localhost:5000/rev/1.1
revision()函数将浮点数作为参数。以下结果显示在浏览器窗口中:
Revision Number 1.100000
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构建
url_for()函数对于动态构建特定函数的URL非常有用。该函数接受函数的名称作为第一个参数,以及一个或多个关键字参数,每个参数对应于URL的变量部分。
上述脚本有一个函数user(name),它接受来自URL的参数的值。
User()函数检查接收的参数是否与’admin’匹配。如果匹配,则使用url_for()将应用程序重定向到hello_admin()函数,否则重定向到将接收的参数作为guest参数传递给它的hello_guest()函数。
保存上面的代码并从Python shell运行。
打开浏览器并输入URL - http://localhost:5000/user/admin
浏览器中的应用程序响应是:
Hello Admin
在浏览器中输入以下URL - http://localhost:5000/user/mvl
应用程序响应现在更改为:
Hello mvl as Guest
六、Flask HTTP方法
Http协议是万维网中数据通信的基础。在该协议中定义了从指定URL检索数据的不同方法。
下表总结了不同的http方法:
默认情况下,Flask路由响应GET请求。但是,可以通过为route()装饰器提供方法参数来更改此首选项。
为了演示在URL路由中使用POST方法,首先让我们创建一个HTML表单,并使用POST方法将表单数据发送到URL。
将以下脚本另存为login.html
<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>
现在在Python shell中输入以下脚本: from flask import Flask, redirect, url_for, request app = Flask(__name__)
@app.route(’/success/’)
def success(name):
return ‘welcome %s’ % name
@app.route(’/login’,methods = [‘POST’, ‘GET’])
def login():
if request.method == ‘POST’:
user = request.form[‘nm’]
return redirect(url_for(‘success’,name = user))
else:
user = request.args.get(‘nm’)
return redirect(url_for(‘success’,name = user))
if name == ‘main’:
app.run(debug = True)
开发服务器开始运行后,在浏览器中打开login.html,在文本字段中输入name,然后单击提交。
表单数据将POST到表单标签的action子句中的URL。
http://localhost/login映射到login()函数。由于服务器通过POST方法接收数据,因此通过以下步骤获得从表单数据获得的“nm”参数的值:
user = request.form[‘nm’]
它作为变量部分传递给’/ success’ URL。浏览器在窗口中显示welcome消息。
在login.html中将方法参数更改为’GET’,然后在浏览器中再次打开它。服务器上接收的数据是通过GET方法获得的。通过以下的步骤获得’nm’参数的值:
User = request.args.get(‘nm’)
这里,args是包含表单参数对及其对应值对的列表的字典对象。与’nm’参数对应的值将像之前一样传递到’/ success’ URL。
七、Flask 模板
可以以HTML的形式返回绑定到某个URL的函数的输出。例如,在以下脚本中,hello()函数将使用
标签呈现’Hello World’。
但是,从Python代码生成HTML内容很麻烦,尤其是在需要放置变量数据和Python语言元素(如条件或循环)时。这需要经常从HTML中转义。
这是可以利用Flask所基于的Jinja2模板引擎的地方。而不是从函数返回硬编码HTML,可以通过render_template()函数呈现HTML文件。
Flask将尝试在templates文件夹中找到HTML文件,该文件存在于此脚本所在的文件夹中。
术语‘web templating system(web模板系统)’指的是设计一个HTML脚本,其中可以动态插入变量数据。web模板系统包括模板引擎,某种数据源和模板处理器。
Flask使用jinga2模板引擎。Web模板包含用于变量和表达式(在这些情况下为Python表达式)的HTML语法散布占位符,这些是在呈现模板时替换的值。
以下代码在templates文件夹中另存为hello.html 。
接下来,从Python shell运行以下脚本:
当开发服务器开始运行时,打开浏览器并输入URL - http://localhost:5000/hello/mvl
URL的变量部分插入{{name}}占位符。
Jinja2模板引擎使用以下分隔符从HTML转义。
{% … %}用于语句
{{ … }}用于表达式可以打印到模板输出
{# … #}用于未包含在模板输出中的注释
… ##用于行语句
在下面的示例中,演示了在模板中使用条件语句。hello()函数的URL规则接受整数参数。它被传递到hello.html模板。其中,比较接收的数字(marks)的值(大于或小于50),因此有条件地呈现HTML。
Python脚本如下:
请注意,条件语句if-else和endif包含在分隔符{%…%}中。
运行Python脚本并访问URL http://localhost/hello/60,然后访问http://localhost/hello/30,以查看HTML的输出是否有条件地更改。
Python循环结构也可以在模板中使用。在以下脚本中,当在浏览器中打开URL http://localhost:5000/result时,result()函数会将字典对象发送到模板results.html。
result.html的Template部分使用for循环将字典对象result{}的键和值对呈现为HTML表的单元格。
从Python shell运行以下代码:
将以下HTML脚本保存为templates文件夹中的result.html:
这里,对应于For循环的Python语句再次包含在{%…%}中,而表达式key和value放在{{}}中。
开发开始运行后,在浏览器中打开http://localhost:5000/result即可获得以下输出:
八、Flask 文件上传
在Flask中处理文件上传非常简单。它需要一个HTML表单,其enctype属性设置为“multipart / form-data”,将文件发布到URL。URL处理程序从request.files[]对象中提取文件,并将其保存到所需的位置。
每个上传的文件首先会保存在服务器上的临时位置,然后将其实际保存到它的最终位置。目标文件的名称可以是硬编码的,也可以从request.files[file]对象的filename属性中获取。但是,建议使用secure_filename()函数获取它的安全版本。
可以在Flask对象的配置设置中定义默认上传文件夹的路径和上传文件的最大大小。
app.config[‘UPLOAD_FOLDER’] 定义上传文件夹的路径
app.config[‘MAX_CONTENT_PATH’] 指定要上传的文件的最大大小(以字节为单位)
以下代码具有’/ upload’ URL规则,该规则在templates文件夹中显示’upload.html’,以及’/ upload-file’ URL规则,用于调用uploader()函数处理上传过程。
'upload.html’有一个文件选择器按钮和一个提交按钮。
选择文件后,单击提交。表单的post方法调用’/ upload_file’ URL。底层函数uploader()执行保存操作。
以下是Flask应用程序的Python代码。
PART 2 拓展部分
九、Flask 静态文件
十、Flask Request对象
十一、Flask 将表单数据发送到模板
十二、Flask Cookies
十三、Flask 会话
十四、Flask 重定向和错误
十五、Flask 消息闪现
十六、Flask 扩展
1、邮件
2、WTF
3、SQLite
4、SQLAlchemy
5、Sijax
十七、Flask部署
十八、Flask FastCGI
参考链接:
第一块:
flask入门 (一)初识flask,搭建第一个自己的网页
https://blog.csdn.net/s740556472/article/details/100555855
flask入门 (二)(不用写代码的前端!)
https://blog.csdn.net/s740556472/article/details/100577134
flask入门(三)静态文件
https://blog.csdn.net/s740556472/article/details/100620633
第二块:
W3Cschool Flask教程
https://www.w3cschool.cn/flask/