我在我的django网站上使用jQuery ajax调用来填充选择框中的选项,该选项框出现在弹出(引导)给用户的模态窗口中。具体来说,它提供了特定数据库中可用模式的列表。 ajax url是动态的,这意味着它在URL中包含db_host和db_name。我有一个客户端站点,每个客户端都必须指向不同的主机/数据库。
通过URL传递的db_host和db_name在django视图中用于在相关主机/ db上执行必要的sql语句。
因此,对于每个db_host / db_name组合,URL应该是唯一的。
我遇到的问题是我在客户端A的页面上,我点击按钮显示模态。进行了ajax调用。我得到了我期望的数据。一切都好。假设ajax URL是“/ ajax / db_host / server_a / db_name / client_a_db / schema_dropdown”。
现在,我进入客户B的页面并单击相同的按钮以显示模态。进行了ajax调用。让我们说这次,ajax URL是 “/ AJAX / DB_HOST / SERVER_B / DB_NAME / client_b_db / schema_dropdown。”
但是,返回的数据实际上是我为之前的ajax调用返回的数据(“/ ajax / db_host / server_a / db_name / client_a_db / schema_dropdown”)而不是URL(特别是host / db)我刚刚过去了。
我有双/三重检查我的网址实际上是不同的。任何帮助,将不胜感激。
这是我的javascript函数,它在显示填充我的选择的模式之前被调用。
function populate_schema_dropdown(db_host, db_name) {
var ajax_url = "/ajax/db_host/" + db_host + "/db_name/" + db_name + "/schema_dropdown"
$.ajax({
url: ajax_url,
success: function (data) {
$("#select-element").empty()
$.each(data, function (i, v) {
$("#schema-element").append("<option value='" + v[0] + "'>" + v[1] + "</option>")
})
}
});
};
以下是我的django视图。
def ajax_schema_dropdown(request, db_host, db_name):
cursor = get_temporary_db_connection(db_host, db_name).cursor()
cursor.execute("""
SELECT
NAME
FROM [sys].[schemas]
""")
data = [(each[0], each[0]) for each in cursor.fetchall()]
cursor.close()
return HttpResponse(json.dumps(data), content_type="application/json")
以下是get_temporary_db_connection函数...
def get_temporary_db_connection(db_host, db_name):
temporary_name = str(uuid.uuid4)
connections.databases[temporary_name] = {
'ENGINE': 'sqlserver_ado',
'NAME': db_name,
'HOST': db_host,
'USER': '',
'PASSWORD': '',
'OPTIONS': {
'provider': 'SQLNCLI11'
}
}
return connections[temporary_name]
答案 0 :(得分:0)
可能是设置temporary_name
变量的问题。它不是动态的,就像它(我猜)那样,与第一个数据库相同的数据库被用于所有正在进行的ajax调用,修复它你必须替换行:
temporary_name = str(uuid.uuid4)
到
temporary_name = str(uuid.uuid4()) # note i've changed uuid.uuid4 -> uuid.uuid4()
________________________________^^____
注意:使用它之后可能与数据库紧密相连,否则你最终会在connections
dict中找到很多连接。作为一个选项,你可以在连接dict创建和重新连接(如果出现某种情况)后继续连接到db,或者只是返回现有连接而不执行新连接。