【问题标题】:FastAPI: datetime with timezone in request doesn't workFastAPI:请求中带有时区的日期时间不起作用
【发布时间】:2021-01-19 17:25:44
【问题描述】:
from fastapi import FastAPI
from datetime import datetime
from ..models import Contact
from ..database import Database


app = FastAPI()

# Dependency
def get_db():
    db = Database()
    try:
        yield db
    finally:
        db.disconnect()

@app.get("/contacts/", response_model=List[Contact])
async def get_contacts(address: int, start_time: datetime, end_time: datetime, duration: int, distance: int, db: Database = Depends(get_db)):
    contacts = detect_contacts(db, address, start_time, end_time, duration, distance)
    return contacts

我正在尝试根据 ISO 8601 或 RFC 3339 将查询参数 start_time 和 end_time 作为带有时区的日期时间值。 没有时区也可以正常工作,例如“2021-01-19 16:00:00”或“2021-01-19T16:00:00”,但不能使用时区,例如“2021-01-19 16”: 00:00+05:00”或“2021-01-19T16:00:00+05:00”,返回这样的错误:

{
    "detail": [
        {
            "loc": [
                "query",
                "start_time"
            ],
            "msg": "invalid datetime format",
            "type": "value_error.datetime"
        }
    ]
}

仅供参考,文档中明确提到它支持 datetime.datetime 类型的 ISO 8601 格式:

Extra Data Type - FastAPI

【问题讨论】:

  • @MrFuppes 是的,我也试过了,没有运气
  • 你的查询参数看起来像这样?start_time=2021-01-19%2016%3A00%3A00%2B05%3A00 ?
  • @alex_noname 不,那是什么?
  • start_time 在您的情况下是一个查询参数。怎么寄?
  • 会不会是您忘记了datetime 中时区的T?你试过2021-01-19T16:00:00+05:00 吗?

标签: python datetime fastapi pydantic


【解决方案1】:

看到上面的 cmets,alex_noname 可能已经触及问题的核心。他展示了应该如何对 ISO 字符串进行编码,以便在查询参数中安全地发送。

用于时区的+ 符号是一个保留字符,应该是encoded in a url,否则它可能会以另一种方式解释,通常是一个空格:例如如果你用谷歌搜索“datetime not working”,结果的 url 看起来像 google.com/search?q=datetime+not+working

这可能是导致时区问题的原因。您可以尝试将参数打印到终端以检查它是否正确解码,您可能会看到一个空格代替加号。

【讨论】:

  • 我的错,我以为它是 url 编码的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
  • 2019-01-28
  • 1970-01-01
  • 1970-01-01
  • 2012-09-17
相关资源
最近更新 更多