我们已经在我们的网络应用程序中实现了django-allauth,我们正面临随机泄密。
当新用户进入注册页面时,有时用户会看到以注册形式预先填写的最后登录用户的名字,姓氏和电子邮件地址。这有时是偶然发生的。这也发生在配置文件编辑表单中,这只是简单的django表单,从CBV(FormView)中的self.request.user获取用户的实例,如下所示:
def get_form_kwargs(self):
kwargs = super(ProfileView, self).get_form_kwargs()
kwargs.update({
'instance': self.request.user
})
return kwargs
我们正在使用网站安装说明中的allauth的基本默认设置。我们现在只使用它来进行电子邮件注册和登录。
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个工作者)通过主管(作为1个进程)。
答案 0 :(得分:0)
当我们在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