📊 项目结构对比: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 系统:
主要功能模块:
-
用户管理(admin 应用):
/login
- 用户登录/getUserInfo
- 获取用户信息/changeUserPassword
- 修改密码/insertUser
- 新增用户
-
模块管理:
/queryAllModule
- 查询所有模块/insertModule
- 新增模块/deleteModule
- 删除模块/updateModule
- 更新模块
-
模块负责人管理:
/queryAllModuleToOwner
- 查询模块负责人/insertModuleToOwner
- 分配负责人
-
需求搜索(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 文件 |