Django / psycopg2 / postgresql 可能损坏的模型返回无用的堆栈跟踪

0 投票
1 回答
646 浏览
提问于 2025-04-16 12:35

我正在把OpenID整合到我自己的Django认证系统中。我使用的是python-openid,Django 1.2.5和PostgreSQL,参考的是examples/文件夹下的djopenid示例。

现在发生的事情是这样的。我使用了一个视图,这个视图调用了python-openid的各种机制,这些机制依赖于我提供的模型。但在这个过程中,有些地方出了问题。我的困扰不是为什么出错,而是我不知道哪里出错了。我的模型是根据它们的实现说明直接写的,但我可能犯了一两个错误。

这是错误堆栈信息:

mod_wsgi (pid=5476): Exception occurred processing WSGI script 
'/var/www/Django/Testbed/Testbed.wsgi'., referer: 
http://localhost/testbed/openidlogin
 Traceback (most recent call last):, referer: 
http://localhost/testbed/openidlogin
   File "/usr/lib/python2.7/site-packages/django/core/handlers/wsgi.py", line 
252, in __call__, referer: http://localhost/testbed/openidlogin
     response = middleware_method(request, response), referer: 
http://localhost/testbed/openidlogin
   File 
"/usr/lib/python2.7/site-packages/django/contrib/sessions/middleware.py", line 
36, in process_response, referer: http://localhost/testbed/openidlogin
     request.session.save(), referer: http://localhost/testbed/openidlogin
   File 
"/usr/lib/python2.7/site-packages/django/contrib/sessions/backends/db.py", line 
61, in save, referer: http://localhost/testbed/openidlogin
     sid = transaction.savepoint(using=using), referer: 
http://localhost/testbed/openidlogin
   File "/usr/lib/python2.7/site-packages/django/db/transaction.py", line 229, 
in savepoint, referer: http://localhost/testbed/openidlogin
     connection._savepoint(sid), referer: http://localhost/testbed/openidlogin
   File "/usr/lib/python2.7/site-packages/django/db/backends/__init__.py", line 
56, in _savepoint, referer: http://localhost/testbed/openidlogin
     self.cursor().execute(self.ops.savepoint_create_sql(sid)), referer: 
http://localhost/testbed/openidlogin
   File "/usr/lib/python2.7/site-packages/django/db/backends/util.py", line 15, 
in execute, referer: http://localhost/testbed/openidlogin
     return self.cursor.execute(sql, params), referer: 
http://localhost/testbed/openidlogin
   File 
"/usr/lib/python2.7/site-packages/django/db/backends/postgresql_psycopg2/base.py
", line 44, in execute, referer: http://localhost/testbed/openidlogin
     return self.cursor.execute(query, args), referer: 
http://localhost/testbed/openidlogin
 DatabaseError: current transaction is aborted, commands ignored until end of 
transaction block, referer: http://localhost/testbed/openidlogin

我了解到Django在使用PostgreSQL事务管理,而在这个过程中,我做了某些事情,导致了数据库的完整性问题。但它并没有告诉我具体是什么问题,或者我的代码中哪里出错了。我尝试过在settings.py关闭这个功能,看看是否能得到更清晰的错误堆栈信息,但没有。

我的问题非常简单:我该如何找到问题所在?我可以从一个有问题的SQL语句开始追溯(因为那会告诉我哪些模型出错),或者更好的是,得到一个涉及我代码的堆栈信息。即使是“postgresql错误代码XYZ”也能让我有东西去搜索。有没有什么设置可以打开,让Django更详细一些?我正在使用

DEBUG = True
TEMPLATE_DEBUG = DEBUG

显然,我甚至没有看到黄色错误页面。只是普通的500内部服务器错误,以及Apache的错误日志中的堆栈信息。我还有其他地方可以查看吗?有没有什么选项可以启用,或者有什么炫酷的工具可以用来监控执行过程?

1 个回答

3

通过在某个端口上运行manage.py,然后在你的视图里放一个ipdb.set_trace()的调用,这样你就可以一步一步地调试,就像其他调试过程一样。

你还可以使用Python/Django自带的日志功能,把信息打印到日志文件里。

想要更多的调试技巧,可以看看这里,也许有些对你有帮助。

撰写回答