Python 2.7.8 和 Django==1.4.2(旧版应用)
几个月前,我在调查 Django 项目中的错误时遇到了一个令人困惑的问题。我相信这与 Django 池线程的方式有关,但真的很难确定。这是重现此问题的最小可行示例:
class FormA(Form):
field_a = CharField()
def __init__(self, *args, **kwargs):
if kwargs['initial']['test']:
self.base_fields['field_b'] = CharField()
super(FormA, self).__init__(*args, **kwargs)
class ViewA(FormView):
template_name = 'test'
form_class = FormA
def get_initial(self):
initial = super(ViewA, self).get_initial()
initial['test'] = self.request.GET.get('test')
当根据查询参数动态添加新字段时,如果首先发出查询参数test评估为 True的请求,则field_b将包含在 FormA 中。但是,我怀疑对于所有连续的请求(即使测试评估为 False),FormA 都会保留field_b。
造成这种情况的解决方法是POP或删除field_b从self.base_fields,然后评估测试变量。这有效,但我不完全确定为什么需要它。
def __init__(self, *args, **kwargs):
self.base_fields.pop('field_b', 0)
if kwargs['initial']['test']:
self.base_fields['field_b'] = CharField()
super(FormA, self).__init__(*args, **kwargs)
看起来, base_fields dict 在多个请求中持续存在。所以这提出了以下几点:
1) 为什么 base_fields dict 没有在每个请求上重新初始化?
2)是否有更好的解决方案来解决这个问题,而不是在 base_fields 上执行 pop/del?
3)如果没有其他解决方案,pop/del会导致竞争条件吗?如果两个请求同时发出会怎样——一个请求是否会弄乱另一个请求的 base_fields?
白衣非少年
相关分类