之前做了一些LLM的demo,接口用flask写的,但是涉及到后端的一些业务就感觉逻辑写的很乱,代码变成屎山,于是借助官方文档和GPT迅速补了一些知识,总结一下一个很小的模板
于是决定边学边重构之前的代码…
|---项目名
|---.env
|---app
|---models
|---user.py
|---__init__.py
|---routes
|---auth_routes.py
|---__init__.py
|---services
|---auth_services.py
|---__init__.py
|---utils
|---__init__.py
|---config.py
|---run.py
|---README.md
.env: 用于存储配置
app: 主应用文件夹。
models: 存放数据模型。
routes: 定义应用路由。
services: 实现业务逻辑的服务层。
config.py: 加载和存储配置信息。
run.py: 应用的入口点。
run.py
from app import app
from app.routes import register_routes
from flask_cors import CORS
CORS(app)
register_routes(app)
if __name__ == '__main__':
app.run(debug=True, port=9700)
config.py 就是用load_dotenv从.env文件中读取变量,然后后面别的文件好引入
app\__init__.py
from flask import Flask # 导入 Flask 模块
from flask_sqlalchemy import SQLAlchemy # 导入 SQLAlchemy 模块
from config import DB_CONFIG,SECRET_KEY # 导入数据库配置
from flask_login import LoginManager # 导入登录管理器
app = Flask(__name__) # 创建 Flask 应用对象
app.config['SECRET_KEY'] = SECRET_KEY
app.config['SQLALCHEMY_DATABASE_URI'] = f"mysql+mysqlconnector://{DB_CONFIG['mysql_user']}:{DB_CONFIG['mysql_password']}@{DB_CONFIG['mysql_host']}/{DB_CONFIG['mysql_database']}"
# 配置数据库连接,使用 MySQL 数据库,连接信息从配置文件中获取
db = SQLAlchemy(app) # 创建 SQLAlchemy 对象,它是一个全局变量,可以在其他文件中使用
login_manager = LoginManager() # 创建登录管理器对象
login_manager.init_app(app) # 初始化登录管理器,将它绑定到 Flask 应用对象上
login_manager.login_view = 'auth.login_route' # 设置登录页面的路由
app\models\user.py
# models/user.py
from flask_login import UserMixin # 导入 UserMixin 类, 用于实现用户认证
from app import db
class User(db.Model, UserMixin):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.String(50), unique=True, nullable=False)
password = db.Column(db.String(255), nullable=False)
def __repr__(self):
return f"{self.id}, username={self.username}>"
app\routes\__init__.py
from .auth_routes import *
def register_routes(app):
# 注册认证相关的路由
app.register_blueprint(auth_routes.auth_blueprint, url_prefix='/auth')
app\routes\auth_routes.py
from flask import Blueprint, request, jsonify
from app.services.auth_services import login, register, get_files, delete_file
auth_blueprint = Blueprint('auth', __name__)
@auth_blueprint.route('/Login', methods=['POST'])
def login_route():
"""处理用户登录请求。"""
return login(request.json.get('username'), request.json.get('password'))
@auth_blueprint.route('/Register', methods=['POST'])
def register_route():
"""处理用户注册请求。"""
return register(request.json.get('username'), request.json.get('password'))
app\services\auth_services.py
from werkzeug.security import generate_password_hash, check_password_hash
from flask_login import current_user, login_user
from flask import jsonify
from app import db # 导入数据库实例
from app.models.user import User
def login(username, password):
user = User.query.filter_by(username=username).first()
if user and check_password_hash(user.password, password):
login_user(user)
return "True"
else:
return "False"
def register(username, password):
user = User.query.filter_by(username=username).first()
if user:
return "False" # 已存在的用户名
hashed_password = generate_password_hash(password)
new_user = User(username=username, password=hashed_password)
db.session.add(new_user)
db.session.commit()
return "True"
SQLAlchemy: 为 Flask 提供的一个 ORM(Object Relational Mapping)工具,可以使你以 OOP 的方式操作数据库。
Flask-Login: 一个为 Flask 提供的用户会话管理工具。
Werkzeug: Flask 使用的 WSGI 工具集,用于密码哈希和验证等功能。
Blueprint: 在 Flask 中,蓝图(Blueprint)是一个可组织和重用的应用或者应用子模块。
. 项目结构规范:
__init__.py 来引入需要的模块或功能,使其结构清晰。config.py) 和环境变量文件 (.env) 使得配置集中和易于管理。路由规范:
login_route、register_route。服务层规范:
login 和 register。. 模型规范:
安全规范:
werkzeug.security 提供的函数来进行密码哈希,避免明文密码存储。之前services那里用的代码是

然后gpt建议我改成session

seesion 这个概念确实很多地方都碰到了,但之前没有仔细去了解
以下是GPT的回答
当然可以,让我们通过Python代码示例来详细了解上述的“会话”概念。
用Flask内置的session对象来处理Web会话:
from flask import Flask, session, redirect, url_for, request
app = Flask(__name__)
app.secret_key = 'supersecretkey' # 用于加密session
@app.route('/')
def index():
if 'username' in session:
return 'Logged in as ' + session['username']
return 'You are not logged in'
@app.route('/login', methods=['POST'])
def login():
session['username'] = request.form['username']
return redirect(url_for('index'))
@app.route('/logout')
def logout():
session.pop('username', None)
return redirect(url_for('index'))
if __name__ == '__main__':
app.run()
当用户登录时,我们在会话中存储他们的用户名,然后可以在应用的其他部分检索该信息。
用SQLAlchemy库在Python中与数据库交互:
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
Base = declarative_base()
engine = create_engine('sqlite:///:memory:') # 创建一个内存数据库
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine) # 创建会话类
# 创建一个数据库会话实例
db_session = Session()
# 添加新用户
new_user = User(name='John Doe')
db_session.add(new_user)
db_session.commit()
# 查询用户
user = db_session.query(User).filter_by(name='John Doe').first()
print(user.name)
在这里,db_session 是与数据库的交互会话,可以通过它进行查询、添加、更新或删除操作。