Django TemplateSyntaxError:当前事务被中止,这个异常是什么意思?postgresql 8.4与django一起工作正常吗?

Mon*_*lik 7 python django postgresql

错误的全文是:

在/的TemplateSyntaxError

渲染时捕获异常:当前事务被中止,命令被忽略直到事务块结束

我最近重新安装了计算机上的所有软件.以前用过的代码没问题.它在朋友的计算机和开发服务器上仍然没有问题.

我唯一能想到的,可能已经改变的是postgresql服务器版本(我实际上并不确定我是否尝试在我的旧安装上运行8.4或者没有 - 它绝对适用于8.3).有人能够确认Django有postgresql 8.4的问题和/或有任何提示,为什么我有这些错误?

编辑1

为了回应Dominic ......这不仅仅发生在一个页面或一个标签上(虽然有些页面似乎没问题).导致错误的标签和变量的唯一共同点是它们碰巧在途中的某个地方访问数据库(尽管并非所有访问数据库的标签都会导致错误).此外,相同的代码不会在其他计算机上创建TemplateSyntaxError.

如果我删除了发生错误的变量或自定义模板标记,那么这就是发生的事件链:

  1. 我删除了导致错误并刷新页面的变量或标记.
  2. Django选择一个不同的变量或标签,并发生相同的错误,所以我一直删除它们.
  3. 一旦导致错误的所有变量和标签被删除,我就会停止获得正确的错误页面.我得到一个纯白页,其中包含以下回溯:
Traceback (most recent call last):

  File "/usr/lib/python2.6/site-packages/django/core/servers/basehttp.py", line 279, in run
    self.result = application(self.environ, self.start_response)

  File "/usr/lib/python2.6/site-packages/django/core/servers/basehttp.py", line 651, in __call__
    return self.application(environ, start_response)

  File "/usr/lib/python2.6/site-packages/django/core/handlers/wsgi.py", line 245, in __call__
    response = middleware_method(request, response)

  File "/usr/lib/python2.6/site-packages/debug_toolbar/middleware.py", line 90, in process_response
    response.content = replace_insensitive(smart_unicode(response.content), u'', smart_unicode(self.debug_toolbars[request].render_toolbar() + u''))

  File "/usr/lib/python2.6/site-packages/debug_toolbar/toolbar/loader.py", line 72, in render_toolbar
    'BASE_URL': self.request.META.get('SCRIPT_NAME', ''),

  File "/usr/lib/python2.6/site-packages/django/template/loader.py", line 108, in render_to_string
    return t.render(context_instance)

  File "/usr/lib/python2.6/site-packages/django/test/utils.py", line 29, in instrumented_test_render
    return self.nodelist.render(context)

  File "/usr/lib/python2.6/site-packages/django/template/__init__.py", line 779, in render
    bits.append(self.render_node(node, context))

  File "/usr/lib/python2.6/site-packages/django/template/debug.py", line 71, in render_node
    result = node.render(context)

  File "/usr/lib/python2.6/site-packages/django/template/defaulttags.py", line 155, in render
    nodelist.append(node.render(context))

  File "/usr/lib/python2.6/site-packages/django/template/defaulttags.py", line 243, in render
    return self.nodelist_true.render(context)

  File "/usr/lib/python2.6/site-packages/django/template/__init__.py", line 779, in render
    bits.append(self.render_node(node, context))

  File "/usr/lib/python2.6/site-packages/django/template/debug.py", line 81, in render_node
    raise wrapped

TemplateSyntaxError: Caught an exception while rendering: current transaction is aborted, commands ignored until end of transaction block


Original Traceback (most recent call last):
  File "/usr/lib/python2.6/site-packages/django/template/debug.py", line 71, in render_node
    result = node.render(context)
  File "/usr/lib/python2.6/site-packages/django/template/debug.py", line 87, in render
    output = force_unicode(self.filter_expression.resolve(context))
  File "/usr/lib/python2.6/site-packages/django/template/__init__.py", line 546, in resolve
    obj = self.var.resolve(context)
  File "/usr/lib/python2.6/site-packages/django/template/__init__.py", line 687, in resolve
    value = self._resolve_lookup(context)
  File "/usr/lib/python2.6/site-packages/django/template/__init__.py", line 722, in _resolve_lookup
    current = current()
  File "/usr/lib/python2.6/site-packages/debug_toolbar/panels/template.py", line 64, in content
    pformat(k(self.request))) for k in get_standard_processors()
  File "/usr/lib/python2.6/site-packages/django/core/context_processors.py", line 27, in auth
    'messages': user.get_and_delete_messages(),
  File "/usr/lib/python2.6/site-packages/django/contrib/auth/models.py", line 263, in get_and_delete_messages
    for m in self.message_set.all():
  File "/usr/lib/python2.6/site-packages/django/db/models/query.py", line 106, in _result_iter
    self._fill_cache()
  File "/usr/lib/python2.6/site-packages/django/db/models/query.py", line 692, in _fill_cache
    self._result_cache.append(self._iter.next())
  File "/usr/lib/python2.6/site-packages/django/db/models/query.py", line 238, in iterator
    for row in self.query.results_iter():
  File "/usr/lib/python2.6/site-packages/django/db/models/sql/query.py", line 287, in results_iter
    for rows in self.execute_sql(MULTI):
  File "/usr/lib/python2.6/site-packages/django/db/models/sql/query.py", line 2369, in execute_sql
    cursor.execute(sql, params)
  File "/usr/lib/python2.6/site-packages/debug_toolbar/panels/sql.py", line 91, in execute
    return self.cursor.execute(sql, params)
InternalError: current transaction is aborted, commands ignored until end of transaction block

she*_*ats 13

该异常意味着某些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;
Run Code Online (Sandbox Code Playgroud)

要找出问题,找到PostgreSQL的日志文件并运行tail -f /path/to/postgresql_error.log.然后刷新页面.您应该会在日志文件中看到错误.

  • 这是对的.Django非常擅长将SQL错误推送给用户,尤其是通过psycopg2.您会收到此事务错误,并且必须继续挖掘实际问题. (4认同)