Flask 学习笔记

Flask 学习笔记(未完待续)

Flask 的安装(Python3)

1
$ pip install Flask

Flask 库可以直接通过 pip 直接安装,推荐使用 Python 虚拟环境安装并把每一个项目的虚拟环境分开。

在 Windows 下:

1
$ py -3 -m venv venv

安装完 Flask 就可以开始使用了。

一个最小的应用

一个最小的 Flask 应用如下:

1
2
3
4
5
6
from flask import Flask # 导入 Flask 类
app = Flask(__name__) # 创建 Flask 实例并初始化 APP

@app.route('/', methods=["POST","GET"]) #通过 route 装饰器告诉 Flask 触发函数的 url
def hello_world(): # 触发的函数和返回到浏览器的数据
return 'Hello, World!'

通过这个应用例子来分析一下 Flask 的构成。其中最主要的是 route 装饰器,这个装饰器通过正则表达式告诉 Flask 触发函数的 URL ,当你访问到这个 URL 的时候就会触发下面的函数。

由于这只是一个单文件,并不是一个项目,所以如果要跑起来的话还需要一些其他的设置。

如果是在 Windows 下,那么导出环境变量的语法取决于使用的是哪种命令行解释器。 在 Command Prompt 下:

1
C:\path\to\app>set FLASK_APP=hello.py

在 PowerShell 下:

1
PS C:\path\to\app> $env:FLASK_APP = "test.py"
1
2
3
4
5
6
7
8
PS F:\Study\Code\Python\test> python -m flask run

* Serving Flask app "test.py"
* 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)

通过 http://127.0.0.1:5000/ 就可以访问到了。再加上定义的路由就可以访问到某个接口上。之前定义的 ‘/‘ 路由就是这个 URL。

1
2
127.0.0.1 - - [15/Oct/2019 11:13:43] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [15/Oct/2019 11:13:43] "GET /favicon.ico HTTP/1.1" 404 -

同时服务器也可以收到访问请求包括方法和路由以及协议。

这个服务器只是一个简单的服务器,只能用于测试,不能用于正式服务器环境。

1
app.run(debug=True, host='0.0.0.0', port=8001)

可以通过 debug 属性开启调试模式,调试模式下改动代码会自动重新开启服务器。host 属性 0.0.0.0 代表可以让外界访问该地址的该端口。

变量规则

通过把 URL 的一部分标记为 <variable_name>就可以在 URL 中添加变量。标记的 部分会作为关键字参数传递给函数。通过使用 <conventer:variable_name> ,可以 选择性的加上一个转换器,为变量指定规则。请看下面的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@app.route('/user/<username>')
def show_user_profile(username):
# show the user profile for that user
return 'User %s' % escape(username)

@app.route('/post/<int:post_id>')
def show_post(post_id):
# show the post with the given id, the id is an integer
return 'Post %d' % post_id

@app.route('/path/<path:subpath>')
def show_subpath(subpath):
# show the subpath after /path/
return 'Subpath %s' % escape(subpath)
string (缺省值) 接受任何不包含斜杠的文本
int 接受正整数
float 接受正浮点数
path 类似 string ,但可以包含斜杠
uuid 接受 UUID 字符串

HTTP 方法

Web 应用使用不同的 HTTP 方法处理 URL 。当你使用 Flask 时,应当熟悉 HTTP 方法。 缺省情况下,一个路由只回应 GET 请求。 可以使用 route(装饰器的) methods 参数来处理不同的 HTTP 方法:

1
2
3
4
5
6
7
8
from flask import request

@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
return do_the_login()
else:
return show_the_login_form()

操作数据

1
2
3
4
5
6
7
8
9
10
11
from flask import request

@app.route('/login', methods=['POST', 'GET'])
def login():
error = None
if request.method == 'POST':
if valid_login(request.form['username'],
request.form['password']):
return log_the_user_in(request.form['username'])
else:
error = 'Invalid username/password'

通过 request.form 可以获取到前端表单的数据。

文件上传

1
2
3
4
5
6
7
8
from flask import request
from werkzeug.utils import secure_filename

@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
if request.method == 'POST':
f = request.files['the_file']
f.save('/var/www/uploads/' + secure_filename(f.filename))

通过 request 可以获取到前端的数据,再通过 Werkzeug 提供的 secure_filename 可以安全的获取到文件名,再将这个文件保存到服务器上。

1
2
3
4
5
6
7
8
9
10
from flask import request

@app.route('/')
def index():
username = request.cookies.get('username') # 获取cookie
# use cookies.get(key) instead of cookies[key] to not get a
# KeyError if the cookie is missing.
resp = make_response(render_template(...))
resp.set_cookie('username', 'the username')
return resp

注意, cookies 设置在响应对象上。通常只是从视图函数返回字符串, Flask 会把它们 转换为响应对象。如果你想显式地转换,那么可以使用 make_response()函数,然后再修改它。

重定向

1
2
3
4
5
6
7
8
9
10
11
12
13
from flask import abort, redirect, url_for

@app.errorhandler(401)
def page_not_found(error):
return render_template('page_not_found.html'), 401

@app.route('/')
def index():
return redirect(url_for('login'))

@app.route('/login')
def login():
abort(401)

通过 redirect 可以重定向到其他的页面,通过 abort 可以提前退出请求返回错误代码,通过 errorhandler 可以将错误重定向到指定的错误页面。

Session

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from flask import Flask, session, redirect, url_for, escape, request

app = Flask(__name__)

# Set the secret key to some random bytes. Keep this really secret!
app.secret_key = b'_5#y2L"F4Q8z\n\xec]/'

@app.route('/')
def index():
if 'username' in session:
return 'Logged in as %s' % escape(session['username'])
return 'You are not logged in'

@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
session['username'] = request.form['username']
return redirect(url_for('index'))
return '''
<form method="post">
<p><input type=text name=username>
<p><input type=submit value=Login>
</form>
'''

@app.route('/logout')
def logout():
# remove the username from the session if it's there
session.pop('username', None)
return redirect(url_for('index'))

通过 session 可以帮用户保存部分信息。