如何用Python fnmatch实现URL白名单并排除指定路径?
解决URL权限校验中排除特定路径的问题
问题根源
你之前尝试用/auth/[!user-tracking/*]*来排除路径是错误的——fnmatch的[!...]是单个字符的否定匹配,而非对整个路径段的排除。这个模式会要求/auth/后的第一个字符不能是u、s、e等括号内的任意字符,自然会把/auth/signup/google/这类以u开头的子路径也错误排除。
正确解决方案:分开判断允许与排除规则
最清晰可靠的方式是保留原有的允许匹配规则,新增独立的排除列表,通过两层判断实现需求:
1. 配置定义
# 允许的URL模式(保留原有正确配置) ALLOWED_URL = [ '/auth/*' ] # 需要排除的URL模式 EXCLUDED_URL = [ '/auth/user-tracking/*' # 排除该路径及其所有子路径 # 若仅需精确排除单个路径,可改为:'/auth/user-tracking/' ]
2. 权限校验逻辑
from fnmatch import fnmatch # 先判断是否在允许范围内,再排除指定路径 is_allowed = ( any(fnmatch(request.path, pattern) for pattern in settings.ALLOWED_URL) and not any(fnmatch(request.path, pattern) for pattern in settings.EXCLUDED_URL) )
方案优势
- 逻辑清晰:允许规则和排除规则分离,后续新增或修改规则时更易维护
- 避免误用:无需纠结fnmatch复杂的字符集匹配语法,降低出错概率
内容的提问来源于stack exchange,提问作者Anuj TBE
相关产品推荐
相关产品推荐

