Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django中,当使用admin.stackedLine时,如何通过线程安全地将请求传递给表单'__是吗?_Python_Django_Thread Safety_Django Admin - Fatal编程技术网

Python 在Django中,当使用admin.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

我想在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, 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。