Django能否在单个方法中合并实现文件扩展名与大小双重校验
结论
完全可以通过多个if判断在同一个方法内同时完成文件扩展名、文件大小两类校验,不需要拆分多个独立校验函数,整合时只需要修正原有独立代码的逻辑缺陷、规范语法即可。
原有独立代码的问题
- 扩展名识别逻辑有缺陷:
os.path.splitext()只会从文件名最后一个.的位置切分后缀,遇到.tar.gz、.tar.xz这类多段后缀的文件,只会拿到最后一段后缀(比如test.tar.gz会被识别为.gz),会导致合法格式校验不准 - 存在缩进不规范的语法问题,直接运行会报错
- 没有兼容后缀名大小写的场景,比如用户上传
TEST.TAR.GZ这类大写后缀的文件会被误判为不合法
整合后的单方法校验实现
import os from django.core.exceptions import ValidationError def validate_file(value): # 第一重校验:文件大小校验 max_allowed_size = 10 * 1024 * 1024 # 10MB,用计算式替代硬编码数值,可读性更强 if value.size > max_allowed_size: raise ValidationError("The maximum file size that can be uploaded is 10MB") # 第二重校验:文件扩展名校验,兼容多段后缀、大小写场景 valid_extensions = ['.tar.gz', '.tgz', '.tar', '.gz', '.tar.xz', '.zip'] lower_filename = value.name.lower() is_ext_valid = any(lower_filename.endswith(ext) for ext in valid_extensions) if not is_ext_valid: raise ValidationError(u'File not supported, Please upload only .tar.gz / .tgz / .zip') # 所有校验通过后返回文件对象 return value
说明
- 两个if判断按顺序执行,你可以根据需求调整两类校验的先后顺序
- 任意一个校验不通过,都会抛出对应的错误提示
- 所有校验逻辑都封装在
validate_file单个方法内,直接在文件上传的字段上配置这个校验函数即可使用
内容的提问来源于stack exchange,提问作者user11603936
相关产品推荐
相关产品推荐

