具有非字母数字字符的请求参数在查找时永远不会匹配



我正在尝试使用rest-frameworks ModelViewSet根据用户的电子邮件地址检索用户。当请求中仅存在字母数字字符时,一切正常,但是,当包含@._等字符时,它会失败。

我尝试了各种请求,包括:

GET /users/example%40example.com
GET /users/example@example.com

响应返回:

{
    "detail": "Not found."
}

请求中的电子邮件地址与数据库中的电子邮件地址完全匹配。

这是我目前的观点:

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    lookup_field = 'email'

是我,我昨天说的是对的,导致404错误的不是@符号,而是.符号。将代码更改为:

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    lookup_field = 'email'
    lookup_value_regex = '[^/]+'

默认lookup_value_regex是 [^/.]+ ,这是文档。查看源代码,您可以在rest_framework/routers.py/SimpleRouter/get_lookup_regex中看到它:

def get_lookup_regex(self, viewset, lookup_prefix=''):
    """
    Given a viewset, return the portion of URL regex that is used
    to match against a single instance.
    Note that lookup_prefix is not used directly inside REST rest_framework
    itself, but is required in order to nicely support nested router
    implementations, such as drf-nested-routers.
    https://github.com/alanjds/drf-nested-routers
    """
    base_regex = '(?P<{lookup_prefix}{lookup_url_kwarg}>{lookup_value})'
    # Use `pk` as default field, unset set.  Default regex should not
    # consume `.json` style suffixes and should break at '/' boundaries.
    lookup_field = getattr(viewset, 'lookup_field', 'pk')
    lookup_url_kwarg = getattr(viewset, 'lookup_url_kwarg', None) or lookup_field
    lookup_value = getattr(viewset, 'lookup_value_regex', '[^/.]+')
    return base_regex.format(
        lookup_prefix=lookup_prefix,
        lookup_url_kwarg=lookup_url_kwarg,
        lookup_value=lookup_value
    )

相关内容

最新更新