为什么 str.split() 不适用于 fastapi str 类型?

Why is str.split() not working in with fastapi str type?

出于某种原因,str.split() 在 python.

的 fastapi 包中未按预期运行

为了简化,我包含了一个 FastAPI 的简单用例,但是 str.split() 似乎只删除了我打算拆分的字符,而不是 return a列出我可以通过索引访问各个项目的位置。高度简化的可重现代码:

### fastapi example
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"Hello": "World"}

@app.get("/alignment/{item_id}")
def read_item(item_id: str, q: str):
    my_list = q.split("+")   ### the critical line in question
    return {"people" : my_list[0]}

我运行 此代码使用 uvicorn 作为:

>>> uvicorn main:app --reload

通过在 firefox 中浏览 http://127.0.0.1:8000/alignment/abc123ABC123?q=abracadabra+django+musical

我的输出是:

{"people":"abracadabra django musical"}

但是,我希望输出为:

{"people" : "abracadabra"}

为了确保我没有发疯,我在 fastApi 之外使用了 str.split() 来显示预期结果是一个列表,我可以在其中通过索引单独访问每个访问的项目,此处显示:

### str.split example
q = "abracadabra+django+musical"
my_list = q.split("+")
a = my_list[0]
print(a)

>>> abracadabra # Actual result as expected

我有过一些假设,但都没有结果:

  1. 在 fastapi class 中为 read_item 声明的 str 类型没有相同的 .split() 函数,有没有办法默认为 python 的基础 str.split()函数?
  2. 也许这是一个编码问题,但是 URL 和 python 默认都是 ASCII,所以这似乎不是错误
  3. 也许“+”需要一个转义字符(在大多数 REGEX 情况下都是如此),但在 ### str.split example(上文)中它可以在没有任何 \ 或 \ 的情况下工作,所以我认为没有必要.

任何帮助将此字符串分成几部分的帮助都会非常有帮助。之后,我打算处理字符串列表,return 比第一个元素复杂得多 json ,但这似乎是我的主要障碍。

我相信如果将 split("+") 替换为 split(" "),您的代码将会正常工作。查询字符串中的 + 个字符在 url 编码时代表一个 space; FastAPI 将 url 在传递给视图函数之前解码查询字符串。