flask-tutorial记录

https://github.com/luhuisicnu/The-Flask-Mega-Tutorial-zh

相关代码记录在了 https://github.com/xunzhanggzl/flask-tutorial 这个仓库中,通过 git checkout <标签名>查看不同标签的所有代码。

Hello World

v1.0

虚拟环境

Python3创建虚拟环境

在 Python3 中,虚拟环境由 Python 标准库中的 venv 包原生支持,-m venv 选项的作用是以独立的脚本运行标准库中的 venv 包,后面的参数为虚拟环境的名称,通常为 venv

1
python3 -m venv /path/to/new/virtual/environment

下面这个命令在执行完毕后,根目录中会出现一个名为 venv 的子目录,这里就是一个全新的虚拟环境,包含这个项目专用的 Python 解释器。

下面的 microblog 是根目录

1
2
# python3 要改成 python 才可以,不知道为啥
microblog>python -m venv venv

使用虚拟环境

1
2
3
4
5
6
7
# 进入虚拟环境
microblog>venv\Scripts\activate

(venv) microblog>

# 退出虚拟环境
(venv) microblog>venv\Scripts\deactivate

安装Flask

1
(venv) microblog>pip install flask

“Hello World”

应用程序是存在于中的。 在Python中,包含__init__.py文件的子目录被视为一个可导入的包。 当你导入一个包时,__init__.py会执行并定义这个包暴露给外界的属性。

那就创建一个名为app的包来存放整个应用吧。

__init__.py

1
2
3
4
5
from flask import Flask

app = Flask(__name__)

from app import routes

上面的脚本仅仅是从flask中导入的类Flask,并以此类创建了一个应用程序对象。 传递给Flask类的__name__变量是一个Python预定义的变量,它表示当前调用它的模块的名字。FLASK用这个参数确定应用的位置,进而找到应用中其他文件的位置,例如图像和模板。 代码的最后,应用程序导入尚未存在的routes模块。

其一,这里有两个实体名为appapp包由app目录和__init__.py脚本来定义构成,并在from app import routes语句中被引用。 app变量被定义为__init__.py脚本中的Flask类的一个实例,以至于它成为app包的属性。

其二,routes模块是在底部导入的,而不是在脚本的顶部。 最下面的导入是解决循环导入的问题,这是Flask应用程序的常见问题。 你将会看到routes模块需要导入在这个脚本中定义的app变量,因此将routes的导入放在底部可以避免由于这两个文件之间的相互引用而导致的错误。

那么在routes模块中有些什么? 路由是应用程序实现的不同URL。 在Flask中,应用程序路由的处理逻辑被编写为Python函数,称为视图函数。 视图函数被映射到一个或多个路由URL,以便Flask知道当客户端请求给定的URL时执行什么逻辑。

routes.py

1
2
3
4
5
6
from app import app

@app.route('/')
@app.route('/index')
def index():
return "Hello, World!"

函数上面的两个奇怪的@app.route行是装饰器,这是Python语言的一个独特功能。 装饰器会修改跟在其后的函数。 装饰器的常见模式是使用它们将函数注册为某些事件的回调函数。在这个例子中,有两个装饰器,它们将URL //index索引关联到这个函数。 这意味着,当Web浏览器请求这两个URL中的任何一个时,Flask将调用该函数并将其返回值作为响应传递回浏览器。这样做是为了在运行这个应用程序的时候会稍微有一点点意义。

要完成应用程序,你需要在定义Flask应用程序实例的顶层(译者注:也就是microblog目录下)创建一个命名为microblog.py的Python脚本。 它仅拥有一个导入应用程序实例的行:

1
from app import app

还记得两个app实体吗? 在这里,你可以在同一句话中看到两者。 Flask应用程序实例被称为app,是app包的成员。from app import app语句从app包导入其成员app变量。 如果你觉得这很混乱,你可以重命名包或者变量。

设置环境变量

为方便起见,用 $ 替代 microblog

1
(venv) $ set FLASK_APP=microblog.py

运行

1
(venv) $ flask run

python-dotenv

在终端会话中直接设置的环境变量不会永久生效,因此你不得不在每次新开终端时设定 FLASK_APP 环境变量,从 1.0 版本开始,Flask 允许你设置只会在运行flask命令时自动注册生效的环境变量,要实现这点,你需要安装 python-dotenv

1
(venv) $ pip install python-dotenv

此时,在项目的根目录下新建一个名为 .flaskenv 的文件,其内容是:

1
FLASK_APP=microblog.py

通过此项设置,FLASK_APP就可以自动加载了

查看依赖

pip freeze

1
2
3
4
5
6
7
8
(venv) $ pip freeze
Click==7.0
Flask==1.1.1
itsdangerous==1.1.0
Jinja2==2.10.1
MarkupSafe==1.1.1
python-dotenv==0.10.3
Werkzeug==0.15.6