记录django项目开发过程中的遇到的问题,导致原因和已经奏效的解决方法
常见报错UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xbc in position 852: invalid start byte
这个问题在一些电脑上做django开发时经常出现
要么是py文件运行是就报这个类似的无法解码的问题,要么就是运行服务器后台添加数据保存时报这个错误
现总结了以下一些可能的原因和解决方法:
可能的原因:
- 1.GBK编码的文件(不一定是py文件)中输入了的汉字与django运行时的解码方式utf-8不一致;
- 2.在文件开头加上
# -*- coding:utf-8 -*-
,这个方法只对单个文件有效,而且加过一次后再去掉也仍然奏效 - 3.电脑命名出现了汉字(在设置中修改成英文即可,这是能搜索到的普遍的解答)
解决方法:
- 要么删除汉字,要么修改转换一下编码方式将原文件覆盖→用pycharm右下角的编码转换功能修改
上述编码错误还可能导致搜索功能的作用失效
使用python的全文检索框架帮助搜词时无法匹配到目标对象(你传入的page对象到模板中始终为空),这可能是因为分词txt文件出现了上述的编码冲突:
-
比如:templates/indexes/app1目录下的Model_text.txt的出现了汉字(注释也算)与django用的utf-8冲突
-
解决方法就是前面所说的修改编码方式为utf-8并重新加载文件
终端执行命令(如迁移python manage.py makemigrations)时报错:RuntimeError: Model class apps.xxx.xxx.XXXdoesn’t declare an explicit app_label and isn’t in an application in INSTALLED_APPS.
可能的原因:
- 检查models里面的外键关联对象名称是否有错,关联的对象名称格式应该是【app名.类名】(中间没有models.py文件名)
解决方法:
- 如上原因所示,关联的对象名称格式应该是【app名.类名】
执行迁移命令python manage.py makemigrations时报错
1.django.db.utils.OperationalError: (2003, “Can’t connect to MySQL server on ‘1xx.xx.xx.xxx’ ([WinError 10061] 由于目标计算机积极拒绝,无法连接。)”)
可能的原因:
- 检查服务器上MySQL服务程序是否启动,(用PS指令检查程序)启动(linux):
service mysql start
- 检查MySQL是否有授予访问权利给当前发起连接的主机IP,查看授权情况:
show grants for user@1xx.xx.xx.xx
(user是你在django配置中设置的数据库登录账号),不想查看,可直接执行授权操作
解决方法:
- 授权:
GRANT ALL PRIVILEGES ON `test`.* TO 'user'@'1xx.1xx.xx.xx' IDENTIFIED BY 'password' WITH GRANT OPTION;
其中test是名为test数据库(可理解为子库?),不输入’test’则是授权所有库,后面的user、ip和password要根据实际情况输入,示例:
如果出现报错ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
请往下查看解决方法:
数据库指定IP主机授权时报错ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
原因:
- 原因是密码太短,密码安全策略要求过高
解决方法:
-
查看当前的密码安全策略
show variables like "%validate%";
-
修改密码安全策略,修改密码长度为4位:
set global validate_password_length=4;
-
修改安全等级为low(0):
set global validate_password_policy=0;
-
再次查看密码安全策略:
show variables like "%validate%";
-
再次对指定的IP主机授权:
GRANT ALL PRIVILEGES ON `test`.* TO 'user'@'1xx.1xx.xx.xx' IDENTIFIED BY 'password' WITH GRANT OPTION;
返回OK:
djangoValueError: Unable to configure handler ‘mail_admins’
可能的原因:
- 可能是刚刚在源码因为复制(或修改)了一些东西(复制粘贴经常会报错,可能跟编码有关)
解决方法:
- 改成手写,或者不修改源码,重启服务器
python manage.py runserver
Reverse for ‘index’ with arguments ‘(3,)’ not found. 1 pattern(s) tried: [’$’]
可能的原因:
- 反向解析的名字错误(不一定是拼写错误,可能是你指向的url的别名错误)
解决方法:
- 根据报错的路由寻找模板中错误的反向解析
SyntaxError at/xx/xx;invalid syntax Syntax(redis.py, line 815)
可能的原因:
- redis源码中有关键字与python的冲突
解决方法:
- 根据提示定位错误处,进入源码将所有该关键字替换为一个不冲突的名字
configparser.NoOptionError: No option ‘connect_timeout’ in section: ‘config’
可能的原因:
- 给出的配置文件的路径错误,使用了相对路径
解决方法: - 改成绝对路径
如何解决from user.models import User类似的红色下划波浪线报错:
将apps package标记为资源根目录,在apps目录内导入其他py文件时会从apps下开始寻找
ImportError: cannot import name ‘six’ from ‘django.utils’
原因:
- django3six单独作为了一个包,而不是存在django.utils目录下
解决方法:
-
方法一:直接进入虚拟环境site-packages中将安装的six.py复制到同目录下django目录下的utils目录中
-
方法二:将from django.utils import six的语句全都改成import six
解决上面问题之后可能会出现错误:**ImportError: cannot import name ‘python_2_unicode_compatible’**原因同上
解决方法:
- 根据提示找到出错的模块,将出错的导入低吗改为
from six import python_2_unicode_compatible
(site-pakage下的six没有删除或移动到其他位置)或from django.utils.six import python_2_unicode_compatible
(six.py移动到了django.utils目录下)
进入文件/home/image/Desktop/pyenv/fresh/lib/python3.6/site-packages/haystack/inputs.py
修改为
数据迁移常见报错之 django.db.utils.InternalError: (1060, “Duplicate column name ‘addr_id’”)
问题截图(原因):
- 迁移的外键名与数据库中的列重复,迁移过的外键更改后又执行迁移,有时候无法避免,因为修改了一些数据,其报错效果类似下图新建一个外键字段一样:
解决方法:
- 从数据库删除报错的那一栏,使用navicat找到对应表,右键进入设计表模式,找到外键执行删除 (注意栏位【删除时】要改成级联CASCADE),on_delete=CASCADE代表删除主表时,关联的外键也会删除
然后记得删除与之相关联的不需要的栏位
InternalError at /(1054, “Unknown column ‘banner_list.foreign_spu_id’ in ‘field list’”)
可能的原因:
- 增加了新的外键,但数据库表中没有这个外键栏
解决方法: - 从数据库手动增加这个外键
InternalError at /xxx/xxx/xxx(1364, “Field ‘foreign_spu_id’ doesn’t have a default value”)
原因:
- 就是外键缺一个默认值(不知为什么外键需要一个默认值,而且也并没有强制要设定这个参数)
解决方法:: - 想一个默认值,添加默认值参数(default=‘xxx’),或者给外键设置参数可以为空(null=True)