使用用户输入动态创建Flask SQLAlchemy数据库连接

问题描述

我想知道是否有可能使用用户传递的输入来创建SqlAlchemy数据库URI。例如,具有输入文本字段,用户将不得不在其中输入创建数据库uri所需的参数。只有这样才能建立连接,然后用户才能访问数据库中的数据。

解决方法

实际上,这是可能的。但是您需要在没有flask-sqlalchemy的情况下管理数据库连接。

您需要用于数据库引擎的存储以及用于更新它的路由。数据库引擎将以此方式创建,并通过执行简单请求来测试它们是否真正起作用。数据库URI被保存到用户会话中以供以后使用:

from flask import Flask,Response,render_template,request,session
from sqlalchemy import create_engine
from sqlalchemy.exc import OperationalError

ENGINES = {}

app = Flask(__name__)

@app.route("/set_database_uri",methods=("GET","POST"))
def set_database_uri():
    if request.method == "POST":
        database_uri = request.form["database_uri"]
        if database_uri not in ENGINES:
            engine = create_engine(database_uri)
            try:
                engine.execute("SELECT 1")
            except OperationalError:
                return Response("Invalid database URI",400)
            ENGINES[database_uri] = engine
        session["database_uri"] = database_uri
    return render_template("database_uri.html")

这些引擎可用于产生SQLAlchemy会话以进行所需的数据库操作:

from flask import redirect,session,url_for
from sqlalchemy.orm import Session

@app.route("/records")
def get_records():
    if "database_uri" not in session:
        return redirect(url_for("set_database_uri"))

    db_session = Session(session["database_uri"])
    records = db_session.query(Record).all()
    db_session.close()

    return render_template("records.html",records=records)

尽管在技术上可行,但不建议使用此方法。由于潜在的用户可以创建与应用程序主机上可用的任何数据库的数据库连接,因此可能会导致严重的安全漏洞。

但是,如果要创建某种数据库管理界面,它可能会很有用。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...