2016-08-31 5 views
1

Ich benutze jQuery AJAX-Aufrufe auf meiner Django-Site, um die Optionen in einem Auswahlfeld zu füllen, das in einem modalen Fenster angezeigt wird, das dem Benutzer angezeigt wird (Bootstrap). Insbesondere wird eine Liste verfügbarer Schemas in einer bestimmten Datenbank bereitgestellt. Die Ajax-URL ist dynamisch, dh sie enthält einen db_host und einen db_name in der URL. Ich habe eine Site mit Clients und jeder Client muss auf einen anderen Host/db zeigen.Zwei verschiedene Ajax-URLs geben die gleichen Daten zurück

Der über die URL übergebene db_host und db_name wird in der django-View verwendet, um die notwendige sql-Anweisung auf dem entsprechenden Host/db auszuführen.

So sollte die URL für jede db_host/db_name Kombination eindeutig sein.

Ich habe ein Problem, wo ich auf der Seite von Client A bin, ich klicke auf die Schaltfläche, um das Modal anzuzeigen. Der Ajax-Anruf wird getätigt. Ich bekomme die Daten, die ich erwarte. Alles ist gut. Nehmen wir an, die Ajax-URL lautet "/ ajax/db_host/server_a/db_name/client_a_db/schema_dropdown".

Jetzt bin ich auf die Seite von Client B gekommen und klicke auf dieselbe Schaltfläche, um das Modal anzuzeigen. Der Ajax-Anruf wird getätigt. Nehmen wir an, die Ajax-URL lautet diesmal "/ ajax/db_host/server_b/db_name/client_b_db/schema_dropdown."

Die zurückgegebenen Daten sind jedoch die Daten, die für den vorherigen Ajax-Aufruf zurückgegeben wurden ("/ ajax/db_host/server_a/db_name/client_a_db/schema_dropdown") und nicht für die URL (speziell Host/db), die ich gerade bestanden habe.

Ich habe Doppel/Dreifach überprüft, dass meine URL, jedes Mal anders ist. Jede Hilfe wäre willkommen.

Hier ist meine Javascript-Funktion, die aufgerufen wird, kurz bevor das Modal angezeigt wird, das meine Auswahl ausfüllt.

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>") 
        }) 

       } 
      }); 
     }; 

Unten ist meine Django-Ansicht.

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") 

Im Folgenden finden Sie get_temporary_db_connection Funktion ...

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

Willkommen bei SO, was ist los in 'get_temporary_db_connection'? –

+0

Ich bin mir nicht sicher, ob ich die Frage richtig gestellt habe, aber sollte dies nicht serverseitig erfolgen und die richtigen Daten schon in der gezeigten Vorlage zurückgeben? –

+0

Ich habe Code für get_temporary_db_connection – blosche

Antwort

0

wahrscheinlich das Problem in der Art und Weise temporary_name Variable der Einstellung. Es ist nicht dynamisch, wie es (ich glaube) vermuten, das ist dieselbe Datenbank als erste für alle ausgeh Ajax-Aufrufe verwendet werden, um es zu beheben Sie Zeile ersetzen:

temporary_name = str(uuid.uuid4) 

zu

temporary_name = str(uuid.uuid4()) # note i've changed uuid.uuid4 -> uuid.uuid4() 
________________________________^^____ 

Hinweis: Wahrscheinlich ist es sinnvoll, enge Verbindung zur Datenbank nach der Arbeit mit ihm, sonst werden Sie am Ende mit einer Menge von Verbindungen in connections dict. Als eine Option können Sie die Verbindung zu db in connections dict beibehalten, nachdem sie erstellt und neu verbunden wurde (wenn eine Bedingung aufgetreten ist) oder einfach existierende Verbindung zurückgeben, ohne eine neue Verbindung herzustellen.

+0

hinzugefügt Yeesh, das war es total. Ich werde dich auf jeden Fall auf deinen Rat aufnehmen: das Connections Dictionary. – blosche

+0

Danke nochmal Andriy. – blosche

+0

@blosche Sie sind herzlich willkommen :) –

Verwandte Themen