在flask中,含有名为 __init__.py 文件的子目录被视为包,可以被导入。
在命令行输入以下命令,创建一个名为app的目录:
(venv) $ mkdir app
在app目录中创建一个名为__init__.py的文件,包含以下代码:
app/__init__.py
from flask import Flask
app = Flask(__name__)
from app import routes
上面的脚本从flask包中导入了Flask类,并创建了一个应用实例。传递给Flask类的 __name__ 变量是一个Python预定义变量,这个变量被设置为使用它的模块的名称。当Flask需要加载相关资源如模板文件时,会将此处传递的模块的位置作为起点。在实际使用中,一般都会通过传递__name__变量配置Flask。然后,应用导入了现在还不存在的routes模块。
此处出现了2个app。app所在的目录和__init__.py 脚本定义定义了app包,并由 from app import routes语句引用。而app变量则是__init__.py 脚本中Flask类的实例,使之成为app包的一员。
另一个要注意的是routes模块是在脚本底部而不是顶部导入的。底部导入是循环导入的替代方法,是Flask应用的常见问题。因为接下来routes模块需要导入这个脚本中定义的app变量,所以在底部导入可以避免两个文件互相引用导致的错误。
那么routes模块是干什么的呢?在Flask中,应用路由的处理器是以Python函数的形式写的,叫做view functions(视图函数)。视图函数映射到一个或多个的路由URL,这样Flask才知道当客户端请求给定url时要执行的逻辑。
把这个视图函数写到名为app目录中名为routes.py的新模块中:
from app import app
@app.route('/')
@app.route('/index')
def index():
return "Hello, World!"
这个视图函数很简单,返回一个欢迎的字符串。函数上面的两个@app.route叫做装饰器,这是python语言的特性。装饰器装饰它后面的函数。装饰器的常见模式是将函数注册为某些事件的回调。在这个例子中,@app.route 装饰器在以参数形式给定的URL和函数之间创建关联。 这个例子的两个装饰器将URL / 和 /index 关联到这个函数。也就是说当web浏览器请求这两个URL时,Flask会调用这个函数并将它的返回值作为响应传回浏览器。
现在,创建一个名为manage.py的脚本,然后导入应用实例:
from app import app
这里又出现了2个app,Flask应用的实例叫做app,是app包的一员。 from app import app语句导入了app包中的app变量。感觉困惑的话可以把包名或者变量名改成别的。
现在,项目结构应该是这样的:
webapp/
venv/
app/
__init__.py
routes.py
manage.py
像这样设置环境变量:
(venv) $ export FLASK_APP=manage.py
windows就比较坑爹了,官方文档中说这么写:
(venv) $ set FLASK_APP=manage.py
但是实际也许不会成功,会提示以下错误:
Usage: flask run [OPTIONS]
Error: Could not locate Flask application. You did not provide the FLASK_APP environment variable.
For more information see http://flask.pocoo.org/docs/latest/quickstart/
我用的是PowerShell,网上找了一些方法,都不成功,后来按照Stack Overflow上这个方法来就成功了:
(venv) $env:FLASK_APP = "manage.py"
然后,在命令行输入flask run命令就可以运行flask了:
(venv) $ flask run
* Serving Flask app "projectname"
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
服务在IP地址127.0.0.1上运行,也叫localhost,这是本地的。网络服务器监听指定端口上的链接,在生产web服务器上部署的应用通常在443端口上监听,如果没有加密,有时是80端口,但对这些端口的访问需要管理员权限。由于目前程序在生产环境中运行,所以用的是5000端口,现在打开web浏览器,在地址栏输入以下URL:
http://localhost:5000/
或者这个URL:
http://localhost:5000/index