FastAPI:请求中带时区的日期时间不起作用

FastAPI: datetime with timezone in request doesn't work

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

我正在尝试获取查询参数 start_time 和 end_time 作为带时区的日期时间值,基于 ISO 8601 或 RFC 3339。 它在没有时区的情况下工作正常,例如,“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

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

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

这可能是造成时区问题的原因。您可以尝试将参数打印到终端以检查它是否已正确解码,您可能会看到 space 代替加号。