【问题标题】:Passing a date as a URL parameter to a flask route将日期作为 URL 参数传递给烧瓶路由
【发布时间】:2018-11-24 16:55:09
【问题描述】:

我想过滤一些数据库结果,对于带有一些日期参数的给定 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 参数传递给烧瓶并将其以 Python 方式转换为 datetime.date

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

【问题讨论】:

  • 获取日期字符串,然后单独转换为datetime.date
  • FWIW 在我看来,您正试图将太多逻辑压缩到一行中。我会先获取字符串(无论是默认值还是来自请求),然后再考虑将其转换为日期对象。
  • 你为什么不像数字一样传递一个日期 - 比如 20181212120222 意思是 2018-12-12 12:02:22,然后在你的端点内将其解析为日期?
  • 但我的意思是对于其他类型它可以完美地工作......对我来说,如果我有一个类型和一个“转换”参数,那将是完美的。我的意思是你不能指望,适合 url 参数的东西总是会映射到对象的构造函数......不知道,也许request.args.get 仅用于原语,但它似乎是基本的东西我,你可能有一些可能性,为 url 参数获取日期或地理坐标验证器......不知道......对我来说似乎只是很多 LOC,手动验证网站的这些基本类型......跨度>
  • 我不确定您在此处对类型和转换参数所做的区分。 type 参数已经是可调用的,您可以在其中传递自己的函数,该函数接受字符串并返回您喜欢的任何内容。

标签: python datetime flask url-parameters


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    接受的解决方案为用例工作(并得到了我的支持:);然而,如果参数不符合预期的格式,它会默默地将其设置为默认值(今天),而不向调用者反馈 - 因为这是烧瓶/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
    
    

    【讨论】:

      猜你喜欢
      • 2017-02-21
      • 1970-01-01
      • 2022-07-09
      • 1970-01-01
      • 1970-01-01
      • 2018-11-04
      • 2020-06-28
      • 1970-01-01
      • 2015-04-04
      相关资源
      最近更新 更多