1

StackedInlineのフォームセットでフォームにリクエストを渡したい。今私が持っています:

from django.contrib import admin
from django.utils.functional import curry


class AlbumInline(admin.StackedInline):
    form = AlbumAdminForm
    model = Album
    extra = 1

    def get_formset(self, request, obj=None, **kwargs):
        formset = super(AlbumInline, self).get_formset(request, obj, **kwargs)
        formset.form.__init__ = curry(formset.form.__init__, request=request)
        return formset

これは機能しますが、このソリューションはスレッドセーフですか?そうでない場合、どうすれば修正できますか?

4

2 に答える 2

1

これはスレッドセーフではないようです。HTTP 要求オブジェクトから何を使用するかに応じて、それを新しい HttpRequest にコピーし、スレッド セーフな情報 (つまり、ほとんどの情報から要求スレッド ロックを差し引いたもの) のみを含めることができます。

私の場合、次のようなものを使用します。

METACOPY = ['HTTP_X_REAL_IP', 'HTTP_X_FORWARDED_FOR', 'REMOTE_ADDR', 'REMOTE_HOST', 'SERVER_NAME', 'SERVER_PORT', 'LANG', 'LANGUAGE', 'HTTP_REFERER']
def thread_safe_copy(self):
    meta = dict([(k,self.META[k]) for k in METACOPY if k in self.META and isinstance(self.META[k], str)])
    request = HttpRequest()
    request.POST = self.POST
    request.GET = self.GET
    request.user = self.user
    request.path = self.path
    request.META = meta
    ...
    return request

ここでは、HttpResponse と WSGIResponse にモンキー パッチを適用しましたが、self を request インスタンスに置き換えることができます。

于 2013-03-02T08:26:47.183 に答える
0

リクエストをバインドするカレーのため、スレッドセーフではないと思います。

しかし、それは管理者にあるので、問題ではないかもしれません。

于 2013-02-26T11:00:24.870 に答える