flask基础开发知识学习

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

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

文章目录

  • 代码结构
  • 补基础知识
  • 一些总结
    • session
      • 1. Web会话:
      • 2. 数据库会话:

代码结构

  • 用我上一篇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
    

.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 CORSCORS(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 dbclass 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"<User id={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 Userdef 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)是一个可组织和重用的应用或者应用子模块。

  • . 项目结构规范:

    • 使用具有明确名称的文件夹来分隔不同的功能模块(如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, requestapp = 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()

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

2. 数据库会话:

用SQLAlchemy库在Python中与数据库交互:

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmakerBase = 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 是与数据库的交互会话,可以通过它进行查询、添加、更新或删除操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/108271.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java SimpleDateFormat linux时间字符串转时间轴的坑

Mon Oct 16 09:51:28 2023 这是linux 的 date命令得到的时间&#xff0c;要转换称时间戳。 EEE MMM dd HH:mm:ss yyyy 这样的格式&#xff0c;看起来就是正确的&#xff0c;可是就是报错 Unparseable date: "Mon Oct 16 09:51:28 2023" 下面是正确的代码 String[…

2024年孝感市建筑类中级职称申报资料私企VS国企

2024年孝感市建筑类中级职称申报资料私企VS国企 民营企业中级职称申报跟事业单位或者是国企申报中级职称流程不一样么&#xff1f;实际上流程基本都是相同的&#xff0c;就是提交纸质版资料有点不一样。 孝感市建筑类中级职称申报基本流程 1.参加建筑类中级职称水平能力测试。 …

Javascript中字符串取数字

let str 32.12s; let intPart Math.floor(parseFloat(str)); // 输出32 let intPart Math.floor(Number(str)); // 输出NaNMath.floor函数会向下取整&#xff0c;将浮点数舍去小数部分。如果需要四舍五入的结果&#xff0c;可以使用Math.round函数 parseFloat函数从字…

本地配置免费的https咋做?

大家好这里是tony4geek。 今天和公司的小伙伴对接项目&#xff0c;因为涉及到https的权限调用。所以在服务器本地localhost 要配置https用来测试 。现在把过程中遇到的问题记录下来。 • 因为是测试用所以生成https的证书用免费的就可以了。 openssl req -x509 -nodes -days …

Spring(18) @Order注解介绍、使用、底层原理

目录 一、简介二、List 注入使用示例2.1 测试接口类2.2 测试接口实现类12.3 测试接口实现类22.4 启动类&#xff08;测试&#xff09;2.5 测试结果场景一&#xff1a;场景二&#xff1a; 三、CommandLineRunner 使用示例3.1 接口实现类13.2 接口实现类23.3 测试结果场景一&…

排序算法可视化

前言 这两天在B站上刷到一个视频&#xff0c;用python把各种排序动画可视化显示了出来觉得还蛮好玩的&#xff0c;当即就决定用Flutter写一个玩玩&#xff0c;顺便复习一下排序算法&#xff0c;话不多说&#xff0c;进入正文~ 效果图&#xff1a; 该效果图为鸡尾酒排序(双向冒…

Python 实现http server接收mutipart/form-data文件 方法2

Python 实现http server接收mutipart/form-data文件 方法2 1 Server端代码2 测试 1 Server端代码 以下代码亲测有效&#xff0c;仅适应于接收客户端上传的图片&#xff0c;其他文件未曾测试&#xff0c;作者主要应用于平时的自测工具。 说明1&#xff1a; 如有特殊需求&#x…

OpenRemote: Java 开源 IoT 物联网开发平台,匹配智慧城市、智能家居、能源管理

OpenRemote 是一个直观、用户友好的基于Java语言的开源 IoT 物联网设备管理平台&#xff0c;它包括从连接设备到构建应用程序和特定领域的智能应用程序的所有功能和特性。通过OpenRemote物联网平台&#xff0c;用户可以收集和处理来自不同设备的传感器数据&#xff0c;适用于智…

STM32学习笔记

前言 今天开始学习STM32&#xff0c;公司封闭git网络&#xff0c;所以选择CSDN来同步学习进度&#xff0c;方便公司和家里都能更新学习笔记。 参考学习资料 江科大STM32教学视频&#xff1a; 江科大自动协STM32视频_哔哩哔哩_bilibili

Java Kids-百倍提速【Mac IOS】

引言&#xff1a;当今社会&#xff0c;创新和提升效率已经成为了大家普遍的追求。无论是个人生活还是企业经营&#xff0c;我们都希望能够以更高的效率完成任务&#xff0c;节省时间和资源。因此&#xff0c;提速成为了一种时代的要求&#xff0c;而"Java Kids 百倍提速&q…

C#进阶——反射(Reflection)

定义&#xff1a;反射指的是在运行时动态地获取、检查和操作程序中的类型信息&#xff0c;而在我们的Unity中反射允许开发者在运行时通过代码来访问和修改对象的属性、方法和字段&#xff0c;而不需要提前知道这些成员的具体信息。 举一个例子&#xff0c;我们使用反射在运行的…

c++ --- 归并排序

2、归并排序 步骤&#xff1a; 选取中间点 mid (LR)/2递归排序 左边left 和 右边 right归并 ---- 将数组合二为一 模板代码 int temp[10]; void merge_sort(int q[], int l, int r) {//如果左右边界相等 直接退出if (l > r) return;//获取数组中心int mid (l r) / 2;/…

python实现批量数据库数据插入

import pandas as pd import pymysql # 连接 MySQL 数据库 conn pymysql.connect( hostlocalhost, useryour_username, passwordyour_password, databaseyour_database_name, charsetutf8mb4, ) # 读取已有数据 existing_data pd.read_csv("86w全…

Vue双向绑定原理

响应式原理 响应式是Vue的核心特性之一&#xff0c;数据驱动视图&#xff0c;我们修改数据视图随之响应更新&#xff0c;其原理是&#xff1a; ⚡️ 通过数据劫持结合发布和-订阅者模式的方式&#xff0c;通过拦截对数据的操作&#xff0c;在数据变动时发 布消息给订阅者&…

python yaml库:safe_load()(安全解析函数,解析yaml)(防止yaml文件中包含恶意代码)

文章目录 Python YAML: 使用 safe_load 进行安全解析什么是 safe_load?如何使用 safe_load?为什么选择 safe_load 而非 load? Python YAML: 使用 safe_load 进行安全解析 YAML (YAML Ain’t Markup Language) 是一种人类可读的数据序列化标准。它被广泛用于配置文件、多语言…

Element el-table 表格内容 样式错乱的问题

表格切换样式错乱展示 因为切换行的高度变化可能未异步渲染 解决方法&#xff1a; 在需要使用v-if渲染的el-table-column元素上加上一个不重复的key值即可解决问题 :key“Math.random()” <el-table-columnprop""label"问题"width"630.5px":…

day35

今日内容概要 Socket抽象层(socket编程) 基于TCP协议的借助socket可以编程客户端和服务端的程序 链接循环 通信循环 基于UDP协议的套接字(socket)编程 粘包现象 如何解决粘包现象(重要的是解决的思路) struct模块的使用(打包、解包) 今日内容详细 Socket抽象层&#x…

Selenium自动化测试总结

一、Selenium自动化测试&#xff08;基于python&#xff09; 1、Selenium简介&#xff1a; 1.1 Selenium是一款主要用于Web应用程序自动化测试的工具集合。Selenium测试直接运行在浏览器中&#xff0c;本质是通过驱动浏览器&#xff0c;模拟浏览器的操作&#xff0c;比如跳转、…

Qt 样式表大全整理

【QT】史上最全最详细的QSS样式表用法及用例说明_qt样式表使用大全_半醒半醉日复日&#xff0c;花落花开年复年的博客-CSDN博客 QT样式表的使用_qt 设置按下 release hover 按钮样式表_create_right的博客-CSDN博客 QPushButton {border-image: url(:/Start_Stop.png); } QPu…

Python 爬虫实战

Python爬虫可以用于爬取淘宝商品数据&#xff0c;并对这些数据进行数据分析。下面是一个简单的示例&#xff0c;展示如何使用Python爬取淘宝商品数据并进行数据分析。 首先&#xff0c;需要使用Python的requests库和BeautifulSoup库来爬取淘宝商品页面。以下是一个简单的示例代…