Django + WSGI: принудительная инициализация объекта? - PullRequest
0 голосов
/ 05 июля 2010

У меня есть класс формы, который выглядит примерно так:

class RegisterForm(Form):
    username = Field(model_field='username', filters=validators.minlength(3))

Вы заметите, что username является переменной класса. Я считаю, что это означает, что Field будет создан один раз при первом использовании RegisterForm (после перезапуска apache). Он не будет перестроен между перезагрузками страницы (если не будет создан 2-й WSGI-экземпляр (?), Но мы не будем вдаваться в подробности). Я заметил это, потому что некоторые из значений, которые я установил в Field.__init__, не сбрасываются.

Однако Form.__init__ действительно , кажется, вызывается перезагрузкой каждой страницы. Я думаю, это из-за того, как я это использую? На самом деле я создаю его как form = RegisterForm(request) при каждом запросе страницы.

Итак ... предположим, я не хочу, чтобы [переменные класса в] RegisterForm были "кэшированы" и чтобы Fields переинициализировался при каждом запросе ... как бы я это сделал? (без изменения синтаксиса RegisterForm; вы можете делать все что угодно внутри базового класса, Form)

Ответы [ 2 ]

0 голосов
/ 05 июля 2010

Вы можете определить класс внутри функции. Таким образом, он создается каждый раз, когда вызывается функция.

def gotclass(data):
  class InnerClass(object):
    someattr = DoSomethingWith(data)
  return InnerClass

MyNewClass = gotclass(42)
someobj = MyNewClass()
0 голосов
/ 05 июля 2010

Вы можете обновлять переменную класса при каждом создании:

class ContactForm(forms.Form):
    username = Field(model_field='username', filters=validators.minlength(3))
    def __init__(self, *args, **kwargs):
        super(ContactForm, self).__init__(*args, **kwargs)
        ContactForm.username = Field(model_field='username', filters=validators.minlength(3))
...