将日期作为 URL 参数传递给烧瓶路由
Passing a date as a URL parameter to a flask route
我想过滤一些数据库结果,对于给定的 url 和一些日期参数(例如 url.com?start=2018-12-12
)。读取参数的正常方法是使用 request.args.get
,访问基础 ImmutableMultiDict
的值,这为我提供了可选参数 default
和 type
。
我现在的第一次尝试是这样的:
@app.route()
def event():
ektempo = request.args.get('start', default = datetime.date.today(), type = datetime.date)
...
这适用于默认参数,但不适用于传递的日期字符串,因为 datetime.date
需要三个整数作为参数。通常我会通过 datetime.datetime.strptime
和格式字符串获取我的日期对象。有没有办法将日期时间字符串作为 url 参数传递给 flask 并将其 pythonicly 转换为 datetime.date
.
我喜欢 request.args.get
的工作方式,但似乎我无法使用给定的 url 参数轻松地从中获取 datetime.date
对象。有没有另一种方法可以通过 flask 内置方法来实现它,它验证参数并且没有参数或 ValueError
给我默认值?
正如 Daniel Roseman 所指出的,您可以将任何函数传递给 type,因此我只定义了一个小辅助函数来进行日期字符串的转换,就是这样:
def toDate(dateString):
return datetime.datetime.strptime(dateString, "%Y-%m-%d").date()
@app.route()
def event():
ektempo = request.args.get('start', default = datetime.date.today(), type = toDate)
...
是的,非常棒,非常感谢大牛,正是我要找的东西! :)
已接受的解决方案完成了用例的工作(并得到了我的赞成:);然而,如果参数不符合预期的格式,它会静静地将它设置为默认值(今天),而不向调用者反馈 - 因为这是 flask's/werkzeug 的预期行为。
以下是如何使用它来验证 & return 如果客户端传递了无效值,则出现错误 - 搭载 OP 的解决方案:
from flask import jsonify
def to_date(date_string):
try:
return datetime.datetime.strptime(date_string, "%Y-%m-%d").date()
except ValueError:
raise ValueError('{} is not valid date in the format YYYY-MM-DD'.format(date_string))
@app.route()
def event():
try:
ektempo = to_date(request.args.get('start', default = datetime.date.today().isoformat()))
except ValueError as ex:
return jsonify({'error': str(ex)}), 400 # jsonify, if this is a json api
我想过滤一些数据库结果,对于给定的 url 和一些日期参数(例如 url.com?start=2018-12-12
)。读取参数的正常方法是使用 request.args.get
,访问基础 ImmutableMultiDict
的值,这为我提供了可选参数 default
和 type
。
我现在的第一次尝试是这样的:
@app.route()
def event():
ektempo = request.args.get('start', default = datetime.date.today(), type = datetime.date)
...
这适用于默认参数,但不适用于传递的日期字符串,因为 datetime.date
需要三个整数作为参数。通常我会通过 datetime.datetime.strptime
和格式字符串获取我的日期对象。有没有办法将日期时间字符串作为 url 参数传递给 flask 并将其 pythonicly 转换为 datetime.date
.
我喜欢 request.args.get
的工作方式,但似乎我无法使用给定的 url 参数轻松地从中获取 datetime.date
对象。有没有另一种方法可以通过 flask 内置方法来实现它,它验证参数并且没有参数或 ValueError
给我默认值?
正如 Daniel Roseman 所指出的,您可以将任何函数传递给 type,因此我只定义了一个小辅助函数来进行日期字符串的转换,就是这样:
def toDate(dateString):
return datetime.datetime.strptime(dateString, "%Y-%m-%d").date()
@app.route()
def event():
ektempo = request.args.get('start', default = datetime.date.today(), type = toDate)
...
是的,非常棒,非常感谢大牛,正是我要找的东西! :)
已接受的解决方案完成了用例的工作(并得到了我的赞成:);然而,如果参数不符合预期的格式,它会静静地将它设置为默认值(今天),而不向调用者反馈 - 因为这是 flask's/werkzeug 的预期行为。
以下是如何使用它来验证 & return 如果客户端传递了无效值,则出现错误 - 搭载 OP 的解决方案:
from flask import jsonify
def to_date(date_string):
try:
return datetime.datetime.strptime(date_string, "%Y-%m-%d").date()
except ValueError:
raise ValueError('{} is not valid date in the format YYYY-MM-DD'.format(date_string))
@app.route()
def event():
try:
ektempo = to_date(request.args.get('start', default = datetime.date.today().isoformat()))
except ValueError as ex:
return jsonify({'error': str(ex)}), 400 # jsonify, if this is a json api