将日期作为 URL 参数传递给烧瓶路由

Passing a date as a URL parameter to a flask route

我想过滤一些数据库结果,对于给定的 url 和一些日期参数(例如 url.com?start=2018-12-12)。读取参数的正常方法是使用 request.args.get,访问基础 ImmutableMultiDict 的值,这为我提供了可选参数 defaulttype

我现在的第一次尝试是这样的:

@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