avatar

Flask学习总结

Flask概述

什么是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安装

1
2
3
4
5
6
7
8
pip install flask //本地安装了python环境后,使用pip安装,若速度较慢,可以考虑切换pip源
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
/***
附国内常用镜像源:
阿里云:https://mirrors.aliyun.com/pypi/simple/
中国科技大学:https://pypi.mirrors.ustc.edu.cn/simple/
清华大学:https://pypi.tuna.tsinghua.edu.cn/simple/
***/

Flask应用

Flask应用示例

1
2
3
4
5
6
7
8
9
from flask import Flask //导入Flask模块
app = Flask(__name__) //Falsk构造函数

@app.route('/') //route()函数是Flask装饰器,提供访问指定URL调用对应函数的入口。
def hello_world():
return 'Hello World'

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

函数用法

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

说明:在上示例应用中,’/‘URL与hello_world函数绑定,当浏览器打开web服务器时,将会呈现该函数的输出。

1
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脚本。在浏览器中打开(localhost:5000 或127.0.0.1:5000),输出”Hello World”消息。

Flask路由

路由: 不同的请求地址会交给路由处理来转发给相应的控制器处理,所以说路由就可以在转发前修改转发地址
Flask中的route()装饰器用于将URL绑定到函数。例如:

1
2
3
@app.route(‘/hello’)
def hello_world():
return ‘hello world’

在这里,URL ‘/ hello’ 规则绑定到hello_world()函数。 因此,如果用户访问http:// localhost:5000 / hello URLhello_world()函数的输出将在浏览器中呈现。
application对象的add_url_rule()函数也可用于将URL与函数绑定,如上例所示,使用route()
装饰器的目的也由以下表示:

1
2
3
def hello_world():
return ‘hello world’
app.add_url_rule(‘/’, ‘hello’, hello_world)

Flask URL构建

动态URL

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

1
2
3
4
5
6
7
8
9
from flask import Flask
app = Flask(__name__)

@app.route('/hello/<name>') //<name>为动态参数
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。

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

1
Hello w3cschool!

lask的URL规则基于Werkzeug的路由模块。这确保形成的URL是唯一的,并且基于Apache规定的先例。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
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”页面。

url_for

url_for()函数对于动态构建特定函数的URL非常有用。该函数接受函数的名称作为第一个参数,以及一个或多个关键字参数,每个参数对应于URL的变量部分。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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)

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

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

保存上面的代码并从Python shell运行。

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

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

1
Hello Admin

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

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

1
Hello mvl as Guest

Flask Requestdt对象

来自客户端网页 的数据作为全局请求对象发送到服务器。为了处理请求数据,应该从Flask模块导入。

Request对象的重要属性如下所列:

  • Form - 它是一个字典对象,包含表单参数及其值的键和值对。
  • args - 解析查询字符串的内容,它是问号(?)之后的URL的一部分。
  • Cookies - 保存Cookie名称和值的字典对象。
  • files - 与上传文件有关的数据。
  • method - 当前请求方法。

Flask模板应用

可以在 URL 规则中指定 http 方法。触发函数接收的 Form 数据可以以字典对象的形式收集它并将其转发到模板以在相应的网页上呈现它。

在以下示例中,‘/‘ URL 会呈现具有表单的网页(student.html)。填入的数据会发布到触发 result() 函数的 ‘/result’ URL

results() 函数收集字典对象中的 request.form 中存在的表单数据,并将其发送给 result.html

该模板动态呈现表单数据的 HTML 表格。

下面给出的是应用程序的 Python 代码:

1
2
3
4
5
6
7
8
9
10
11
12
from flask import Flask, render_template, request
app = Flask(name)
@app.route('/')
def student():
return render_template('student.html')
@app.route('/result',methods = ['POST', 'GET'])
def result():
if request.method == 'POST':
result = request.form
return render_template("result.html",result = result)
if name == 'main':
app.run(debug = True)

下面给出的是 student.html 的 HTML 脚本。

1
2
3
4
5
6
7
<form action="http://localhost:5000/result&quot" method="POST">
<p>Name <input type = "text" name = "Name" /></p>
<p>Physics <input type = "text" name = "Physics" /></p>
<p>Chemistry <input type = "text" name = "chemistry" /></p>
<p>Maths <input type ="text" name = "Mathematics" /></p>
<p><input type = "submit" value = "submit" /></p>
</form>

下面给出了模板( result.html )的代码:

1
2
3
4
5
6
7
8
9
<!doctype html>
<table border = 1>
{% for key, value in result.items() %}
&lt;tr&gt;
&lt;th&gt; {{ key }} &lt;/th&gt;
&lt;td&gt; {{ value }} &lt;/td&gt;
&lt;/tr&gt;
{% endfor %}
</table>

Flask Cookies

Request对象包含Cookie的属性,他是所有Cookie变量及对应值的字典对象,客户端已传输。除此之外,cookie还储存其网站的到期时间,路径和域名。
在Flask中对cookie的操作主要有

1.设置cookie:

设置cookie,默认有效期是临时cookie,浏览器关闭就失效

可以通过 max_age 设置有效期, 单位是秒

1
2
resp = make_response("success")   # 设置响应体
resp.set_cookie("w3cshool", "w3cshool", max_age=3600)

2.获取cookie

获取cookie,通过reques.cookies的方式, 返回的是一个字典,可以获取字典里的相应的值

1
cookie_1 = request.cookies.get("w3cshool")

3.删除cookie

这里的删除只是让cookie过期,并不是直接删除cookie

删除cookie,通过delete_cookie()的方式, 里面是cookie的名字

1
2
resp = make_response("del success")  # 设置响应体
resp.delete_cookie("w3cshool")

以下为Flask Cookies的简单示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from flask import Flask, make_response, request

app = Flask(__name__)

@app.route("/set_cookies")
def set_cookie():
resp = make_response("success")
resp.set_cookie("w3cshool", "w3cshool",max_age=3600) return resp

@app.route("/get_cookies")
def get_cookie():
cookie_1 = request.cookies.get("w3cshool") # 获取名字为Itcast_1对应cookie的值
return cookie_1

@app.route("/delete_cookies")
def delete_cookie():
resp = make_response("del success")
resp.delete_cookie("w3cshool")
return resp

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

设置cookies

运行应用程序,在浏览器中输入 127.0.0.1:5000/set_cookies 来设置cookies,

1
注意删除,只是让 cookie 过期。

Flask 会话(Sessions)

与Cookie不同,Session数据存储在服务器上,

Flask文件上传

处理文件上传需要一个HTML表单,将其entype属性设置为‘multipart/from-data’,通过request.files[file]对象的filename获取。可以在flask对象的配置设置中定义文件路径及大小限定。

app.config[‘UPLOAD_FOLDER’] 定义上传文件夹的路径
app.config[‘MAX_CONTENT_PATH’] 指定要上传的文件的最大大小(以字节为单位)

以下代码具有’/ upload’ URL规则,该规则在templates文件夹中显示’upload.html’,以及‘/ upload-file’ URL规则,用于调用uploader()函数处理上传过程。

‘upload.html’有一个文件选择器按钮和一个提交按钮。

1
2
3
4
5
6
7
8
9
10
11
<html>
<body>

<form action = "http://localhost:5000/uploader" method = "POST"
enctype = "multipart/form-data">
<input type = "file" name = "file" />
<input type = "submit"/>
</form>

</body>
</html>

您将看到如下所示的界面。

Flask File Uploading

选择文件后,单击提交。表单的post方法调用‘/ upload_file’ URL。底层函数uploader()执行保存操作。

以下是Flask应用程序的Python代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from flask import Flask, render_template, request
from werkzeug import secure_filename
app = Flask(__name__)

@app.route('/upload')
def upload_file():
return render_template('upload.html')

@app.route('/uploader', methods = ['GET', 'POST'])
def upload_file():
if request.method == 'POST':
f = request.files['file']
f.save(secure_filename(f.filename))
return 'file uploaded successfully'

if __name__ == '__main__':
app.run(debug = True)
文章作者: yookbu
文章链接: http://www.yookbu.xyz/Flask%E5%AD%A6%E4%B9%A0%E6%80%BB%E7%BB%93/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 yookbu
打赏
  • 微信
    微信
  • 支付寶
    支付寶

评论