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 替换为请求实例。

于 2013-03-02T08:26:47.183 回答
0

由于绑定请求的咖喱,我认为它不是线程安全的。

但由于它在管理员中,所以它可能无关紧要。

于 2013-02-26T11:00:24.870 回答