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

问题描述 投票:4回答:2

我想过滤一些数据库结果,对于给定的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对象。有没有另一种方法来通过烧瓶bult-in方法实现它,它验证参数和没有参数或ValueError给我默认?

python datetime flask url-parameters
2个回答
4
投票

正如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)
    ...

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


-1
投票

接受的解决方案为用例工作(并得到了我的upvote :);但是如果参数不符合预期的格式,它将默认设置为默认值(今天),没有给调用者的反馈 - 因为这是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

© www.soinside.com 2019 - 2024. All rights reserved.