项目结构对比:Flask vs Django

📊 项目结构对比:Flask vs Django

🏗️ 整体项目结构

bash 复制代码
D:/zhonglin/flask/
├── app/                          # 相当于 Django 的项目主目录
│   ├── __init__.py              # 🔥 Flask 应用工厂(相当于 Django 的 settings.py + wsgi.py)
│   ├── config/                   # 配置目录(相当于 Django 的 settings.py)
│   │   ├── config.py            # 业务配置(API账号、字段映射等)
│   │   ├── error.py             # 自定义异常处理
│   │   └── logconfig.py         # 日志配置
│   ├── controller/               # 🔥 相当于 Django 的 apps(各个应用模块)
│   │   ├── admin/               # admin 应用(类似 Django 的一个 app)
│   │   │   ├── __init__.py      # 定义蓝图(相当于 Django 的 urls.py)
│   │   │   ├── db.py            # 数据库操作(相当于 Django 的 models.py)
│   │   │   ├── query.py         # 视图函数(相当于 Django 的 views.py)
│   │   │   └── schema.sql       # 数据库表结构(相当于 Django 的 migrations)
│   │   └── story/               # story 应用
│   │       ├── __init__.py      
│   │       └── search.py        # 视图函数
│   ├── deps/                     # 第三方依赖封装(如 TAPD API 客户端)
│   ├── static/                   # 静态文件(CSS、JS、图片)- 和 Django 一样
│   ├── templates/                # HTML 模板 - 和 Django 一样
│   └── util.py                   # 工具函数
├── instance/                     # 🔥 实例文件夹(存放数据库、配置等)
│   └── flaskr.sqlite            # SQLite 数据库文件
├── log/                          # 日志目录
├── start.py                      # 🔥 启动文件(相当于 Django 的 manage.py)
├── requirements.txt              # 依赖包(和 Django 一样)
└── Dockerfile                    # Docker 配置

🔑 核心概念对比

1️⃣ 应用启动方式

Django + MySQL Flask + SQLite
python manage.py runserver python start.py
manage.py 是 Django 自动生成的 start.py 是手动创建的入口文件

Flask 的 start.py

python 复制代码
from app import create_app
app = create_app()  # 调用应用工厂函数
app.run(host='0.0.0.0', port='5000')

2️⃣ 应用初始化(最重要的区别!)

Django 方式

python 复制代码
# settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'myapp1',
    'myapp2',
]

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mydatabase',
        'USER': 'root',
        'PASSWORD': 'password',
    }
}

Flask 方式(应用工厂模式)

python 复制代码
# app/__init__.py
def create_app():
    app = Flask(__name__)
    
    # 配置数据库路径
    app.config['DATABASE'] = os.path.join(app.instance_path, 'flaskr.sqlite')
    
    # 注册蓝图(相当于 Django 的 INSTALLED_APPS)
    from .controller.admin import admin_bp
    from .controller.story import story_bp
    app.register_blueprint(admin_bp)
    app.register_blueprint(story_bp)
    
    # 初始化数据库
    from app.controller.admin import db
    db.init_app(app)
    
    return app

3️⃣ 路由定义(URL 配置)

Django 方式

python 复制代码
# urls.py
urlpatterns = [
    path('admin/login/', views.login),
    path('admin/getUserInfo/', views.getUserInfo),
]

Flask 方式(使用蓝图 Blueprint)

python 复制代码
# app/controller/admin/__init__.py
from flask import Blueprint
admin_bp = Blueprint('admin', __name__)
from . import query  # 导入视图函数

# app/controller/admin/query.py
from . import admin_bp as bp

@bp.route('/login')  # 装饰器定义路由
def login():
    username = request.args.get('username')
    # ... 业务逻辑
    return 'login success'

蓝图(Blueprint) = Django 的 app + urls.py 的组合体


4️⃣ 数据库操作(最大区别!)

Django ORM(自动化)

python 复制代码
# models.py
class User(models.Model):
    username = models.CharField(max_length=100)
    password = models.CharField(max_length=100)

# views.py
user = User.objects.get(username='admin')  # ORM 查询

Flask + SQLite(原生 SQL)

python 复制代码
# db.py
def get_db():
    g.db = sqlite3.connect(current_app.config['DATABASE'])
    return g.db

# query.py
db = get_db()
cur = db.cursor()
cur.execute('SELECT * FROM toolUser WHERE username = ?', (username,))
res = cur.fetchall()

关键区别

  • Django:使用 ORM,不需要写 SQL,自动生成数据库表
  • Flask:需要手动写 SQL 语句,手动创建表结构

5️⃣ 数据库表结构定义

Django 方式(migrations)

bash 复制代码
python manage.py makemigrations  # 生成迁移文件
python manage.py migrate         # 执行迁移

Flask 方式(schema.sql)

sql 复制代码
-- app/controller/admin/schema.sql
CREATE TABLE toolUser (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    username TEXT UNIQUE NOT NULL,
    passwd TEXT NOT NULL
);

INSERT INTO module VALUES ('【2D设定】');
bash 复制代码
flask init-db  # 执行 SQL 脚本初始化数据库

6️⃣ 数据库类型对比

特性 MySQL(Django 常用) SQLite(Flask 常用)
类型 客户端-服务器数据库 文件型数据库
安装 需要单独安装 MySQL 服务 Python 内置,无需安装
存储 独立的数据库服务器 单个 .sqlite 文件
并发 支持高并发 适合小型应用
连接 需要账号密码、IP、端口 直接读取文件
适用场景 生产环境、大型应用 开发测试、小型应用

你的项目

  • 数据库文件:D:/zhonglin/flask/instance/flaskr.sqlite
  • 用 DBeaver 打开这个文件,就能看到所有表和数据
  • 相当于 MySQL 的整个数据库都存在这一个文件里

7️⃣ 视图函数(Views)

Django 方式

python 复制代码
# views.py
def login(request):
    username = request.GET.get('username')
    user = User.objects.get(username=username)
    return JsonResponse({'status': 'success'})

Flask 方式

python 复制代码
# query.py
@bp.route('/login')
def login():
    username = request.args.get('username')
    db = get_db()
    cur = db.execute('SELECT * FROM toolUser WHERE username = ?', (username,))
    return 'login success'

相似点 :都是处理 HTTP 请求,返回响应
不同点:Flask 需要手动操作数据库,Django 用 ORM


🎯 你的项目功能总结

根据代码分析,这是一个 用户管理 + 模块管理 的后端 API 系统:

主要功能模块

  1. 用户管理(admin 应用)

    • /login - 用户登录
    • /getUserInfo - 获取用户信息
    • /changeUserPassword - 修改密码
    • /insertUser - 新增用户
  2. 模块管理

    • /queryAllModule - 查询所有模块
    • /insertModule - 新增模块
    • /deleteModule - 删除模块
    • /updateModule - 更新模块
  3. 模块负责人管理

    • /queryAllModuleToOwner - 查询模块负责人
    • /insertModuleToOwner - 分配负责人
  4. 需求搜索(story 应用)

    • 集成了 TAPD API,用于搜索项目需求

💡 如果用 Django + MySQL 改写

python 复制代码
# models.py
class ToolUser(models.Model):
    username = models.CharField(max_length=100, unique=True)
    passwd = models.CharField(max_length=100)
    permission = models.CharField(max_length=50)

class Module(models.Model):
    modulename = models.CharField(max_length=100, primary_key=True)

# views.py
def login(request):
    username = request.GET.get('username')
    password = request.GET.get('password')
    user = ToolUser.objects.get(username=username, passwd=password)
    return JsonResponse({'permission': user.permission})

📝 总结对比表

功能 Django + MySQL Flask + SQLite
路由 urls.py Blueprint + @route 装饰器
视图 views.py 视图函数 + 装饰器
数据库 ORM(自动) 原生 SQL(手动)
表结构 models.py + migrations schema.sql
配置 settings.py config.py + app.config
启动 manage.py runserver start.py
应用组织 INSTALLED_APPS register_blueprint
数据库文件 MySQL 服务器 单个 .sqlite 文件
相关推荐
间彧5 小时前
LongAdder和AtomicLong的区别与使用场景选择
后端
间彧5 小时前
LongAdder支持高并发,为什么还要使用AtomicLong,直接使用LongAdder不就行了?(实则不然)
后端
WoodWall5 小时前
WebServer 00 重要前置知识
c++·后端
LCG元5 小时前
Docker容器化实战:将你的SpringBoot应用一键打包部署,告别环境不一致的烦恼!#第一部分
后端·docker
天南星5 小时前
23种设计模式-深度讲解-7. 装饰器模式 (Decorator)
后端·设计模式
初级程序员Kyle5 小时前
Java复习日记 - 第一天:重拾Java基础
后端
oak隔壁找我5 小时前
SpringBoot 开发必备基础工具类实现(纯JWT认证,无SpringSecurity)
java·后端
张较瘦_5 小时前
Springboot | 初识Springboot 从“手动做饭”到“点外卖”的编程革命
java·spring boot·后端
间彧5 小时前
举例说明混合使用CAS和传统锁机制的成功案例
后端