Python 在Django中,当使用admin.stackedLine时,如何通过线程安全地将请求传递给表单'__是吗?
我想在StackedLine的表单集中向我的表单传递一个请求。现在我有:Python 在Django中,当使用admin.stackedLine时,如何通过线程安全地将请求传递给表单'__是吗?,python,django,thread-safety,django-admin,Python,Django,Thread Safety,Django Admin,我想在StackedLine的表单集中向我的表单传递一个请求。现在我有: 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, ob
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
这是可行的,但是这个解决方案是线程安全的吗?如果不是,我如何修复它?我认为它不是线程安全的,因为绑定请求的是curry
但是因为它在管理中,所以可能不重要。我认为它不是线程安全的,因为它绑定了请求
但是因为它在管理中,所以它可能不重要。这似乎不是线程安全的。根据您希望从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。这似乎不是线程安全的。根据您希望从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。我正在寻找通用解决方案,即我需要完整的原始请求,格式与视图中的格式相同,而不是副本。有一件事我仍然无法理解,为什么这不能像只传递一个param toаa函数那么简单。这并不是那么简单,因为原始请求绑定到一个线程锁(锁是元数据的一个属性)。这不可能是线程安全的,这就是您的问题所在。在传递请求对象之前,您仍然可以尝试将属性设为null。我正在寻找通用解决方案,即我需要以视图中的形式显示整个原始请求,而不是副本。有一件事我仍然无法理解,为什么这不能像只传递一个param toаa函数那么简单。这并不是那么简单,因为原始请求绑定到一个线程锁(锁是元数据的一个属性)。这不可能是线程安全的,这就是您的问题所在。在传递请求对象之前,您仍然可以尝试将属性设置为null。