0

単一の Web ページから AJAX を使用して同じサービスを同時に呼び出すときに発生するスレッドの問題のため、Django の TemplateView を確認しています。

この症状は、サーバー上の要求/応答に関連するスレッドの問題で予想されるものです。最初の呼び出しで期待した値が最初と 2 番目の呼び出しの両方に返されることもあれば、逆になることもあれば、期待どおりに機能することもあります。AJAX 呼び出しをシリアル化すると、結果は常に正しくなります。

コードを見ると、TemplateView が TemplateResponseMixin を継承していることがわかります。これには次の実装があります。

def render_to_response(self, context, **response_kwargs):
    """
    Returns a response, using the `response_class` for this
    view, with a template rendered with the given context.

    If any keyword arguments are provided, they will be
    passed to the constructor of the response class.
    """
    response_kwargs.setdefault('content_type', self.content_type)
    return self.response_class(
        request = self.request,
        template = self.get_template_names(),
        context = context,
        **response_kwargs
    )

そのため、TemplateView には というインスタンス変数が必要self.requestです。特定の TemplateView サブクラス インスタンスを使用して同時リクエストを処理すると、このような動作が見られると思います。

私はこれについて正しいですか?同時リクエストの処理に関して、Django のスレッド モデルについては調べていません。それらのスレッド化モデルが、私が扱ってきたすべての Java サーブレット エンジンで使用されているものと似ている場合、これが壊れていない方法は考えられません。Django が TemplateView インスタンスのプールを使用して同時リクエストを処理するような凝った処理を行ったり、リクエストをキューに入れるなどの初歩的な処理を行ったりする場合は、間違った場所を探していることになり、スレッドの問題を修正するために別の場所を探す必要があります。

よろしくお願いします。

4

1 に答える 1

4

リクエストごとに 1 つのビュー インスタンスがあり、これを行うコードは の実装で見つけることができますView.as_view(これは URL conf で呼び出すものです)。

ただし、一部のTemplate Tagsはスレッド セーフではありません。

さらにサポートを提供するために、発生している問題について詳しく教えていただく必要があると思います。また、リクエストを処理するために使用しているテクノロジーを教えてください。mod_wsgi、Gunicorn、またはその他のものですか?

于 2013-08-30T16:24:07.833 に答える