【问题标题】:django manage.py test auth failsdjango manage.py 测试认证失败
【发布时间】:2009-07-06 18:14:38
【问题描述】:
当我运行 django 的测试套件时,我在 auth 应用程序上遇到错误。我(显然)没有编写任何身份验证代码,也没有为身份验证编写测试。但身份验证测试失败。这是我得到的一些错误,整个堆栈跟踪太大而无法放在这里:
以前有人处理过吗?
AttributeError: 'module' object has no attribute 'handler500'
DoesNotExist: UserProfile matching query does not exist.
----------------------------------------------------------------------
Ran 30 tests in 3.813s
FAILED (errors=17)
Destroying test database...
【问题讨论】:
标签:
django
testing
authentication
【解决方案1】:
我想通了。如果 auth 应用程序使用复杂的模板来呈现默认的 auth 模板视图,则会发生 auth 测试中的失败测试。 auth 应用程序使用您的应用程序使用的模板进行自我测试。我已将默认设置更改为与我网站的其他部分看起来相同的模板。
我在模板中犯的错误:
- auth 应用程序不知道的变量和反向 URL 的使用。
在我的情况下,身份验证模板中的用户个人资料信息(当您未登录时不可用)和错误的 url 反向标签导致身份验证应用程序测试出错。
当我放弃所有在基本身份验证模板上无用的东西时,所有身份验证测试都再次成功。
因此我又学到了一课:
分离模板中的内容和结构很有用。这很容易通过创建一个 base.html 模板文件来完成,该文件只定义了一个基本的 html 页面 结构 并包含一堆内容块。请参阅下面的示例代码:
下一步是创建一个 base_content.html,它扩展了 base.html 并且只定义了用于将内容呈现到页面中的 content 块。每个页面都需要基本的简单内容。
在您的应用程序中,您扩展 base_content.html 并填充剩余的空内容块或用新内容块覆盖它们。
使用这种技术可以很容易地创建扩展 base_content.html 的认证模板
或 base.html 用于非常基本的身份验证模板,因此大部分(无用)内容都被遗漏了。
示例 base.html
<body>
<div id="header">
{% block mainmenu %}{% endblock %}
</div>
<div id="userbar">
{% block userbar %}{% endblock %}
</div>
<div id="bigcontent">
{% block bigcontent %}{% endblock %}
</div>
</body>
示例 base.content
{% extends "base.html" %}
{% load i18n %}
{% block mainmenu %}
...content..
{% endblock %}
现在我的应用程序中的所有模板都扩展了基本内容模板,该模板的内容显示在每个页面上。
这样您就不会重复自己,并且您的模板代码会变得非常干燥,并且只需为您的身份验证视图使用 base.content 模板将使身份验证测试再次成功!