如何在Marshmallow中处理WebSocket URL验证?
解决Marshmallow验证ws/wss URL失败的问题
默认情况下,Marshmallow的URL字段只允许http、https、ftp、ftps这类常见协议,ws和wss不在默认允许列表内,所以会触发Not a valid URL的验证错误。这种情况不需要完全从零写自定义验证器,直接扩展现有字段的协议白名单更高效。
两种可行解决方式
方式一:扩展URL字段的允许协议列表
直接在定义Schema时,给URL字段指定包含ws、wss的协议白名单:
from marshmallow import Schema, fields class ExplicitUriSchema(Schema): ws_url = fields.URL(allowed_schemes=["ws", "wss", "http", "https"])
方式二:自定义验证函数(适用于需额外校验逻辑的场景)
如果需要对URL做更多自定义校验(比如端口格式、域名规则),可以写专属验证器:
from marshmallow import Schema, fields, ValidationError from urllib.parse import urlparse def validate_ws_url(url): parsed_url = urlparse(url) if parsed_url.scheme not in ["ws", "wss"]: raise ValidationError("URL必须使用ws或wss协议") # 可添加额外校验,比如检查端口是否合法、域名是否符合规则等 class ExplicitUriSchema(Schema): ws_url = fields.Str(validate=validate_ws_url)
如果只是单纯需要支持ws/wss协议,第一种方式足够简洁,无需额外编写复杂的自定义验证逻辑。
内容的提问来源于stack exchange,提问作者Frank C.
相关产品推荐
相关产品推荐

