使用 Python 在 Flask 中创建端点时出现问题 [重复]

Posted

技术标签:

【中文标题】使用 Python 在 Flask 中创建端点时出现问题 [重复]【英文标题】:issue while creating an endpoint in Flask using Python [duplicate] 【发布时间】:2017-12-22 12:04:46 【问题描述】:

我正在尝试为 RESTful Web 服务编写微服务。 我在“Postgresql”中创建了一个数据库,目前使用 Flask 和 psycopg2(用于将 db-object 转换为 json 对象)。 以下是我的代码的一部分,但由于某种原因,我遇到了错误。我正在尝试建立的 URI 有点像 localhost/events/20171222 处理这个问题的正确方法是什么?

代码:

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】:

您需要修改查询。目前您正在将时间戳与字符串 date_obj 进行比较,这就是 postgreSQL 抛出错误的原因,因为它无法将时间戳与字符串进行比较。使用字符串格式在查询中传递您的date_obj

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

根据docs的说法,如下面的cmets中提到的,之前修改过的一个答案可能会导致SQL注入,所以要注意使用字符串格式,正确使用API​​。

【讨论】:

哦,谢谢哥们 :) @py_dude @GabbarSingh 如果对您有帮助,您可以将此答案标记为正确:) 不要format 查询,这就是您在代码中创建 SQL 注入漏洞的方式。使用查询参数:***.com/questions/1466741/…

以上是关于使用 Python 在 Flask 中创建端点时出现问题 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在单元测试中将 JSON 发布到 Flask 端点时出现错误请求 [重复]

当我尝试在 python 中创建浏览器时出现错误

python 在Jinja2 /FlaskàlaDjango Style中创建换行符和段落

Mac中anaconda中创建虚拟python环境,配置flask

在 azure 中创建 webjob 时出现 python 包安装错误

PyCharm中创建项目时,在所创建的python虚拟环境下的pip失效