环境搭建:Python 虚拟环境管理、pip install flask 与首个 App

📂 所属阶段:第一阶段 — 破冰启航(基础篇)
🔗 相关章节:初识 Flask · 路由(Routing)艺术


1. 为什么需要虚拟环境?

1.1 虚拟环境解决的问题

项目A需要 Flask 2.0      项目B需要 Flask 3.0
         ↓                      ↓
    全局安装 Flask 2.0    全局安装 Flask 3.0?
         ↓                      ↓
     冲突!版本打架 😱        只能选一个?

虚拟环境:每个项目独立的环境,互不干扰 ✅

1.2 venv 内置模块

Python 3.3+ 自带 venv,无需额外安装。

# 创建虚拟环境
python -m venv venv

# 激活
# Windows PowerShell:
.\venv\Scripts\Activate.ps1
# Windows CMD:
venv\Scripts\activate.bat
# macOS / Linux:
source venv/bin/activate

# 激活后命令提示符前会显示 (venv)
(venv) PS D:\code2026\project>

2. 安装 Flask 及依赖

2.1 基础安装

pip install flask

2.2 项目依赖管理

# 安装 Flask 及常用扩展
pip install flask flask-sqlalchemy flask-login flask-wtf flask-migrate flask-cors

# 安装完成后,冻结依赖清单
pip freeze > requirements.txt

2.3 requirements.txt

Flask>=3.0.0
Flask-SQLAlchemy>=3.1.0
Flask-Login>=0.6.3
Flask-WTF>=1.2.0
Flask-Migrate>=4.0.0
Flask-CORS>=4.0.0
email-validator>=2.0.0
python-dotenv>=1.0.0

2.4 恢复依赖

# 在新机器上安装所有依赖
pip install -r requirements.txt

3. 项目初始化

3.1 创建项目目录

mkdir daoman_blog
cd daoman_blog
python -m venv venv
.\venv\Scripts\Activate.ps1
pip install flask

3.2 Flask 项目标准目录结构

daoman_blog/
├── app/                       # 应用包
│   ├── __init__.py           # 应用工厂 create_app()
│   ├── routes/                # 路由模块(蓝图)
│   │   ├── __init__.py
│   │   ├── main.py
│   │   ├── auth.py
│   │   └── articles.py
│   ├── models/               # 数据模型
│   │   ├── __init__.py
│   │   └── user.py
│   ├── templates/            # Jinja2 模板
│   │   ├── base.html
│   │   ├── index.html
│   │   └── auth/
│   │       └── login.html
│   ├── static/               # 静态资源
│   │   ├── css/
│   │   ├── js/
│   │   └── uploads/
│   └── extensions.py         # 扩展初始化
├── migrations/               # Alembic 数据库迁移
├── tests/                    # 测试代码
├── .env                      # 环境变量(不上传 Git)
├── .env.example              # 环境变量模板
├── requirements.txt          # 依赖清单
├── config.py                 # 配置文件
└── run.py                    # 启动脚本

4. 应用工厂模式

4.1 扩展初始化(extensions.py)

# app/extensions.py
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager
from flask_migrate import Migrate
from flask_wtf.csrf import CSRFProtect

db = SQLAlchemy()
login_manager = LoginManager()
migrate = Migrate()
csrf = CSRFProtect()

login_manager.login_view = "auth.login"  # 未登录重定向到登录页
login_manager.login_message = "请先登录后再访问。"

4.2 应用工厂(init.py)

# app/__init__.py
from flask import Flask
from config import config
from app.extensions import db, login_manager, migrate, csrf

def create_app(config_name="development"):
    app = Flask(__name__)
    app.config.from_object(config[config_name])

    # 初始化扩展
    db.init_app(app)
    login_manager.init_app(app)
    migrate.init_app(app, db)
    csrf.init_app(app)

    # 注册蓝图
    from app.routes.main import main_bp
    from app.routes.auth import auth_bp
    app.register_blueprint(main_bp)
    app.register_blueprint(auth_bp, url_prefix="/auth")

    return app

4.3 配置文件(config.py)

# config.py
import os
from dotenv import load_dotenv

load_dotenv()  # 加载 .env 文件

class Config:
    SECRET_KEY = os.getenv("SECRET_KEY", "dev-key-change-me")
    SQLALCHEMY_DATABASE_URI = os.getenv(
        "DATABASE_URL", "sqlite:///daoman.db"
    )
    SQLALCHEMY_TRACK_MODIFICATIONS = False

class DevelopmentConfig(Config):
    DEBUG = True
    SQLALCHEMY_DATABASE_URI = "sqlite:///daoman_dev.db"

class ProductionConfig(Config):
    DEBUG = False

class TestingConfig(Config):
    TESTING = True
    SQLALCHEMY_DATABASE_URI = "sqlite:///:memory:"

config = {
    "development": DevelopmentConfig,
    "production": ProductionConfig,
    "testing": TestingConfig,
    "default": DevelopmentConfig,
}

4.4 启动脚本(run.py)

# run.py
import os
from app import create_app

config_name = os.getenv("FLASK_ENV", "development")
app = create_app(config_name)

if __name__ == "__main__":
    app.run(
        host="127.0.0.1",
        port=5000,
        debug=True,
    )

5. 使用 .env 管理环境变量

5.1 安装 python-dotenv

pip install python-dotenv

5.2 创建 .env 和 .env.example

# .env(实际值,不上传 Git)
SECRET_KEY=your-super-secret-key-here
DATABASE_URL=sqlite:///daoman.db
FLASK_ENV=development
MAIL_SERVER=smtp.example.com
MAIL_USERNAME=your@email.com
MAIL_PASSWORD=your-email-password
# .env.example(模板,上传 Git,给协作者参考)
SECRET_KEY=change-this-to-a-random-secret
DATABASE_URL=sqlite:///daoman.db
FLASK_ENV=development

5.3 .gitignore

# .gitignore
.env
__pycache__/
*.pyc
*.db
venv/
.venv/
static/uploads/
.coverage
htmlcov/

6. 数据库初始化

6.1 Flask-SQLAlchemy 数据库创建

# 进入 Python shell
flask shell

>>> from app import create_app
>>> from app.extensions import db
>>> app = create_app()
>>> with app.app_context():
...     db.create_all()
...     print("数据库表创建成功!")

6.2 Flask-Migrate 迁移管理

# 初始化迁移
flask db init

# 创建迁移
flask db migrate -m "add user table"

# 应用迁移
flask db upgrade

# 回滚
flask db downgrade

7. 小结

Flask 项目初始化清单:

1. python -m venv venv          创建虚拟环境
2. pip install flask ...        安装依赖
3. pip freeze > requirements.txt 导出依赖
4. 创建目录结构                  app/ static/ templates/ tests/
5. 创建 .env + .env.example    环境变量
6. 创建 .gitignore             忽略敏感文件
7. flask db init                初始化迁移
8. python run.py                启动开发服务器

💡 最佳实践:从第一天起就使用应用工厂模式和虚拟环境。虽然最小应用可以直接写在一个文件里,但养成规范习惯能避免以后重构的痛苦。


🔗 扩展阅读