我想为带有给定日期参数(如url.com?start=2018-12-12
)的url过滤一些数据库结果。读取参数的常规方法是使用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
和格式字符串来获取日期对象。有没有一种方法可以将datetime字符串作为url参数传递给flask,并以Python方式将其强制转换为datetime.date
。
我喜欢request.args.get
的工作方式,但是似乎无法通过给定的url参数轻易地从中获得datetime.date
对象。是否有另一种方法可以通过flask bult-in方法来实现,它可以验证参数,并且没有参数,或者ValueError
给出默认值?
答案 0 :(得分:4)
如丹尼尔·罗斯曼(Daniel Roseman)所指出的那样,您可以传递任何函数进行输入,因此我只定义了一个小助手函数来进行日期字符串的转换,就是这样:
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)
...
是的,非常酷,非常感谢Daniel,这正是我所搜索的! :)
答案 1 :(得分:-1)
公认的解决方案可以完成用例的工作(并得到我的支持:);但是,如果参数不符合预期的格式,则它将(今天)静默地将其设置为默认值,而不会反馈给调用者-这是flask / werkzeug的预期行为。
如果客户端传递了无效的值,这是使用它来验证并返回错误的方法-搭载OP解决方案:
from flask import jsonify
def to_date(date_string):
try:
return datetime.datetime.strptime(dateString, "%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