写在最前
后台编辑器对代码块的支持并不友好, 因此代码块大部分以图片的形式展现, 最后可能会把代码放到 github 上, 链接会在最后给出在篇文章的示例中,所有的 API 的返回都是 JSON使用到的扩展 flask-login/ flask-sqlalchemy/ flask-migrate第一次使用 flask 及其扩展,如文章中存在错误,请各位包涵,期待各位的指点最简单的app
> app.run(host='0.0.0.0', port=8080)
...
* Running on http://0.0.0.0:8080/ (Press CTRL+C to quit)
最后部署项目的时候会用到 gunicorn, 通过 --bind 参数来调整第一个 Blueprint
Blueprint 是用来管理一组相似视图(理解为管理api)的方法, 例如
# 用户API Blueprint
/api/users
/api/users/<user> /<user>
# 组API Blueprint
/api/groups
/api/groups/<group>
index blueprint
app.py 调整为
app.py
重新运行app.run()后, 在浏览器中输入 http://localhost:5000, 会看到相应的输出
output
配置文件
加载配置文件的方式有几种,from_object/ from_envvar/ from_pyfile其中, from_envvar 会加载环境变量中指定的文件, 格式与 from_pyfile 相同, 路径为相对(app.py)或者是绝对路径我更倾向于使用 from_envvar/ from_pyfile 这种方式来加载配置文件,理由如下项目开发,一般会分为 开发环境/ 测试环境/ 生产环境,会有不同的配置文件由于配置文件中可能会存放数据库连接信息,密钥等敏感字段,因此,不建议将测试/ 生产环境的配置上传到代码服务器上理想的方式是通过配置中心服务来管理,但是配置中心服务不一定会有项目的开发及初期运维可能会是同一个人,因此,可以在配置测试/ 生产环境的服务器时,由开发人员将所需配置直接写在相应的服务器上,通过环境变量的方式指定其路径即可在使用 supervisor 来管理项目进程时,可以通过配置 environment 来实现最简单的配置文件# config.py
DEBUG = True
# app.py
...
加载配置文件
app.config.from_envvar('APP_CONFIG_FILE')
# 添加环境变量
> export APP_CONFIG_FILE="/yourpath/config.py"
# 或者在 supervisor 的配置文件中声明
# environment=APP_CONFIG_FILE="/yourpath/config.py"
数据库
用到的扩展组件flask-sqlalchemy: 基于ORM 框架 SQLAlchemyflask-migrate: 管理数据模型,用于初始化,升级,降级等操作增加 ext.py, 用于定义(声明)用到的扩展组件ext.py
# config.py
...
SQLALCHEMY_DATABASE_URI = 'sqlite:///tutorial.db'
若是使用 MySQL, 需要在配置文件中加入 SQLALCHEMY_POOL_RECYCLE = 3600, 会自动收回无用的数据库连接, 如果不加这个配置, 连接会在 8 小时后断开, 要重启 app 才可以恢复(这是在第一次使用的时候碰到的问题, 由于服务器没有关闭, 第二天一早在使用时, 出现了连接断开的异常)修改 app.py...
from ext import db, migrate
...
db.init_app(app)
migrate.init_app(app, db)
增加数据模型base.py
user.py
manage.py
manage.py
增加蓝图 users
添加查询所有用户的api /api/usersviews/user.py
views/__init__.py
# app.py
...
from views import index, user
...
app.register_blueprint(user.bp)
浏览器中输入 http://localhost:5000, 会看到返回结果如下配置登录认证
修改 models.user.User, 继承 flask_login.UserMixin, 并重写方法 get_idmodels.user.py
app.py
增加蓝图 login
views/login.py
...
from views import index, user, login
...
app.register_blueprint(login.bp)
修改 views/users.py...
from flask_login import login_required
...
@bp.route('')
@login_required
def list_users(): ...
此时, 访问 http://localhost:5000/api/users, 会返回 401 错误