我们在我们的networking应用程序中实现了django-allauth,并且面临着随机泄漏。
当新用户进入注册页面时,有时用户会看到registry格中预先填写的最后一个用户的名字,姓氏和电子邮件地址 。 这种情况实际上是随机发生的 这也发生在configuration文件的编辑forms,这只是简单的djangoforms从self.request.user CBV(FormView)中的用户实例如下所示:
def get_form_kwargs(self): kwargs = super(ProfileView, self).get_form_kwargs() kwargs.update({ 'instance': self.request.user }) return kwargs
我们从网站安装说明中使用allauth的基本默认设置。 我们现在只使用它来进行电子邮件注册和login。
allauth settings.py(所有其他设置,我们有相同的说明如安装的应用程序,中间件等):
# DJANGO-ALLAUTH ACCOUNT_ADAPTER = 'users.adapter.AccountAdapter' LOGIN_URL = '/accounts/login/' LOGIN_REDIRECT_URL = 'bookings:booking_add' ACCOUNT_FORMS = {'signup': 'users.forms.SignupForm', } ACCOUNT_AUTHENTICATION_METHOD = 'email' ACCOUNT_EMAIL_REQUIRED = True ACCOUNT_EMAIL_VERIFICATION = 'none' ACCOUNT_USERNAME_REQUIRED = False ACCOUNT_CONFIRM_EMAIL_ON_GET = True ACCOUNT_LOGOUT_ON_GET = True SOCIALACCOUNT_EMAIL_VERIFICATION = 'none' ACCOUNT_EMAIL_SUBJECT_PREFIX = "" ACCOUNT_LOGIN_ON_EMAIL_CONFIRMATION = True AUTH_USER_MODEL = 'users.User' AUTHENTICATION_BACKENDS = ( 'django.contrib.auth.backends.ModelBackend', 'allauth.account.auth_backends.AuthenticationBackend', )
作为signupView我们使用默认的,但我们也尝试添加never_cache装饰器(没有帮助):
class SignupView(AllauthSignupView): template_name = 'account/signup.html' signup = never_cache(SignupView.as_view())
SignupForm ,覆盖默认的一个:
class SignupForm(AllauthSignupForm): """ django-allauth usage defined in settings in ACCOUNT_FORMS""" title = forms.CharField(label=_('Title'), widget=forms.Select(choices=choices.USER_TITLE)) first_name = forms.CharField(label=_('First Name')) last_name = forms.CharField(label=_('Last Name')) email = forms.EmailField(widget=forms.TextInput(attrs={'type': 'email',})) password1 = SetPasswordField(label=_("Password")) password2 = CustomPasswordField(label=_("Password (again)")) def __init__(self, *args, **kwargs): super(SignupForm, self).__init__(*args, **kwargs) set_form_field_order(self, ["title", "first_name", "last_name", "email", "password1", "password2"]) for field in self.fields: self.fields[field].widget.attrs['class'] = 'mdl-textfield__input' class Meta: fields = ('title', 'first_name', 'last_name', 'email', 'password1', 'password2')
我们使用默认的allauth LoginForm和LoginView。
它是Django 1.8.7,nginx(1个进程),gunicorn(4个工人)通过主pipe(作为1进程)运行。
我们在Django CBV FormView中遇到这样的问题时,发现了导致这种情况的麻烦。
def get_initial(self): user = self.request.user if something: self.initial.update({ 'title': user.title, 'first_name': user.first_name, 'last_name': user.last_name, 'email': user.email, 'phone': user.phone, 'street': user.street, 'city': user.city, 'zip_code': user.zip_code, 'country': user.country }) return self.initial
我们已经解决这个问题如下:
def get_initial(self): user = self.request.user initial = super(PassengerAddStep1FormView, self).get_initial() if something: initial.update({ 'title': user.title, 'first_name': user.first_name, 'last_name': user.last_name, 'email': user.email, 'phone': user.phone, 'street': user.street, 'city': user.city, 'zip_code': user.zip_code, 'country': user.country }) return initial