为什么str.split()无法与fastapi str类型一起使用?

时间:2019-11-16 21:18:57

标签: python string fastapi

由于某些原因,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之外,以显示期望的结果是一个列表,在这里我可以按其索引分别访问每个访问的项目,如下所示:< / p>

### 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(如上)中,它不需要任何\或\,所以我认为这是没有必要的。 / li>

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

1 个答案:

答案 0 :(得分:1)

我相信,如果您将split("+")替换为split(" "),您的代码将可以使用。 url编码后,查询字符串中的+个字符代表space;在传递给视图函数之前,FastAPI将对查询字符串进行url解码。