• flask基础开发知识学习


    之前做了一些LLM的demo,接口用flask写的,但是涉及到后端的一些业务就感觉逻辑写的很乱,代码变成屎山,于是借助官方文档和GPT迅速补了一些知识,总结一下一个很小的模板

    于是决定边学边重构之前的代码…

    代码结构

    • 用我上一篇blog写的方法来打印下项目目录
      |---项目名
        |---.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
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17

    .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)
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
    • 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'  # 设置登录页面的路由
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
    • 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}>"
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
    • app\routes\__init__.py

      from .auth_routes import *
      
      def register_routes(app):
          # 注册认证相关的路由
          app.register_blueprint(auth_routes.auth_blueprint, url_prefix='/auth')
      
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
    • 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'))
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
    • 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"
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25

    补基础知识

    • SQLAlchemy: 为 Flask 提供的一个 ORM(Object Relational Mapping)工具,可以使你以 OOP 的方式操作数据库。

    • Flask-Login: 一个为 Flask 提供的用户会话管理工具。

    • Werkzeug: Flask 使用的 WSGI 工具集,用于密码哈希和验证等功能。

    • Blueprint: 在 Flask 中,蓝图(Blueprint)是一个可组织和重用的应用或者应用子模块。

    • . 项目结构规范:

      • 使用具有明确名称的文件夹来分隔不同的功能模块(如models、routes和services)。
      • 在每个文件夹内部,通过 __init__.py 来引入需要的模块或功能,使其结构清晰。
      • 单独的配置文件 (config.py) 和环境变量文件 (.env) 使得配置集中和易于管理。
    • 路由规范:

      • 使用蓝图来组织路由,使其模块化并易于维护。
      • 路由的命名应反映其功能,如 login_routeregister_route
    • 服务层规范:

      • 把业务逻辑和操作放在 services 文件夹中,保持路由层的纯净。
      • 每个函数应该有清晰的职责,如 loginregister
    • . 模型规范:

      • 在 models 文件夹中定义数据模型。
      • 使用 SQLAlchemy 提供的功能来定义和操作数据模型。
    • 安全规范:

      • 使用 werkzeug.security 提供的函数来进行密码哈希,避免明文密码存储。
      • 使用 Flask-Login 来管理用户会话。

    一些总结

    • 真的难蚌,重构代码的时候,引入了blueprint之后,我的登陆和注册接口前面多了个 /auth路径,然后和之前的前端代码对接的时候,控制台一直显示跨域不成功,我以为是CORS的问题,然后调了一早上+一中午…结果用apifox测试的时候,我把接口路径写对了,写了auth,接口测试成功,我才反应过来…

    session

    • 之前services那里用的代码是
      在这里插入图片描述
      然后gpt建议我改成session
      在这里插入图片描述

    • seesion 这个概念确实很多地方都碰到了,但之前没有仔细去了解

    以下是GPT的回答
    在这里插入图片描述

    • web的session和数据库的session示例代码如下

    当然可以,让我们通过Python代码示例来详细了解上述的“会话”概念。

    1. Web会话:

    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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    当用户登录时,我们在会话中存储他们的用户名,然后可以在应用的其他部分检索该信息。

    2. 数据库会话:

    用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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    在这里,db_session 是与数据库的交互会话,可以通过它进行查询、添加、更新或删除操作。

  • 相关阅读:
    Linux 学习之路 -- 进程篇 -- 进程控制
    C语言折半查找算法及代码实现
    动态神经网络时间序列预测
    简述信息都有哪些特征?
    刷题笔记day14-二叉树01
    Java将彩色PDF转为灰度
    如何在 C# 程序中注入恶意 DLL?
    git常用命令学习笔记
    Django + Nginx https部署实战(第二辑)
    c++多线程(一)线程管理
  • 原文地址:https://blog.csdn.net/qq_52431436/article/details/133857218