清理django RESTful 输入导致路由错误
Cleaning django RESTful input causes routing error
我正在尝试验证 API 中的 MAC 地址并将其重新格式化为一致的内部表示形式。
以下代码正确地填充了 table,但是当尝试为 table 创建视图时 django 会抛出错误。
它抱怨找不到 "nic-detail"。我猜正在发生的事情是 url 使用传入的值更新到验证函数而不是更新的值。有什么不同的方法吗?
class NICSerializer(serializers.HyperlinkedModelSerializer):
def validate_mac(self, value):
regex = re.compile(r'^([0-9a-f]{2}([-:\.]?)[0-9a-f]{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_name
参数。 See rest_framework.routers
usage
我问这个问题已经有一段时间了,但我最终得到了一个似乎运行良好的解决方案:
创建一个MAC字段序列化器字段:
class MACField(serializers.Field):
def validate(self, value):
regex = re.compile(
r'^([0-9a-fA-F]{2}([:\-.])[0-9a-fA-F]{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))
然后在序列化器中简单地使用它class:
class NICSerializer(serializers.HyperlinkedModelSerializer):
mac = MACField()
class Meta:
model = models.NIC
fields = ('url', 'mac', 'system')
现在,如果有人输入无效的 MAC,则会引发 ValidationError
,如果有效,则 validate
函数 returns [= 的定界字符23=]。内部表示就是冒号分隔的版本。
我正在尝试验证 API 中的 MAC 地址并将其重新格式化为一致的内部表示形式。
以下代码正确地填充了 table,但是当尝试为 table 创建视图时 django 会抛出错误。
它抱怨找不到 "nic-detail"。我猜正在发生的事情是 url 使用传入的值更新到验证函数而不是更新的值。有什么不同的方法吗?
class NICSerializer(serializers.HyperlinkedModelSerializer):
def validate_mac(self, value):
regex = re.compile(r'^([0-9a-f]{2}([-:\.]?)[0-9a-f]{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_name
参数。 See rest_framework.routers
usage
我问这个问题已经有一段时间了,但我最终得到了一个似乎运行良好的解决方案:
创建一个MAC字段序列化器字段:
class MACField(serializers.Field):
def validate(self, value):
regex = re.compile(
r'^([0-9a-fA-F]{2}([:\-.])[0-9a-fA-F]{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))
然后在序列化器中简单地使用它class:
class NICSerializer(serializers.HyperlinkedModelSerializer):
mac = MACField()
class Meta:
model = models.NIC
fields = ('url', 'mac', 'system')
现在,如果有人输入无效的 MAC,则会引发 ValidationError
,如果有效,则 validate
函数 returns [= 的定界字符23=]。内部表示就是冒号分隔的版本。