- https://doc.cms.talelin.com/server/flask/#%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83
https://www.dreamer.im/2019/04/01/flask/%E7%90%86%E8%A7%A3Flask%E5%A4%A7%E5%9E%8B%E5%BA%94%E7%94%A8%E7%BB%93%E6%9E%84/
项目结构
#多文件Flask应用的基础结构
|-flasky
|-app/
|-templates/
|-static/
|-main/
|-__init__.py
|-errors.py
|-forms.py
|-views.py
|-__init__.py
|-email.py
|-models.py
|-migrations/
|-tests/
|-__init__.py
|-test*.py
|-venv/
|-requirements.txt
|-config.py
|-manage.py
这项结构有4个顶级文件夹:
Flask应用一般保存在名为app的包中
- 数据迁移脚本在migrations文件夹中
- 单元测试在tests包中编写
- Python虚拟环境在venv文件夹中
此外,这种结构还多了一些新文件:
- requirements.txt列出了所有依赖包,便于在其他计算机中重新生成相同的虚拟环境
- config.py存储配置
- manage.py定义了Flask应用实例,用于启动程序,同时还有一些辅助管理应用的任务
建议
- 创建虚拟环境
https://www.yuque.com/u1046159/vaeckn/dgxqs3#mtMDj
- 使用程序工厂函数
create_app() 函数就是程序的工厂函数,接受一个参数,是程序使用的配置名
在蓝本中实现程序功能
推荐使用 url_for() 生成 URL,因为这个函数使用 URL 映射生成 URL,从而保证 URL 和定义的路由兼容,而且修改路由名字后依然可用
定义模型时,使用类变量 tablename 定义在数据库中使用的表名,如果没有定义 tablename,Flask-SQLAlchemy 会使用一个默认名字,但默认的表名没有遵守使用复数形式进行命名的约定,所以最好由我们自己来指定表名。
class Role(db.Model):
__tablename__ = 'roles'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
def __repr__(self):
return '<Role %r>' % self.name
虽然没有强制要求,但这两个模型都定义了 repr() 方法,返回一个具有可读性的字符串表示模型,可在调试和测试时使用。
程序中必须包含一个 requirements.txt 文件,用于记录所有依赖包及其精确的版本号
#pip 可以使用如下命令自动生成这个文件
pip freeze >requirements.txt
需求文件内容格式:
Flask==0.10.1
Flask-Bootstrap==3.0.3.1
Flask-Mail==0.9.0
Flask-Migrate==1.1.0
Flask-Moment==0.2.0
Flask-SQLAlchemy==1.0
在其他虚拟环境中使用requirements.txt命令
pip install -r requirements.txt
- Flask的认证扩展
大多数程序都要进行用户跟踪。用户连接程序时会进行身份认证,通过这一过程,让程序知道自己的身份。程序知道用户是谁后,就能提供有针对性的体验。
最常用的认证方法要求用户提供一个身份证明(用户的电子邮件或用户名)和一个密码。
Flask-Login:管理已登录用户的用户会话。
Werkzeug:计算密码散列值并进行核对。
itsdangerous:生成并核对加密安全令牌。