上一节我们简单的创建了一个 Flask 应用,从宏观上里看到了 Flask 提供的功能的诸多方面,包括 Debug ,路由,静态文件,渲染模板,Request ,Response 对象,Cookies ,Sessions 对象,打印日志,错误和重定向等等。接下来就每个具体问题详细学习。
工程布局
首先为这个工程创建文件夹 flasklearn 并进入文件夹,参照之前的方法创建 python 虚拟环境激活后在虚拟环境中安装 flask
这样就创建了一个虚拟环境 venv,他的目录结构是这样的,flasklearn 文件夹里面创建了名称为 venv 的虚拟环境文件夹,venv 里面包含了虚拟环境依赖的各种库和脚本文件,我们就通过存放脚本的文件夹 Scripts 里面的 activate 文件(作用就是用来激活当前虚拟环境)来激活创建的这个虚拟环境,准备工作做好了,最后在虚拟环境中为我们的工程安装 flask 。
当我们的工程变得非常大的时候,一个文件就会变得很庞大。python 工程利用包把代码组织成多个模块,需要的时候就导入相应的模块。
这个工程目录包括:
- flaskr/,他是一个包含了应用的代码和文件的 Python 包。
- tests/,他是一个包含了测试模块的目录。
- venv/,Python 虚拟环境,里面安装了 Flask 以及其他的一些依赖。
- 安装文件告诉 python 怎么安装你的工程。
- 版本控制,比如 Git 。
- 未来你可能添加的其他工程。
最后,工程布局看起来像下面这样:
/home/user/Projects/flasklearn
├── flaskr/
│ ├── __init__.py
│ ├── db.py
│ ├── schema.sql
│ ├── auth.py
│ ├── blog.py
│ ├── templates/
│ │ ├── base.html
│ │ ├── auth/
│ │ │ ├── login.html
│ │ │ └── register.html
│ │ └── blog/
│ │ ├── create.html
│ │ ├── index.html
│ │ └── update.html
│ └── static/
│ └── style.css
├── tests/
│ ├── conftest.py
│ ├── data.sql
│ ├── test_factory.py
│ ├── test_db.py
│ ├── test_auth.py
│ └── test_blog.py
├── venv/
├── setup.py
└── MANIFEST.in
应用安装
一个 Flask 应用就是一个 Flask 类的实例。所有关于这个应用的如配置和 URLs,都会随着这个类注册。
创建一个 Flask 应用最直接的方法就是在代码的开头创建一个全局的 Flask 实例,就像之前的 "Hello ,World"那样,但是项目很大的时候就会出现许多不可预知的问题。因此取而代之的是,在函数里面创建 Flask 实例,这个函数叫做 application factory,任何配置,注册以及其他这个应用的安装都会在这个函数里面发生,然后,这个应用会返回。
下面就看一下这个 application factory
创建 flaskr 目录然后添加 __init__.py 文件。这个 __init__.py 有2个作用:一是包含 application factory,另外就是表明 flaskr 是一个 python 包。
mkdir flaskr
flaskr/__init__.py
import os
from flask import Flask
def create_app(test_config=None):
# create and configure the app
app = Flask(__name__, instance_relative_config=True)
app.config.from_mapping(
SECRET_KEY='dev',
DATABASE=os.path.join(app.instance_path, 'flaskr.sqlite'),
)
if test_config is None:
# load the instance config, if it exists, when not testing
app.config.from_pyfile('config.py', silent=True)
else:
# load the test config if passed in
app.config.from_mapping(test_config)
# ensure the instance folder exists
try:
os.makedirs(app.instance_path)
except OSError:
pass
# a simple page that says hello
@app.route('/hello')
def hello():
return 'Hello, World!'
return app
create_app 就是 application factory 函数,他做了几件事。
- app = Flask(__name__,instance_relative_config=True) 创建 Flask 实例
__name__ 是当前 Python 模块的名称,这个 APP 需要知道他的位置来安装一些路径。
instance_relative_config=True 告诉 app 配置文件,实例文件在 flaskr 包的外部,能够保存不应该传送到版本控制的局 部数据,比如配置隐私和数据库文件。
- app.config.from_mapping() 设置了一些 app 将会用到的默认配置
SECRET_KEY 主要用来保证数据安全,他设置为 'dev' 在开发的时候提供了一个合适的值,但是在应用的时候应该被重 写为一个随机值。
DATABASE 是 SQLite 数据库文件将会被保存的路经,他在 app.instance_path 之下,这是 Flask 为实例文件夹选择的路径
- app.config.from_pyfile() 用实力文件夹中 config.py 文件的值重写默认配置
Test_config 也可以传到这个 factor,会被用来代替实例配置。
- os.makedirs() 保证 app.instance_path 的存在,Flask 不会自动穿件这个实例文件,但是他需要被创建因为你的工程将会在这里创建 SQLite 数据库文件。
- @app.route() 创建一个简单的路径。他创建了一个 URL /hello 和返回一个 response 的函数之间的连接。
运行应用
接下来就可以告诉终端你的应用的位置,然后用 flask 命令以 development 的模式运行应用。
在浏览器的 5000 端口就可以看到效果