Please consider this solution.
import colander
class NoneAcceptantNode(colander.SchemaNode):
"""Accepts None values for schema nodes.
"""
def deserialize(self, value):
if value is not None:
return super(NoneAcceptantNode, self).deserialize(value)
class Person(colander.MappingSchema):
interest = NoneAcceptantNode(colander.String())
# Passes
print Person().deserialize({'interest': None})
# Passes
print Person().deserialize({'interest': 'kabbalah'})
# Raises an exception
print Person().deserialize({})