如何配置pylint/flake8对外部库特定符号的使用触发告警
导入限制配置方案
以下分别提供flake8和pylint两种实现方案,均为静态检查规则,不需要修改运行时代码,也不需要monkey patching。
flake8 配置方法
使用flake8-import-restrictions插件实现精准导入限制:
- 安装插件
pip install flake8-import-restrictions - 在项目根目录的
.flake8配置文件中添加如下规则:
[flake8] import-restrictions = deny django.contrib.auth.decorators.login_required, deny from django.contrib.auth.decorators import login_required, import-restriction-message = 禁止使用Django默认的login_required,请使用项目自定义的对应实现
将提示内容中的自定义实现路径替换为你项目实际的导入路径即可。配置生效后,所有导入Django原生login_required的代码都会触发告警,可自行调整规则级别为错误来阻断CI流程。
pylint 配置方法
pylint可以通过自定义轻量检查器实现需求,不需要额外安装第三方插件:
- 首先在项目中新建自定义检查器文件,路径为
pylint_plugins/forbid_imports.py,内容如下:
from pylint.checkers import BaseChecker from pylint.interfaces import IAstroidChecker class ForbidDjangoLoginRequiredChecker(BaseChecker): __implements__ = IAstroidChecker name = 'forbid-django-login-required' priority = -1 msgs = { 'E9001': ( '禁止使用Django默认的login_required,请使用项目自定义的xxx.login_required', 'forbidden-django-login-required', '不允许调用原生Django的login_required装饰器' ), } def visit_importfrom(self, node): if node.modname == 'django.contrib.auth.decorators': for name, _ in node.names: if name == 'login_required': self.add_message('forbidden-django-login-required', node=node) def visit_import(self, node): for name, _ in node.names: if name == 'django.contrib.auth.decorators.login_required': self.add_message('forbidden-django-login-required', node=node) def register(linter): linter.register_checker(ForbidDjangoLoginRequiredChecker(linter))
- 然后在pylint配置文件(
pylintrc或pyproject.toml)中添加插件加载配置,以pyproject.toml为例:
[tool.pylint.master] load-plugins = ["pylint_plugins.forbid_imports"]
配置完成后pylint扫描代码时,只要命中导入规则就会抛出对应错误。
内容的提问来源于stack exchange,提问作者Zulan
相关产品推荐
相关产品推荐

