两个不同的ajax url返回相同的数据

时间:2016-08-31 13:52:57

标签: javascript jquery python ajax django

我在我的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]

1 个答案:

答案 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,或者只是返回现有连接而不执行新连接。