0

我正在编写一个显示用户配置文件的网络应用程序。

配置文件包括用户interest在其他用户中的显示,可以是单向或双向的。我正在使用 django 包含的User模型来处理身份验证和授权。

我遇到的问题是,在某些情况下,呈现的页面会呈现来自之前执行的查询的数据。具体来说,当我在同一台计算机上以不同浏览器(OS X 上的 Chrome 和 Safari;使用 django 开发 Web 服务器)上作为两个不同用户使用该应用程序时,就会发生这种情况。在我为用户 1 加载页面后,如果我为用户 2 重新加载页面,我会看到用户 1 的查询结果。

我通过将它们打印到控制台来确认我的查询是正确的。我认为问题可能出在网络服务器上,因为页面在服务器重新启动后立即加载了正确的查询。

有任何想法吗?

** 编辑:正如 Daniel 指出的那样,问题在于 interest_view 函数有一个字典作为默认参数。**


相关代码片段:

models.py

class Profile(UserenaBaseProfile):
    user = models.OneToOneField(User, unique=True)

class Interest(models.Model):
    user = models.ForeignKey(User, related_name=u'interests')
    interest = models.ForeignKey(User)

views.py

from django.http import HttpResponseForbidden
from django.shortcuts import get_object_or_404, render_to_response
from django.template import RequestContext

def interest_view(request, username, extra_context={}):
    user = get_object_or_404(User, username__iexact=username)

    profile = user.get_profile()
    if not profile.can_view_profile(request.user):
        return HttpResponseForbidden("You can't view this page.")

    interests = Interest.objects.filter(user=user)
    if len(interests) > 0:
        extra_context['active_interests'] = interests

    return render_to_response('interest_detail.html',
                              extra_context,
                              context_instance=RequestContext(request)
    )

interest_detail.html

{% if active_interests %}
    {% for interest in active_interests %}
        <li>
            {{ interest.interest.first_name }} {{ interest.interest.last_name }}
        </li>
    {% endfor %}
{% endif %}
4

1 回答 1

2

您没有显示任何代码,因此无法调试。但问题几乎可以肯定是您在模块级别定义查询,它们在进程的生命周期内持续存在(这是许多请求)。

编辑:

好吧,我几乎是对的 - 这是在模块级别定义的东西的问题,尽管在你的情况下它是 Python 默认参数陷阱。请参阅effbot以获得很好的解释,尽管对此的默认 SO 问题是:Least astonishment in Python

于 2012-08-28T11:08:27.240 回答