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

时间:2018-11-24 16:55:09

标签: python datetime flask url-parameters

我想为带有给定日期参数(如url.com?start=2018-12-12)的url过滤一些数据库结果。读取参数的常规方法是使用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和格式字符串来获取日期对象。有没有一种方法可以将datetime字符串作为url参数传递给flask,并以Python方式将其强制转换为datetime.date

我喜欢request.args.get的工作方式,但是似乎无法通过给定的url参数轻易地从中获得datetime.date对象。是否有另一种方法可以通过flask bult-in方法来实现,它可以验证参数,并且没有参数,或者ValueError给出默认值?

2 个答案:

答案 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