2017-12-22 3 views
0

RESTful 웹 서비스 용 마이크로 서비스를 작성하려고합니다. 'Postgresql'에서 데이터베이스를 만들고 현재 Flask와 psycopg2 (db-object를 json 객체로 변환)를 사용하고 있습니다. 다음은 내 코드의 일부입니다. 그러나 어떤 이유로 든 오류가 발생합니다. 내가 설정하려고하는 URI는 다소 비슷합니다 localhost/events/20171222이 문제를 해결하려면 올바른 방법이 무엇입니까?Python을 사용하여 Flask에서 끝점을 만드는 동안 문제가 발생했습니다.

코드 :

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) 

오류 출력 : 당신은 당신의 쿼리를 수정해야

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 - 

답변

-1

. 현재 timestamp를 문자열 date_obj과 비교하고 있습니다. 따라서 postgreSQL이 타임 스탬프와 문자열을 비교할 수 없으므로 오류가 발생합니다. 그래서 문자열 서식을 사용하여 인식 아래 코멘트에 언급 한 바와 같이

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

docs에 따르면, 응답의 이전 버전은 SQL 주입을 일으킬 수

하고를 사용 쿼리에 date_obj을 통과 서식 문자열을 사용 API가 올바르게.

+0

감사합니다 :) @py_dude –

+0

@ GabbarSingh이 답변을 도움이된다고 표시 할 수 있습니다. –

+3

쿼리에 '서식 지정'을 지정하지 않으면 코드에 SQL 주입 취약점이 생성됩니다. 쿼리 매개 변수를 사용하십시오. https://stackoverflow.com/questions/1466741/parameterized-queries-with-psycopg2-python-db-ap-and-postgresql – leovp

관련 문제