0

ユーザー プロファイルを表示する Web アプリを作成しています。

プロファイルには、interest単方向または双方向のユーザーの他のユーザーの表示が含まれます。User認証と承認を処理するために、django に含まれているモデルを使用しています。

私が抱えている問題は、状況によっては、レンダリングされたページが以前に実行されたクエリからのデータを提示することです。具体的には、これは、同じコンピューター上で異なるブラウザー (OS X では Chrome と Safari、django 開発 Web サーバーを使用) で 2 人の異なるユーザーとしてアプリを使用している場合に発生します。ユーザー 1 のページを読み込んだ直後に、ユーザー 2 のページをリロードすると、ユーザー 1 のクエリ結果が表示されます。

クエリをコンソールに出力して、クエリが正しいことを確認しました。サーバーの再起動直後にページが適切なクエリをロードするため、問題は Web サーバーにある可能性があると思います。

何か案は?

** 編集: 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 の質問は 1 つです: Least astonishment in Python

于 2012-08-28T11:08:27.240 に答える