当前位置: 首页 > news >正文

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 是与数据库的交互会话,可以通过它进行查询、添加、更新或删除操作。

相关文章:

flask基础开发知识学习

之前做了一些LLM的demo&#xff0c;接口用flask写的&#xff0c;但是涉及到后端的一些业务就感觉逻辑写的很乱&#xff0c;代码变成屎山&#xff0c;于是借助官方文档和GPT迅速补了一些知识&#xff0c;总结一下一个很小的模板 于是决定边学边重构之前的代码… 文章目录 代码结…...

内网和热点同时连接使用配置

解决如标题问题 查看当前永久路由信息 route print截图保存(重要) 截图保存(重要)查出来的永久路由&#xff0c;以防配置不成功时回退&#xff0c;回退方法就是下面的“添加永久路由” 删除当前的路由 0.0.0.0 是上面查出的网络地址 route delete 0.0.0.0内网IP信息 添加永久…...

C语言 形参、实参

定义 形参 形式上的参数&#xff0c;没有确定的值 实参 实际存在的&#xff0c;已经确定的参数&#xff0c;常量&#xff0c;变量&#xff0c;表达式&#xff0c;都是实参 区别 实参的值不随形参的变化而变化 在C语言中&#xff0c;数据传送是单向的&#xff0c;即只能把实…...

linux入门到精通-第四章-gcc编译器

目录 参考gcc概述gcc的工作流程 参考 gcc编译器 gcc概述 编辑器vi、记事本)是指我用它来写程序的 (编辑码)&#xff0c;而我们写的代码语句&#xff0c;电脑是不懂的&#xff0c;我们需要把它转成电脑能懂的语句&#xff0c;编译器就是这样的转化工具。就是说&#xff0c;我…...

HCIP静态路由综合实验

题目&#xff1a; 步骤&#xff1a; 第一步&#xff1a;搭建上图所示拓扑; 第二步&#xff1a;为路由器接口配置IP地址&#xff1b; R1&#xff1a; [R1]display current-configuration intinterface GigabitEthernet0/0/0ip address 192.168.1.1 255.255.255.252 interfa…...

nginx前端配置(新)

基础配置 server {listen 80;server_name your-frontend-domain.com;# 根目录为前端网页文件所在目录root /path/to/your/frontend/files;# 默认文档&#xff08;例如 index.html&#xff09;index index.html;location / {try_files $uri $uri/ /index.html; #try_files 指…...

js,jquery,vue设置html标签隐藏不显示

前端 <p id"myElement"> </p>使用js将idmyElemnt的标签隐藏 使用 style.display 属性&#xff1a; 通过设置 style.display 属性为 "none"&#xff0c;可以隐藏标签。 var element document.getElementById("myElement");element…...

口袋参谋:如何实时监控对手数据?

​在如此激烈的淘宝天猫上开店&#xff0c;如何才能获取对手的数据呢&#xff1f; 俗话说的好&#xff0c;知己知彼百战百胜&#xff0c;那么这句话同样也适用于淘宝天猫上。 只有掌握对手推广策略以及数据&#xff0c;我们才有机会反超&#xff0c;因此做好竞品监控是运营店…...

Q-learning如何与ABC等一些元启发式算法能够结合在一起?

1、出现的问题 Q-learning能和元启发式算法&#xff08;如ABC、PSO、GA、SSA等&#xff09;结合在一起&#xff0c;实现工作流调度问题&#xff1f; Q-learning和ABC (Artificial Bee Colony) 等元启发式算法可以结合在一起以解决特定类型的问题。Q-learning是一种强化学习算法…...

mysql 过滤多列重复的值(保留其中一条),对单列或者多列重复的值去重

建立测试数据表 CREATE TABLE test (id int(11) NOT NULL AUTO_INCREMENT,account varchar(255) DEFAULT NULL,password varchar(255) DEFAULT NULL,deviceId varchar(255) DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT11 DEFAULT CHARSETutf8mb4;INSERT INT…...

面向红队的自动化引擎工具

gogo 介绍 面向红队的、高度可控的可拓展的自动化引擎。特征如下&#xff1a; 自由的端口配置 支持主动/主动指纹识别 关键信息提取&#xff0c;如标题、证书以及自定义提取信息的正则 支持nuclei poc&#xff0c;poc目录&#xff1a;https://chainreactors.github.io/wiki/…...

Python库学习(十):Matplotlib绘画库

1. 介绍 Matplotlib 是一个用于绘制图表和可视化数据的 Python 库。它提供了丰富的绘图工具&#xff0c;可以用于生成各种静态、交互式和动画图表。Matplotlib 是数据科学、机器学习和科学计算领域中最流行的绘图库之一。 1.1 关键特性 以下是 Matplotlib 的一些关键特性&…...

coverity工具 代码审计

第39篇&#xff1a;Coverity代码审计/代码扫描工具的使用教程_希潭实验室ABC123的博客-CSDN博客...

女鹅冬天的第一件羽绒服,当然要时尚经典的

90白鸭绒&#xff0c;高密度充绒量和蓬松度 让这件羽绒服更加饱满更有型 三防工艺&#xff0c;立领连帽设计 下摆抽绳&#xff0c;帽子上的魔术贴设计 无一不将保暖落实在实处 宽松版型立体感很强&#xff0c;对身材的包容性也是非常不错...

智慧渔业方案:AI渔政视频智能监管平台助力水域禁渔执法

一、方案背景 国内有很多水库及河流设立了禁渔期&#xff0c;加强渔政执法监管对保障国家渔业权益、维护渔业生产秩序、保护渔民群众生命财产安全、推进水域生态文明建设具有重要意义。目前&#xff0c;部分地区的监管手段信息化水平低下&#xff0c;存在人员少、职责多、任务…...

LXC、Docker、 Kubernetes 容器以及Hypervisor的区别

LXC、Docker、 Kubernetes 容器以及Hypervisor的区别 SaaS: Software-as-a-Service&#xff08;软件即服务&#xff09; PaaS: Platform-as-a-Service&#xff08;平台即服务&#xff09; IaaS: Infrastructure-as-a-Service&#xff08;基础设施即服务&#xff09; 1、Docke…...

电子杂志制作不求人:简单易用的工具推荐

​如果你想要制作一份精美的电子杂志&#xff0c;但是又不想花费太多的时间和金钱&#xff0c;也不想求及朋友帮忙制作&#xff0c;那么可以试试这个网站制作电子杂志&#xff0c;展现出的效果跟专业级设计师的效果没什么区别哦 赶快收藏吧-------FLBOOK在线制作电子杂志平台&a…...

Excel冻结窗格

1、冻结表格首行 点击菜单栏中的“视图”&#xff0c;选择“窗口”选项卡中的“冻结窗格”下的小三角&#xff0c;再选择“冻结首行”&#xff1b; 2.冻结表格首列 点击菜单栏中的“视图”&#xff0c;选择“窗口”选项卡中的“冻结窗格”下的小三角&#xff0c;再选择“冻结…...

Flink自定义sink并支持insert overwrite 功能

前言 自定义flink sink,批模式下,有insert overwrite 需求或需要启动任务或任务完成后时,只执行一次某些操作时,则可参考此文章 组件: flink: 1.15 参考文档:https://nightlies.apache.org/flink/flink-docs-release-1.15/docs/dev/table/sourcessinks/ 分析 inser…...

CSS Vue/RN 背景使用opacity,文字在背景上显示

Vue <div class"training_project_tip"> <div class"tip">展示的文字</div> </div> .training_project_tip { font-size: 12px; font-weight: 400; text-align: left; color: #ffffff; margin-top: 8px; position: relative; dis…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...