为什么在数据库查询中使用带有特殊字符的请求参数无法找到结果,但与固定值相同的字符串却可以正常工作?

问题描述 投票:0回答:0

我在 API 端点上遇到问题,如果发送的数据库查询包含特殊字符,如“ä”,MongoDB 找不到任何数据。

@router.get("")
def get_something_data(name: Optional[str] = None):
    query = {}

    if name:
        query.update({"Name": re.compile(name, re.IGNORECASE)})

    db = pymongo.MongoClient("localhost:whatever")
    database = db[os.environ["DB_SOMETHING"]]
    collection = database[os.environ["COLL_SOMETHING"]]

    return collection.find(query))

如果我打印查询参数,它看起来很好。经过几个小时的调试,我发现如果我强制为查询设置一个值(而不是使用请求中的参数),它就可以正常工作。像这样:

@router.get("")
def get_something_data(name: Optional[str] = None):
    query = {}

    if name:
        query.update({"Name": re.compile("Fixed search value with ä", re.IGNORECASE)})

    db = pymongo.MongoClient("localhost:whatever")
    database = db[os.environ["DB_SOMETHING"]]
    collection = database[os.environ["COLL_SOMETHING"]]

    return collection.find(query))

我怀疑这是一个编码问题,但我还没有找到解决这个问题的方法,所以我来这里寻求帮助。这确实是一个奇怪的问题,我还没有看到其他人有这个问题。

编辑:不确定这在这种情况下是否有帮助,但是

?search=ä
的请求参数被转换为
?search=%C3%83%C2%A4
。至少根据我的理解,一个字符应该根据编码转换为一个或两个
%xx
字符,所以可能会发生一些奇怪的事情?即便如此,打印请求参数仍会按原样打印
ä

python pymongo fastapi urlencode
© www.soinside.com 2019 - 2024. All rights reserved.