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 格式:
看到上面的评论,alex_noname 似乎已经触及了问题的核心。他展示了应该如何对 ISO 字符串进行编码以在查询参数中安全地发送。
用于时区的 +
符号是一个保留字符,应该是 encoded in a url,否则可能会以另一种方式解释,通常是 space:例如如果你 google “datetime not working” 结果的 url 看起来像 google.com/search?q=datetime+not+working
.
这可能是造成时区问题的原因。您可以尝试将参数打印到终端以检查它是否已正确解码,您可能会看到 space 代替加号。
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 格式:
看到上面的评论,alex_noname 似乎已经触及了问题的核心。他展示了应该如何对 ISO 字符串进行编码以在查询参数中安全地发送。
用于时区的 +
符号是一个保留字符,应该是 encoded in a url,否则可能会以另一种方式解释,通常是 space:例如如果你 google “datetime not working” 结果的 url 看起来像 google.com/search?q=datetime+not+working
.
这可能是造成时区问题的原因。您可以尝试将参数打印到终端以检查它是否已正确解码,您可能会看到 space 代替加号。