虽然我们已经很小心,但是django在日常使用中还是会出现一些问题,总是有一些报错是少部分人碰到的,而且都不是很好处理。本篇博客是一个记录,也作为收集,愿我们共同进步。
此问题区分具体场景,多发生在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的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)
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')
这个问题是django项目settings配置的使用问题,官方不建议通过项目导入settings文件,以下为官方建议的方式。
# urls.py
from django.conf import settings
urlpatterns = [
re_path(r'media/(?P.*)$', serve, {"document_root": settings.MEDIA_ROOT})
]
在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'
查询数据时,数据库连接关闭,django请求500,try异常时报错SSL SYSCALL error: EOF detected。
项目是geodjango+postgis项目,查询为空间方法,需要查询的多边形太大,每次查询数据库都会崩溃重启。最终是通过simplify矢量简化提高查询效率。可参考【GeoDjango框架解析】空间方法的ORM查询
通过整理这些bug,总有能够帮到你我他,或者提供一些灵感。