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

Pau*_*rtz 7 python datetime url-parameters flask

我想过滤一些数据库结果,对于给定的 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)
   ...
Run Code Online (Sandbox Code Playgroud)

这适用于默认参数,但不适用于传递的日期字符串,因为datetime.date需要三个整数作为参数。通常我会得到我的日期对象datetime.datetime.strptime和一个格式字符串。有没有办法将日期时间字符串作为 url 参数传递给烧瓶并将它pythonicly 转换为datetime.date.

我喜欢这种工作方式request.args.get,但似乎无法datetime.date使用给定的 url 参数轻松从中获取对象。有没有另一种方法可以通过烧瓶内置方法来实现它,它验证参数并且没有参数或ValueError给我默认值?

Pau*_*rtz 12

正如 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)
    ...
Run Code Online (Sandbox Code Playgroud)

是的,非常酷,非常感谢丹尼尔,正是我搜索的内容!:)


Tod*_*kov 5

接受的解决方案为用例工作(并得到了我的赞成:);然而,如果参数不符合预期的格式,它会悄悄地将其设置为默认值(今天),不会向调用者提供反馈——因为这是flask/werkzeug 的预期行为。

如果客户端传递了无效值,以下是如何使用它来验证和返回错误 - 搭载 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

Run Code Online (Sandbox Code Playgroud)