组织一个 Flask 项目通常需要遵循一定的结构,以便代码清晰、可维护。下面是一个典型的 Flask 项目结构:
my_flask_app/ │ ├── app/ │ ├── __init__.py │ ├── models.py │ ├── views.py │ ├── forms.py │ ├── templates/ │ │ ├── base.html │ │ ├── index.html │ └── static/ │ ├── css/ │ ├── js/ │ └── images/ │ ├── migrations/ │ ├── tests/ │ ├── __init__.py │ ├── test_app.py │ ├── venv/ │ ├── config.py │ ├── manage.py │ ├── requirements.txt │ └── README.md
目录和文件说明
app/
__init__.py
: 初始化 Flask 应用,注册蓝图和扩展。models.py
: 数据库模型定义。views.py
: 视图函数,处理路由和请求。forms.py
: 表单定义(如果使用 Flask-WTF)。templates/
: HTML 模板文件。static/
: 静态文件(CSS、JavaScript、图像等)。
migrations/
- 数据库迁移文件夹,用于存储 Alembic 生成的迁移脚本。
tests/
- 测试代码文件夹。
venv/
- 虚拟环境文件夹。
config.py
- 配置文件,存储应用配置变量。
manage.py
- 管理脚本,用于启动应用和其他管理任务。
requirements.txt
- 依赖文件,列出所有需要安装的 Python 包。
README.md
- 项目说明文件,提供项目的基本信息和使用说明。
具体代码示例
app/__init__.py
from flask import Flask from flask_sqlalchemy import SQLAlchemy from flask_migrate import Migrate db = SQLAlchemy() migrate = Migrate() def create_app(): app = Flask(__name__) app.config.from_object('config') db.init_app(app) migrate.init_app(app, db) from .views import main as main_blueprint app.register_blueprint(main_blueprint) return app
app/models.py
from . import db class Author(db.Model): __tablename__ = "authors" id = db.Column(db.Integer, primary_key=True, autoincrement=True) name = db.Column(db.String(16), unique=True) books = db.relationship("Book", backref="author") class Book(db.Model): __tablename__ = "books" id = db.Column(db.Integer, primary_key=True, autoincrement=True) title = db.Column(db.String(100), unique=True) author_id = db.Column(db.Integer, db.ForeignKey('authors.id'))
app/views.py
from flask import Blueprint, render_template from .models.py import Author, Book main = Blueprint('main', __name__) @main.route('/') def index(): authors = Author.query.all() return render_template('index.html', authors=authors)
config.py
import os basedir = os.path.abspath(os.path.dirname(__file__)) class Config: SECRET_KEY = os.environ.get('SECRET_KEY') or 'a_really_secure_key' SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'app.db') SQLALCHEMY_TRACK_MODIFICATIONS = False
也可以这样
config ├── Config.py ├── __init__.py
config/__init__.py
from .Config import Config from .Config import ProductionConfig from .Config import DevelopmentConfig from .Config import TestingConfig
config/Config.py
class Config(object): """Base config, uses staging database server.""" TESTING = False DB_SERVER = '192.168.1.56' @property def DATABASE_URI(self): # Note: all caps return f"mysql://user@{self.DB_SERVER}/foo" class ProductionConfig(Config): """Uses production database server.""" DB_SERVER = '192.168.19.32' class DevelopmentConfig(Config): DEBUG = True DB_SERVER = 'localhost' class TestingConfig(Config): DB_SERVER = 'localhost' DATABASE_URI = 'sqlite:///:memory:'
manage.py
from app import create_app app = create_app() if __name__ == "__main__": app.run()
requirements.txt
Flask Flask-SQLAlchemy Flask-Migrate
启动应用
- 安装依赖:
pip install -r requirements.txt
- 初始化数据库:
flask db init flask db migrate -m "Initial migration." flask db upgrade
- 运行应用:
python manage.py
结论
通过遵循以上结构,您可以构建一个清晰、可维护的 Flask 项目。这个结构提供了一个基础,您可以根据需要进行扩展和修改。