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


前言

虽然我们已经很小心,但是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<path>.*)$', 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,总有能够帮到你我他,或者提供一些灵感。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Django 中,我们可以使用日志记录记录应用程序中出现的错误信息。当应用程序发生错误时,我们可以使用 logging.error() 方法记录错误信息,并将错误信息写入到指定的日志文件中。 以下是一个简单的 Django 日志配置示例,该配置指定了一个名为 "file" 的日志处理器,并将其绑定到了 "django" 这个 logger 上。在这个配置中,我们设置日志级别为 ERROR,表示只有 ERROR 级别及以上的日志才会被记录下来,并将错误日志写入到指定的文件中。 ```python LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'file': { 'class': 'logging.FileHandler', 'filename': '/path/to/error.log', }, }, 'loggers': { 'django': { 'handlers': ['file'], 'level': 'ERROR', }, }, } ``` 如果我们想在代码中记录错误信息,在应用程序中捕获异常并使用 logging.error() 方法记录错误信息即可,例如: ```python import logging logger = logging.getLogger(__name__) def my_view(request): try: # some code that may raise an exception except Exception as e: logger.error('Error occurred: %s', e) ``` 在这个例子中,我们在应用程序的某个函数中使用 try/except 语句来捕获可能出现的异常,并使用 logging.error() 方法记录错误信息。在记录错误信息时,我们可以使用 %s 格式化字符串来将异常信息作为参数传递给 logging.error() 方法。 通过这种方式记录错误信息,我们可以在日志文件中查看应用程序出现的错误信息,从而更好地管理和维护我们的 Django 应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我辈李想

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值