Django REST框架不查找URL编码的详细视图

时间:2018-10-12 09:15:39

标签: python django django-rest-framework

我有一个模型,其主键是TextField。这是我的问题的简约再现:

型号:

class Filename(models.Model):
    path = models.TextField(primary_key=True)

序列化器:

class FilenameSerializer(ModelSerializer):
    class Meta:
        model = Filename
        fields = '__all__'

查看:

class FilenameViewSet(ModelViewSet):
    queryset = Filename.objects.all()
    serializer_class = FilenameSerializer

我正在使用DefaultRouter作为URL。这里是问题:如果我发送了 与{"path":"test"}一起使用POST /filename/,我可以按照您的期望使用GET /filename/test/来完美地检索对象。但是,如果我POST /filename/之类的{"path":"c:\\test"}之类的东西,我希望GET /filename/c%3A%5Ctest/GET /filename/c%3A%5C%5Ctest/是获得它的正确方法,但是这些都不起作用。有人知道发生了什么吗?

更新:网络服务器日志显示Not Found: /filename/c:\test,因此有时会对其进行正确解码。也许是网址正则表达式问题?

3 个答案:

答案 0 :(得分:1)

问题通常与编码的URL无关,而特别是点(%2E)。默认情况下,DefaultRouter()与点不匹配。可以通过在ViewSet中设置lookup_value_regex属性来修改此行为。

class FilenameViewSet(ModelViewSet):
    queryset = Filename.objects.all()
    serializer_class = FilenameSerializer
    lookup_value_regex = '[^/]+'

答案 1 :(得分:0)

嘿,您必须定义lookupfield,您可以将get_object更改字符串格式覆盖为标准文本

class FilenameViewSet(ModelViewSet):
   queryset = Filename.objects.all()
   serializer_class = FilenameSerializer
   lookup_field = 'path'

def get_object(self):
   try:
      from urllib import unquote
   except ImportError:
      from urllib.parse import unquote
  path = unquote(kwarhs['path'))
  return self.get_queryset.get(path=path)

答案 2 :(得分:0)

如果我正确地回答了您的问题。您的问题是json格式。 在特殊字符之前添加转义字符\可以解决您的问题。

请参见以下链接: How to escape special characters in building a JSON string?