执行python3 manage.py runserver时遇AttributeError: NoneType无startswith属性
解决Django运行
python3 manage.py runserver时的AttributeError问题 问题根源
你的settings.py加载.env文件的路径错误,导致数据库配置参数未被正确读取,DB_HOST取值为None,触发了MySQL后端的startswith属性调用错误。
因为settings.py位于project/todo/目录下,dirname(__file__)返回的是todo目录路径,用join(dirname(__file__), env_filename)会尝试读取todo/.env,但实际.env在项目根目录(与manage.py同级),所以加载失败,环境变量未注入系统。
修复方案
1. 修正settings.py的.env加载路径
修改加载.env的代码,改为从项目根目录读取:
import os from os.path import join, dirname, abspath from dotenv import load_dotenv # 获取项目根目录(manage.py所在目录) BASE_DIR = dirname(dirname(abspath(__file__))) ENV = os.environ.get('ENV') if ENV == 'PROD': env_filename = '.env.prod' elif ENV == 'TEST': env_filename = '.env.test' else: env_filename = '.env' # 从项目根目录加载.env文件 dotenv_path = join(BASE_DIR, env_filename) load_dotenv(dotenv_path)
2. 清理mydb.py的冗余代码
mydb.py中重复调用了mysql.connector.connect(),第二次调用未传参数会导致连接失败,删除冗余行:
# 删除此行冗余代码 # dataBase = mysql.connector.connect()
3. 验证环境变量加载(可选)
在settings.py中添加调试代码,确认环境变量是否正确读取:
# 调试用,确认DB_HOST是否为localhost print(os.environ.get('DB_HOST'))
运行python3 manage.py runserver前检查输出,确认无误后删除该行调试代码。
额外检查项
- 确保
python-dotenv已安装:执行pip install python-dotenv - 检查.env文件权限,确保当前用户可读取
- 确保.gitignore中包含.env,避免敏感信息提交到版本控制
内容的提问来源于stack exchange,提问作者marc
相关产品推荐
相关产品推荐

