Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 清理django RESTful输入会导致路由错误_Python_Django_Django Rest Framework - Fatal编程技术网

Python 清理django RESTful输入会导致路由错误

Python 清理django RESTful输入会导致路由错误,python,django,django-rest-framework,Python,Django,Django Rest Framework,我正在尝试验证API中的MAC地址,并将其重新格式化为一致的内部表示形式 下面的代码正确地填充了该表,但是django在尝试为该表创建视图时抛出了一个错误 它抱怨没有找到“nic详细信息”。我猜发生的事情是,url使用传递给验证函数的值进行更新,而不是使用更新后的值。还有别的办法吗 class NICSerializer(serializers.HyperlinkedModelSerializer): def validate_mac(self, value): rege

我正在尝试验证API中的MAC地址,并将其重新格式化为一致的内部表示形式

下面的代码正确地填充了该表,但是django在尝试为该表创建视图时抛出了一个错误

它抱怨没有找到“nic详细信息”。我猜发生的事情是,url使用传递给验证函数的值进行更新,而不是使用更新后的值。还有别的办法吗

class NICSerializer(serializers.HyperlinkedModelSerializer):
    def validate_mac(self, value):
        regex = re.compile(r'^([0-9a-f]{2}([-:\.]?)[0-9a-f]{2}(\2[0-9a-f]{2}){4})$')

        m = regex.match(value)

        if not m:
            raise serializers.ValidationError("Not a valid mac address")
        return value

        sep = m.groups()[1]
        if sep != '':
            return m.groups[0].replace(sep,'.')
        else:
            return '.'.join([m.groups()[0][x:x+2] for x in range(0,len(m.groups()[0]),2)])

    class Meta:
        model = models.NIC
        fields = ('url', 'mac', 'system')

您的视图是否有
queryset
字段?如果没有,则在
urls.py
中向DRF路由器注册视图时,需要指定
base\u name
参数

我问这个问题已经有一段时间了,但我最终找到了一个似乎很有效的解决方案:

创建MACField序列化程序字段:

class MACField(serializers.Field):

    def validate(self, value):
        regex = re.compile(
            r'^([0-9a-fA-F]{2}([:\-.])[0-9a-fA-F]{2}(\2[0-9a-fA-F]{2}){4})$'
        )
        m = regex.match(value)

        if not m:
            raise serializers.ValidationError(
                'Not a valid mac address.'
            )
        return m.groups()[1]

    def to_representation(self, obj):
        return obj

    def to_internal_value(self, data):
        delimiter = self.validate(data)
        return ':'.join(data.lower().split(delimiter))
然后在serializer类中简单地使用它:

class NICSerializer(serializers.HyperlinkedModelSerializer):
    mac = MACField()

    class Meta:
        model = models.NIC
        fields = ('url', 'mac', 'system')

现在,如果有人输入了无效的MAC,则会引发
ValidationError
,如果它有效,则
validate
函数将返回MAC的定界字符。然后,内部表示是以冒号分隔的版本。

它确实有一个查询集。如果我只是传回“值”,而不是重新格式化它,那么一切都会正常工作。您是否尝试指定
base\u name
参数?我认为这不是问题所在。或者如果是的话,你能更具体一点吗?我的问题是:将mac“de:ad:ca:fe:ba:be”添加到数据库中。如果我只是验证并返回这个字符串,视图就可以正常工作。但是,如果我从验证函数返回“de.ad.ca.fe.ba.be”,它会抱怨“nic详细信息”。这让我相信它是在寻找“:”分隔字符串而不是“.”分隔字符串。字符串“
nic detail
”与执行反向URL查找有关。一些代码块有一个Django模型实例,它需要找到它的URL。在Django中,有一个映射将模型的规范详细信息名称(“
nicdetail
”)映射到URL。在您的情况下,当它进行查找时,在其路由器中找不到“
nic detail
”的任何URL。在调用路由器的
urls.py
文件中,注册(r'nic',views.NicViewSet)只需尝试添加
base\u name
参数,如
router.register(r'accounts',AccountViewSet,base\u name=“nic detail”)
,然后看看会发生什么。尝试了笑,没有效果,出现相同的错误消息。我认为它不会的原因是,它在没有validate函数的情况下可以工作。