2

出于某种原因,str.split() 在 python 的 fastapi 包中没有按预期运行。

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

### 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"}

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

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

>>> abracadabra # Actual result as expected

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

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

任何将这个字符串分隔成片段的帮助都会非常有帮助。之后,我打算处理字符串列表,并返回一个比第一个元素更复杂的 json,但这似乎是我的主要障碍。

4

1 回答 1

2

我相信如果您替换split("+")split(" "). +查询字符串中的字符在url 编码时表示一个空格;FastAPI 将在传递给视图函数之前对查询字符串进行 url 解码。

于 2019-11-16T21:34:00.450 回答