Django TemplateSyntaxError: current transaction is aborted,这个异常是啥意思? postgresql 8.4 可以与 django 一起正常工
Posted
技术标签:
【中文标题】Django TemplateSyntaxError: current transaction is aborted,这个异常是啥意思? postgresql 8.4 可以与 django 一起正常工作吗?【英文标题】:Django TemplateSyntaxError: current transaction is aborted, what does this exception mean? Does postgresql 8.4 work fine with django?Django TemplateSyntaxError: current transaction is aborted,这个异常是什么意思? postgresql 8.4 可以与 django 一起正常工作吗? 【发布时间】:2010-12-24 10:56:24 【问题描述】:错误全文为:
TemplateSyntaxError at /
渲染时遇到异常: 当前交易被中止, 命令被忽略直到结束 交易区块
我最近在我的计算机上重新安装了所有软件。以前的代码可以正常工作。它在朋友的计算机和开发服务器上仍然可以正常工作。
我唯一能想到的可能已经改变的是 postgresql 服务器版本(实际上我不确定我是否尝试在旧安装的 8.4 上运行它 - 它肯定在 8.3 上运行)。 是否有人能够确认 Django 在 postgresql 8.4 上存在问题和/或对我为什么会出现这些错误有任何提示?
编辑 1
回应多米尼克... 这不会只发生在一个页面或一个标签上(尽管有些页面似乎没问题)。导致错误的标签和变量的唯一共同点是它们碰巧在途中访问数据库(尽管并非所有访问数据库的标签都会导致错误)。此外,相同的代码不会在其他计算机上创建 TemplateSyntaxError。
如果我删除了导致错误的变量或自定义模板标签,那么这就是发生的事件链:
-
我删除了可能导致错误的变量或标记并刷新页面。
Django 选择了一个不同的变量或标签,并出现同样的错误,所以我一直删除它们。
一旦导致错误的所有变量和标签都被删除,我将停止获取正确的错误页面。我得到一个带有以下回溯的纯白页面:
Traceback(最近一次调用最后一次): 运行中的文件“/usr/lib/python2.6/site-packages/django/core/servers/basehttp.py”,第 279 行 self.result = application(self.environ, self.start_response) __call__ 中的文件“/usr/lib/python2.6/site-packages/django/core/servers/basehttp.py”,第 651 行 返回 self.application(environ, start_response) __call__ 中的文件“/usr/lib/python2.6/site-packages/django/core/handlers/wsgi.py”,第 245 行 response = middleware_method(请求,响应) 文件“/usr/lib/python2.6/site-packages/debug_toolbar/middleware.py”,第 90 行,在 process_response response.content = replace_insensitive(smart_unicode(response.content), u'', smart_unicode(self.debug_toolbars[request].render_toolbar() + u'')) 文件“/usr/lib/python2.6/site-packages/debug_toolbar/toolbar/loader.py”,第 72 行,在 render_toolbar 'BASE_URL': self.request.META.get('SCRIPT_NAME', ''), 文件“/usr/lib/python2.6/site-packages/django/template/loader.py”,第 108 行,在 render_to_string 返回 t.render(context_instance) Instrumented_test_render 中的文件“/usr/lib/python2.6/site-packages/django/test/utils.py”,第 29 行 返回 self.nodelist.render(context) 文件“/usr/lib/python2.6/site-packages/django/template/__init__.py”,第 779 行,在渲染中 bits.append(self.render_node(节点,上下文)) 文件“/usr/lib/python2.6/site-packages/django/template/debug.py”,第 71 行,在 render_node 结果 = node.render(上下文) 文件“/usr/lib/python2.6/site-packages/django/template/defaulttags.py”,第 155 行,在渲染中 nodelist.append(node.render(context)) 文件“/usr/lib/python2.6/site-packages/django/template/defaulttags.py”,第 243 行,在渲染中 返回 self.nodelist_true.render(context) 文件“/usr/lib/python2.6/site-packages/django/template/__init__.py”,第 779 行,在渲染中 bits.append(self.render_node(节点,上下文)) 文件“/usr/lib/python2.6/site-packages/django/template/debug.py”,第 81 行,在 render_node 提高包裹 TemplateSyntaxError:渲染时捕获异常:当前事务被中止,命令被忽略,直到事务块结束 原始回溯(最近一次通话最后): 文件“/usr/lib/python2.6/site-packages/django/template/debug.py”,第 71 行,在 render_node 结果 = node.render(上下文) 文件“/usr/lib/python2.6/site-packages/django/template/debug.py”,第 87 行,在渲染中 输出 = force_unicode(self.filter_expression.resolve(context)) 解析中的文件“/usr/lib/python2.6/site-packages/django/template/__init__.py”,第 546 行 obj = self.var.resolve(context) 文件“/usr/lib/python2.6/site-packages/django/template/__init__.py”,第 687 行,解决 值 = self._resolve_lookup(上下文) _resolve_lookup 中的文件“/usr/lib/python2.6/site-packages/django/template/__init__.py”,第 722 行 当前 = 当前() 文件“/usr/lib/python2.6/site-packages/debug_toolbar/panels/template.py”,第 64 行,内容 pformat(k(self.request))) for k in get_standard_processors() 文件“/usr/lib/python2.6/site-packages/django/core/context_processors.py”,第 27 行,在 auth '消息': user.get_and_delete_messages(), 文件“/usr/lib/python2.6/site-packages/django/contrib/auth/models.py”,第 263 行,在 get_and_delete_messages 对于 self.message_set.all() 中的 m: _result_iter 中的文件“/usr/lib/python2.6/site-packages/django/db/models/query.py”,第 106 行 self._fill_cache() _fill_cache 中的文件“/usr/lib/python2.6/site-packages/django/db/models/query.py”,第 692 行 self._result_cache.append(self._iter.next()) 文件“/usr/lib/python2.6/site-packages/django/db/models/query.py”,第 238 行,在迭代器中 对于 self.query.results_iter() 中的行: 文件“/usr/lib/python2.6/site-packages/django/db/models/sql/query.py”,第 287 行,在 results_iter 对于 self.execute_sql(MULTI) 中的行: 文件“/usr/lib/python2.6/site-packages/django/db/models/sql/query.py”,第 2369 行,在 execute_sql cursor.execute(sql,参数) 文件“/usr/lib/python2.6/site-packages/debug_toolbar/panels/sql.py”,第 91 行,在执行中 返回 self.cursor.execute(sql, params) InternalError:当前事务被中止,命令被忽略直到事务块结束
【问题讨论】:
第一点很重要——你有一个TemplateSyntaxError
。向我们展示您的视图代码和任何被渲染的模板。
编辑了更多信息...
【参考方案1】:
如果您要从不同的数据库迁移,请注意,使用 Postgres 的 Django 使用事务的方式可能需要牢记一些注意事项。在这里阅读:
http://docs.djangoproject.com/en/dev/topics/db/transactions/?from=olddocs#handling-exceptions-within-postgresql-transactions
快速的答案通常是通过添加以下内容来打开数据库级别的自动提交:
'OPTIONS': 'autocommit': True,
到您的数据库设置。但值得一读并了解 coo。
罗洛。
【讨论】:
【参考方案2】:该异常意味着正在执行的某些 SQL 中存在错误。由于 Django 在数据库事务中运行所有 SQL,因此错误后正在执行的所有 SQL 都会被忽略。所以:
BEGIN;
SELECT * FROM table;
SELECT missing_column FROM table WHERE id = 1; -- generates an error because the column is missing
SELECT * FROM another_table; -- this statement and all following statements get ignored until the next COMMIT;
COMMIT;
要找出问题所在,请找到您的 PostgreSQL 日志文件并运行 tail -f /path/to/postgresql_error.log
。然后刷新页面。您应该会在日志文件中看到错误。
【讨论】:
这是正确的。 Django 在将 SQL 错误推送给用户方面非常糟糕,尤其是通过 psycopg2。相反,您会收到此交易错误,并且必须深入挖掘实际问题。 谢谢!非常有帮助,我终于知道该错误可能来自哪里......以上是关于Django TemplateSyntaxError: current transaction is aborted,这个异常是啥意思? postgresql 8.4 可以与 django 一起正常工的主要内容,如果未能解决你的问题,请参考以下文章