$ mkdir myproject && cd myproject
$ virtualenv -p /usr/bin/python3 venv
$ . venv/bin/activate
pip3 install flask==1.0.2
python3
import flask
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello,World!'
那么这段代码做了什么?
- 首先我们导入了类 Flask。这个类的实例化将会是我们的 WSGI 应用。
- 接着,我们创建一个该类的实例。第一个参数是应用模块或包的名称,这样 Flask 才会知道去哪里寻找模板、静态文件等等。如果你使用的是单一的模块(就如本例),第一个参数应该使用
__name__
。 - 我们使用装饰器
route()
告诉 Flask 哪个URL
才能触发我们的函数。 - 定义一个函数,该函数名也是用来给特定函数生成 URLs,并且返回我们想要显示在用户浏览器上的信息。
使用 Python 解释器运行这个文件,注意这个文件不能取名为flask.py
,因为这会与 Flask 本身冲突。
运行这个应用既可以使用 flask 命令行也可以使用 Python 的 -m
调用 flask,在运行之前你需要设置 FLASK_APP
的环境变量来告诉终端需要运行哪个应用,在终端执行如下命令: (大家请注意,记得要切回 Code 目录,才能调用
$ export FLASK_APP=hello.py
$ flask run
* Serving Flask app "hello.py"
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
当你运行服务器,你会注意到它只能从你自己的计算机上访问,网络中其它任何的地方都不能访问。这是因为默认情况下是 debug 模式,只有应用中的一个用户可以执行你计算机上的任意 Python 代码。
如果你关闭 debug 或者信任你所在网络上的用户,可以让你的服务器对外公开可用,只需要在命令行中添加参数 --host=0.0.0.0
:
flask run --host=0.0.0.0
* Serving Flask app "hello.py"
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
使用 flask 命令行可以非常方便的启动一个本地开发服务器,但是每次修改代码后你都需要手动重启服务器。通过前面的启动后输出显示可以发现 Environment
为 production
,同时调试模式未开启 Debug mode: off
。
这样做并不好,Flask 能做得更好。如果启用了调试支持,在代码修改后服务器能够自动重载,并且如果发生错误,它会提供一个有用的调试器。
为了让所有的开发者特征可用(包括调试模式),在运行服务器之前可以设置 FLASK_ENV
环境变量为 development
:
$ export FLASK_ENV=development
$ export FLASK_DEBUG=1
$ flask run
* Serving Flask app "hello.py" (lazy loading)
* Environment: development
* Debug mode: on
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 221-951-275
上述命令做了以下几件事:
- 使调试器(debugger)可用
- 启动了代码改变自动的热加载
- 在 flask 应用中开启了 debug 模式
注意
尽管交互式调试器(debugger)不能在分叉(forking)环境下工作(这使得它几乎不可能在生产服务器上使用),它依然允许执行任意代码。这使它成为一个巨大的安全风险,因此它绝对不能用于生产环境。
运行中的调试器的截图,从截图可以看出在页面上有终端可以执行交互式命令