Replit环境安装Wagtail创建超级用户报common-passwords.txt.gz缺失错误
Replit环境Wagtail创建超级用户报common-passwords.txt.gz缺失问题
问题现象
在Replit的Python repl环境中通过pip安装Wagtail,启动项目后尝试创建超级用户时触发报错:FileNotFoundError: [Errno 2] No such file or directory: '/home/runner/.cache/pip/pool/f7/e7/0e/common-passwords.txt.gz'
初步排查为Wagtail依赖的Django密码校验模块无法找到common-passwords.txt.gz常用弱密码字典文件导致。
完整错误堆栈
~/NecessaryOffbeatEvents/mysite$ python3 manage.py createsuperuser Username (leave blank to use 'runner'): Email address: Password: Password (again): Traceback (most recent call last): File "/home/runner/NecessaryOffbeatEvents/venv/lib/python3.8/site-packages/django/contrib/auth/password_validation.py", line 236, in __init__ with gzip.open(password_list_path, "rt", encoding="utf-8") as f: File "/nix/store/2vm88xw7513h9pyjyafw32cps51b0ia1-python3-3.8.12/lib/python3.8/gzip.py", line 58, in open binary_file = GzipFile(filename, gz_mode, compresslevel) File "/nix/store/2vm88xw7513h9pyjyafw32cps51b0ia1-python3-3.8.12/lib/python3.8/gzip.py", line 173, in __init__ fileobj = self.myfileobj = builtins.open(filename, mode or 'rb') FileNotFoundError: [Errno 2] No such file or directory: '/home/runner/.cache/pip/pool/f7/e7/0e/common-passwords.txt.gz' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "manage.py", line 10, in <module> execute_from_command_line(sys.argv) File "/home/runner/NecessaryOffbeatEvents/venv/lib/python3.8/site-packages/django/core/management/__init__.py", line 446, in execute_from_command_line utility.execute() File "/home/runner/NecessaryOffbeatEvents/venv/lib/python3.8/site-packages/django/core/management/__init__.py", line 440, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "/home/runner/NecessaryOffbeatEvents/venv/lib/python3.8/site-packages/django/core/management/base.py", line 414, in run_from_argv self.execute(*args, **cmd_options) File "/home/runner/NecessaryOffbeatEvents/venv/lib/python3.8/site-packages/django/contrib/auth/management/commands/createsuperuser.py", line 87, in execute return super().execute(*args, **options) File "/home/runner/NecessaryOffbeatEvents/venv/lib/python3.8/site-packages/django/core/management/base.py", line 460, in execute output = self.handle(*args, **options) File "/home/runner/NecessaryOffbeatEvents/venv/lib/python3.8/site-packages/django/contrib/auth/management/commands/createsuperuser.py", line 182, in handle validate_password(password2, self.UserModel(**fake_user_data)) File "/home/runner/NecessaryOffbeatEvents/venv/lib/python3.8/site-packages/django/contrib/auth/password_validation.py", line 50, in validate_password password_validators = get_default_password_validators() File "/home/runner/NecessaryOffbeatEvents/venv/lib/python3.8/site-packages/django/contrib/auth/password_validation.py", line 22, in get_default_password_validators return get_password_validators(settings.AUTH_PASSWORD_VALIDATORS) File "/home/runner/NecessaryOffbeatEvents/venv/lib/python3.8/site-packages/django/contrib/auth/password_validation.py", line 36, in get_password_validators validators.append(klass(**validator.get("OPTIONS", {}))) File "/home/runner/NecessaryOffbeatEvents/venv/lib/python3.8/site-packages/django/contrib/auth/password_validation.py", line 239, in __init__ with open(password_list_path) as f: FileNotFoundError: [Errno 2] No such file or directory: '/home/runner/.cache/pip/pool/f7/e7/0e/common-passwords.txt.gz'
解决方法
报错核心原因是Replit环境会定期清理pip缓存,Django默认记录的pip缓存路径下的弱密码字典被清除,任选以下一种方法处理即可:
- 方法1:补全缺失路径和文件
先执行命令创建报错提示里不存在的目录:mkdir -p /home/runner/.cache/pip/pool/f7/e7/0e/
再把Django安装目录里自带的密码字典复制到刚创建的目录下,当前环境的Django存放在虚拟环境的site-packages路径中,直接执行复制命令:cp /home/runner/NecessaryOffbeatEvents/venv/lib/python3.8/site-packages/django/contrib/auth/common-passwords.txt.gz /home/runner/.cache/pip/pool/f7/e7/0e/
操作完成后重新执行创建超级用户的命令即可正常运行。该方法治标不治本,后续Replit清理pip缓存后可能再次出现同类问题。 - 方法2:修改配置固定密码字典路径(推荐)
打开项目目录下的settings.py文件,找到AUTH_PASSWORD_VALIDATORS配置段,定位到CommonPasswordValidator对应的配置项,添加OPTIONS参数指定字典文件的绝对路径,修改后配置示例如下:
保存配置后再执行创建超级用户命令即可,该方法直接指定了文件的固定存放位置,不会受pip缓存清理影响。AUTH_PASSWORD_VALIDATORS = [ { 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', }, { 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', }, { 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 'OPTIONS': { 'password_list_path': '/home/runner/NecessaryOffbeatEvents/venv/lib/python3.8/site-packages/django/contrib/auth/common-passwords.txt.gz' } }, { 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', }, ] - 方法3:临时关闭常用弱密码校验(仅测试环境可用)
如果只是本地搭建测试环境,不需要弱密码校验逻辑,可以直接把AUTH_PASSWORD_VALIDATORS里CommonPasswordValidator对应的整段配置注释或者删除,保存后再执行创建超级用户操作就不会读取该字典文件,自然不会触发报错。生产环境禁止使用该方法,会大幅降低账号安全性。
内容的提问来源于stack exchange,提问作者Omar Abdul-Hafiz
相关产品推荐
相关产品推荐

