2017-12-22 4 views
0

Ich versuche, einen Microservice für einen RESTful Web-Service zu schreiben. Ich habe eine Datenbank in 'Postgresql' erstellt und derzeit Flask und psycopg2 (für die Konvertierung von Db-Objekt zu Json-Objekt). Folgendes ist ein Teil meines Codes, aber aus irgendeinem Grund bekomme ich einen Fehler. Die URI, die ich versuche zu etablieren, ist ungefähr so. localhost/events/20171222 Was sollte der richtige Weg sein, damit umzugehen?Problem beim Erstellen eines Endpunkts in Flask mit Python

Code:

app = Flask(__name__) 
conn = psycopg2.connect("dbname='postgresdb'") 
cur = conn.cursor(cursor_factory=RealDictCursor) 

@app.route('/events/<dated>', methods=['GET']) 
def getDatedEvents(dated): 
    date_obj = datetime.strptime(dated, '%Y%m%d') 
    #print(type(date_obj)) 
    #print(date_obj) 

    cur.execute(""" 
     SELECT event_id, timestamp 
     FROM event_tbl 
     WHERE timestamp < date_obj 
     ORDER BY timestamp 
     LIMIT 25 
     """) 

    return json.dumps(cur.fetchall(), default=json_serial) 

Fehlerausgang:

psycopg2.ProgrammingError: column "date_obj" does not exist 
LINE 4: WHERE timestamp < date_obj 
        ^

localhost - - [22/Dec/2017 17:22:29] "GET /events/20161020 HTTP/1.1" 500 - 

Antwort

-1

Sie benötigen eine Abfrage zu ändern. Derzeit vergleichen Sie den Zeitstempel mit der Zeichenfolge date_obj, weshalb postgreSQL Sie mit einem Fehler behaftet, da der Zeitstempel nicht mit der Zeichenfolge verglichen werden kann. Verwenden Sie String-Formatierung date_obj in Abfrage weitergeben müssen:

cur.execute(""" 
    SELECT event_id, timestamp 
    FROM event_tbl 
    WHERE timestamp < %s 
    ORDER BY timestamp 
    LIMIT 25 
    """, (date_obj,))` 

Nach docs, wie weiter unten in den Kommentaren erwähnt, könnte die vorherige Überarbeitung einer Antwort SQL-Injektionen verursachen, so beachten Sie Zeichenfolge Formatierung verwenden, und verwenden Sie die API korrekt.

+0

Oh danke Kumpel :) @py_dude –

+0

@GabbarSingh Sie können diese Antwort als richtig markieren, wenn es Ihnen geholfen hat :) –

+3

"formatieren" Sie die Abfrage nicht, so erstellen Sie eine SQL Injection-Schwachstelle in Ihrem Code. Verwenden Sie Abfrageparameter: https://stackoverflow.com/questions/1466741/parameterized-queries-with-psycopg2-python-db-api-and-postgresql – leovp

Verwandte Themen