【Django异常报错】持续记录,欢迎提供问题

文章目录

  • 前言
  • 一、Model class m.m doesn‘t declare an explicit app_label and isn‘t in INSTALLED_APPS
    • 项目场景:
    • 问题描述
    • 原因分析:
    • 解决方案:
  • 二、django报错django.db.utils.InterfaceError:(0,'')
    • 项目场景:
    • 问题描述
    • 原因分析:
    • 解决方案:
  • 三、dumpdata报错 CommandError: Unable to serialize database: 'gbk' codec can't encode character '\xe5' in position 126945: illegal multibyte sequence
  • 四、media配置后,所有文件访问都是404
  • 五、ERROR 1: PROJ: proj_identify: Cannot find proj.db
  • 六、psycopg2.InterfaceError: connection already closed
  • 总结


前言

虽然我们已经很小心,但是django在日常使用中还是会出现一些问题,总是有一些报错是少部分人碰到的,而且都不是很好处理。本篇博客是一个记录,也作为收集,愿我们共同进步。


一、Model class m.m doesn‘t declare an explicit app_label and isn‘t in INSTALLED_APPS

项目场景:

此问题区分具体场景,多发生在views.py通过import导入app的models.py文件。


问题描述

这个报错具体原因不是报错提示的原因,而是我们import导入时报的错误,错误原因指向INSTALLED_APPS,注意,其实这时我们INSTALLED_APPS是正常的。


原因分析:

djnago项目app下的apps.py文件配置问题,可能是移动app造成的。


解决方案:

# settings的INSTALLED_APPS
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.gis',  # 新增

    'rest_framework',
    'corsheaders',

    'geoserver.apps.GeoserverConfig',
    'users.apps.UsersConfig',
]
# apps.py文件
from django.apps import AppConfig


class UsersConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'users'

# models.py文件导入
from geoserver.models import SarLayer

二、django报错django.db.utils.InterfaceError:(0,‘’)

项目场景:

在使用django的models类进行增删改查时,可能意外触发,一般情况下如果触发,后续数据库操作均无效。


问题描述

如果程序做了异常处理,收到的报错信息将是(0,‘’),如果后端报错将是django.db.utils.InterfaceError:(0,‘’)。


原因分析:

mysql、oracle数据库均可能触发这个问题,django默认的sqlite3没有这个问题。主要是数据库连接超过8小时将自动断开,后续通过这个链接的均无法使用。


解决方案:

网络上基本有3种方式:
第一种:因为长时间没有使用连接池里的连接,导致一部分连接已经失效,因此手动清理一下老旧的连接即可。

import django.db
django.db.close_old_connections()
print(list(django.contrib.auth.models.User.objects.all()))

第二种:

from django.db import transaction 


class Command(BaseCommand):
    help = "Check order"

    def add_arguments(self, parser):
        parser.add_argument("--order-no", nargs="?", type=str)

    def handle(self, *args, **options):
        with transaction.atomic():
            order = Orders.objects.get(order_no=options["order_no"])
            print(order)

第三种:

self.db = pymysql.connect('ip', 'user', 'password', 'database', charset='utf8')
self.cur = self.db.cursor()
sel = 'SELECT title FROM dj_news WHERE type=1 ORDER BY id DESC LIMIT 200'
self.db.ping(reconnect=True)  # 检查连接是否存在,断开的话重连
self.cur.execute(sel)

三、dumpdata报错 CommandError: Unable to serialize database: ‘gbk’ codec can’t encode character ‘\xe5’ in position 126945: illegal multibyte sequence

python -Xutf8 manage.py dumpdata admin.logentry > dbname.json

虽然上述命令可以结果一些问题,但不是万能的,python manage.py 和django-admin还是有区别的,可以使用如下命令

django-admin dumpdata admin.logentry > dbname.json

还有就是在django的settings文件中加入如下代码:
import _locale

_locale._getdefaultlocale = (lambda *args: ['en_US', 'utf8'])

下载这个也可以试试

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

四、media配置后,所有文件访问都是404

这个问题是django项目settings配置的使用问题,官方不建议通过项目导入settings文件,以下为官方建议的方式。

# urls.py
from django.conf import settings
urlpatterns = [
    re_path(r'media/(?P.*)$', serve, {"document_root": settings.MEDIA_ROOT})
]

五、ERROR 1: PROJ: proj_identify: Cannot find proj.db

在settings文件中加入PROJ_LIB和GDAL_DATA环境。PROJ_LIB实际位置是项目虚拟环境中。只加一个不生效。

os.environ['PROJ_LIB'] = r"C:\Program Files\PostgreSQL\14\share\contrib\postgis-3.1\proj"
os.environ['GDAL_DATA'] = r'C:\Program Files\PostgreSQL\14\share\contrib\postgis-3.1'

六、psycopg2.InterfaceError: connection already closed

查询数据时,数据库连接关闭,django请求500,try异常时报错SSL SYSCALL error: EOF detected。
项目是geodjango+postgis项目,查询为空间方法,需要查询的多边形太大,每次查询数据库都会崩溃重启。最终是通过simplify矢量简化提高查询效率。可参考【GeoDjango框架解析】空间方法的ORM查询


总结

通过整理这些bug,总有能够帮到你我他,或者提供一些灵感。

你可能感兴趣的:(Django开始入门,django,python,后端)