使用 Flask 时在 Python 中实现持久数据库连接的最佳实践

2024-05-03

我的问题是关于在生产环境或其他关注性能的环境中使用 Flask 时处理数据库连接的推荐方法。在 Flask 中,g 对象可用于存储内容,并且可以将打开的数据库连接放置在那里,以允许应用程序在同一请求期间的后续数据库查询中重用它们。但是,g 对象不会跨请求持久存在,因此似乎每个新请求都需要新的数据库连接(以及随之而来的性能损失)。

我发现与此事最相关的问题是:如何在 python Web 服务器中保留数据库连接 https://stackoverflow.com/questions/6688413/how-to-preserve-database-connection-in-a-python-web-server但答案只是提出了连接池的抽象概念(没有将其与人们如何在 Flask 中使用它以及它如何跨请求生存联系起来)或提出一种仅与一种特定类型的数据库或特定堆栈相关的解决方案。

所以我的问题是关于在生产基于 Flask 构建的连接到的应用程序时应采取的一般方法any一种数据库。看起来涉及连接池的事情是在正确的方向上,特别是因为这适用于传统的 Python 应用程序。但我想知道使用 Flask 时推荐的方法是什么,因为前面提到的跨连接持久性问题,而且生产中的 Flask 应用程序是从 WSGI 服务器运行的,这可能会增加更多的复杂性。

编辑:基于推荐 Flask sqlalchemy 的评论。假设 Flask sqlalchemy 解决了这个问题,它是否也适用于 Neo4J 或 Flask 应用程序使用的任何任意数据库?许多现有的数据库连接器已经原生支持池化,那么为什么要引入一个主要目的是提供 ORM 功能而不是连接管理的额外依赖项呢?另外,sqlalchemy 如何解决跨请求持久性的基本问题?


事实证明,有一种简单的方法可以实现我所追求的目标。但正如评论者所建议的,如果有可能走 Flask sqlalchemy 路线,那么你可能会想走这条路。我解决问题的方法是将连接对象保存在模块级变量中,然后根据需要导入该变量。这样,它就可以在 Flask 内部和其他模块中使用。这是我所做的简化版本:

app.py

from flask import Flask
from extensions import neo4j

app = Flask(__name__)
neo4j.init_app(app)

扩展.py

from neo4j_db import Neo4j

neo4j = Neo4j()

neo4j_db.py

from neo4j import GraphDatabase

class Neo4j:
    def __init__(self):
        self.app = None
        self.driver = None

    def init_app(self, app):
        self.app = app
        self.connect()

    def connect(self):
        self.driver = GraphDatabase.driver('bolt://xxx')
        return self.driver

    def get_db(self):
        if not self.driver:
            return self.connect()
        return self.driver

示例.py

from extensions import neo4j

driver = neo4j.get_db()

从这里开始driver将包含将在 Flask 请求中持续存在的数据库驱动程序。

希望对遇到同样问题的人有所帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Flask 时在 Python 中实现持久数据库连接的最佳实践 的相关文章

  • NumPy linalg.eig

    我有这个烦人的问题 但我还没有弄清楚 我有一个矩阵 我想找到特征向量 所以我写 val vec np linalg eig mymatrix 然后我得到了 vec 我的问题是 当我小组中的其他人对相同的矩阵 mymatrix 做同样的事情时
  • ImportError:运行 jupyter Notebook 时没有名为 IPython.paths 的模块?

    我通过以下方式安装了 jupyter usr local opt python bin python2 7 m pip install jupyter 这将安装 ipython 版本 4 1 2 但是 当我运行 jupyter Notebo
  • 如何使用 javascript/jquery/AJAX 调用 Django REST API?

    我想使用 Javascript jQuery AJAX 在前端调用 Django Rest API 请求方法是 POST 但当我看到 API 调用它的调用 OPTIONS 方法时 所以 我开始了解access control allow o
  • CNTK 抱怨 LSTM 中的动态轴

    我正在尝试在 CNTK 中实现 LSTM 使用 Python 来对序列进行分类 Input 特征是固定长度的数字序列 时间序列 标签是 one hot 值的向量 Network input input variable input dim
  • Pandas:如何将数据框插入 Clickhouse

    我正在尝试将 Pandas 数据框插入 Clickhouse 这是我的代码 import pandas import sqlalchemy as sa uri clickhouse default localhost default ch
  • Alembic:如何迁移模型中的自定义类型?

    My User模型是 class User UserMixin db Model tablename users noinspection PyShadowingBuiltins uuid Column uuid GUID default
  • 如何从 JSON 响应重定向?

    所以我尝试使用 Flask 和 Javascript 上传器 Dropzone 上传文件并在上传完成后重定向 文件上传正常 但在烧瓶中使用传统的重定向 return redirect http somesite com 不执行任何操作 页面
  • 使用 Conda 更新特定模块会删除大量软件包

    我最近开始使用 Anaconda Python 发行版 因为它提供了许多开箱即用的数据分析库 使用 conda 创建环境和安装软件包也轻而易举 但是当我想更新 Python 本身或任何其他模块时 我遇到了一些严重的问题 我事先被告知我的很多
  • Werkzeug 中的线程和本地代理。用法

    首先 我想确保我正确理解了功能的分配 分配本地代理功能以通过线程内的模块 包 共享变量 对象 我对吗 其次 用法对我来说仍然不清楚 也许是因为我误解了作业 我用烧瓶 如果我有两个 或更多 模块 A B 我想将对象C从模块A导入到模块B 但我
  • theta 连接、等值连接和自然连接之间的区别

    当涉及到 theta 连接 等值连接和自然连接时 我无法理解关系代数 有人可以帮助我更好地理解它吗 如果我在 theta 连接上使用 符号 它与使用自然连接完全相同吗 A 西塔加入允许任意比较关系 例如 An equijoin是使用相等运算
  • 为什么我应该使用 WSGI?

    使用 mod python 一段时间了 我读了越来越多关于 WSGI 有多好的文章 但没有真正理解为什么 那么我为什么要切换到它呢 有什么好处 这很难吗 学习曲线值得吗 为了用 Python 开发复杂的 Web 应用程序 您可能会使用更全面
  • `pyqt5'错误`元数据生成失败`

    我正在尝试安装pyqt5使用带有 M1 芯片和 Python 3 9 12 的 mac 操作系统 我怀疑M1芯片可能是原因 我收到一个错误metadata generation failed 最小工作示例 directly in the t
  • 使用 NLP 进行地址分割

    我目前正在开发一个项目 该项目应识别地址的每个部分 例如来自 str Jack London 121 Corvallis ARAD ap 1603 973130 输出应如下所示 street name Jack London no 121
  • java库维护数据库结构

    我的应用程序一直在开发 所以偶尔 当版本升级时 需要创建 更改 删除一些表 修改一些数据等 通常需要执行一些sql代码 是否有一个 Java 库可用于使我的数据库结构保持最新 通过分析类似 db structure version 信息并执
  • PIL - 需要抖动,但限制调色板会导致问题

    我是 Python 新手 正在尝试使用 PIL 来执行 Arduino 项目所需的解析任务 这个问题涉及到Image convert 方法以及调色板 抖动等选项 我有一些硬件能够一次仅显示 16 种颜色的图像 但它们可以指定为 RGB 三元
  • 字符串列表,获取n个元素的公共子串,Python

    我的问题可能类似于this https stackoverflow com questions 37514193 count the number of occurrences of n length not given string in
  • OSX 上的 locale.getlocale() 问题

    我需要获取系统区域设置来执行许多操作 最终我想使用 gettext 翻译我的应用程序 我打算在 Linux 和 OSX 上分发它 但我在 OSX Snow Leopard 上遇到了问题 python Python 2 5 2 r252 60
  • 计算互相关函数?

    In R 我在用ccf or acf计算成对互相关函数 以便我可以找出哪个移位给我带来最大值 从它的外观来看 R给我一个标准化的值序列 Python 的 scipy 中是否有类似的东西 或者我应该使用fft模块 目前 我正在这样做 xcor
  • python 日志记录会刷新每个日志吗?

    当我使用标准模块将日志写入文件时logging 每个日志会分别刷新到磁盘吗 例如 下面的代码会将日志刷新 10 次吗 logging basicConfig level logging DEBUG filename debug log fo
  • tkinter:打开一个带有按钮提示的新窗口[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 用户如何按下 tkinter GUI 中的按钮来打开新窗口 我只需要非常简单的解决方案 如果代码也能被解释那就太好了 这

随机推荐

  • 日期/时间值的 Django URL 转换器

    我正在尝试使用 Django 内置的 URL 转换器将 URL 中的日期时间字符串转换为视图中的日期对象 如果我手动输入 URL 它们会按预期工作 但尝试为其生成 URL 时找不到匹配项 我的转换器很简单 from django utils
  • 删除最低位

    给定一个二进制数 删除最低位的最快方法是什么 01001001010 gt 01001001000 它将在代码中用于迭代变量的位 伪代码如下 while bits 0 index getIndexOfLowestOrderBit bits
  • Ember 模型中的自定义请求 url

    我正在尝试将 Ember 数据与已构建的 REST api 一起使用 它适用于顶级路由 例如我在 api 端有课程路由 如下所示 app get courses app controllers courses findAll app get
  • 如何在android中的网格视图中进行分页? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如何在 android 中对 gri
  • 如何在代码中停止 autopep8 未安装消息

    我是一名新的 Python 程序员 使用 Mac 版本的 VS Code 1 45 1 创建 Django 项目 我安装了 Python 和 Django 扩展 每次我保存 Django 文件时 代码都会弹出此窗口 Formatter au
  • $rootScope.currentUser 刷新时为空

    我能够让 firebaseSimpleLogin 正常工作并将当前用户存储在 rootScope 中 当我转到另一个页面并返回提要页面时 所有内容都会加载 但是当我刷新时 rootScope currentUser 为空 其他人遇到过这个问
  • 查找-exec选项

    比如说 我想找到一些文件并执行 chmod 并使用另一个命令对其执行某些操作 例如 find name txt exec chmod 666 cp dst it says find missing argument to exec 我该如何
  • Django/gevent socket.IO 与 redis pubsub。我把东西放在哪里?

    我有一个独立的 python 脚本 它只是从 Twitter 的流 API 捕获数据 然后在收到每条消息时 使用 redis pubsub 将其发布到频道 tweets 这是该脚本 def main username username pa
  • 可视化时间序列时标记特定日期

    我有一个包含几年数据的时间序列 例如 ts pd Series np random randn 1000 index pd date range 1 1 2000 periods 1000 ts ts cumsum ts plot 我还有两
  • 基于鼠标位置的平滑滚动(Jquery)

    HI 我想创建一个基于鼠标位置的平滑滚动条 这个想法是创建一个具有固定宽度的外部 div 内容非常宽 必须根据鼠标位置向左或向右滚动 如果内容是 无限 或 无尽 的 那就太好了 内容是一个非常宽的图像 无缝 地重复 有人可以帮我用 jQue
  • Python:如何删除圆括号内的文本?

    我试过了 但没用 return re sub myResultStats text 建议 thanks 尝试这个 return re sub myResultStats text 括号表示捕获组 因此您必须转义它们
  • 将字符缓冲区从 .NET 传递到 COM 并获取更新

    我有从 C 调用以下 COM 方法 该方法在提供的缓冲区中返回一个字符串pchText 这是not必须以零结尾 和复制的字符数pcch HRESULT Next in out long pcch out size is pcch OLECH
  • 使用 cURL 设计身份验证

    如何使用 Devise 从终端使用 cURL 验证我的 Ruby on Rails 应用程序 我想 curl user email password http domain bla api auth sign in 并正在回应 您要查找的页
  • 作为属性的类引用

    谷歌对于这类搜索毫无用处 因为你会得到数亿个结果 其中没有一个与特定问题相关 问题很简单 Delphi 中是否可以有类引用属性 如果是这样 怎么办 这是我尝试过的 type TMyObject class end TMyObjectClas
  • 标准在哪里谈论别名?

    C 标准中哪里谈到了别名 我查看了目录 没有看到 别名 这个词 我试图查看一个定义规则 3 2 但搜索 别名 没有结果 我不知道它可能在哪里 我正在寻找内存别名 别名主要在 3 10 basic lval 10中讨论 If a progra
  • 无法从 WebDriver 获取正确的控制台日志(Chrome、C#)

    我在 Selenium WebDriver C Chrome 浏览器中编写了以下微测试 它没有用 但这里不是这种情况 Test public void T2 API 001 PrintingAlerts pgactions OpenData
  • 为 Rails 3 应用程序制作自定义插件/gem/引擎

    我正在遵循指南http edgeguides rubyonrails org plugins html http edgeguides rubyonrails org plugins html而且它似乎有点过时了 您能看一下并告诉我哪些部分
  • 比较 .NET 中的两个字节数组

    我怎样才能快速做到这一点 当然我可以这样做 static bool ByteArrayCompare byte a1 byte a2 if a1 Length a2 Length return false for int i 0 i
  • 识别 Windows 版本

    我正在编写一个打印出详细 Windows 版本信息的函数 输出可能是这样的元组 32bit XP Professional SP3 English 它将支持 Windows XP 及更高版本 我一直坚持获取 Windows 版本 例如 专业
  • 使用 Flask 时在 Python 中实现持久数据库连接的最佳实践

    我的问题是关于在生产环境或其他关注性能的环境中使用 Flask 时处理数据库连接的推荐方法 在 Flask 中 g 对象可用于存储内容 并且可以将打开的数据库连接放置在那里 以允许应用程序在同一请求期间的后续数据库查询中重用它们 但是 g