为 Django-registration-redux 实施电子邮件白名单解决方案的正确方法?
Right way to implement email whitelist solution for Django-registration-redux?
我有可行的解决方案,但我相信我的解决方案不是很 pythonic。所以我希望有人能提出更好的方法。
对于 Django 版本 1.8.2,我使用的是 django-registration-redux 版本 1.2。我有自己的表格,因此我有设置 REGISTRATION_FORM = 'login_app.forms.MyRegForm'
.
此外,我需要一个功能,以便只允许列入白名单的电子邮件注册。根据 registration/backends/default/urls.py
寄存器视图由 class RegistrationView
在 registration/backends/default/views.py
:
中处理
...
from registration.backends.default.views import RegistrationView
...
url(r'^register/$',
RegistrationView.as_view(),
name='registration_register'),
...
RegistrationView
class 可以在 Github 上查看。因为这个 class 及其功能提供了所需的功能,所以我对它进行了子 class 编辑并复制了它的所有内容,只添加了几行我的代码。在我的 login_app.views.py
:
from registration.backends.default.views import RegistrationView
# and many other imports to satisfy actions inside MyRegView
class MyRegView(RegistrationView):
# some copied code
def register(self, request, form):
# some copied code
WHITELISTED_EMAILS = getattr(settings, 'WHITELISTED_EMAILS')
email_to_check = form.cleaned_data['email']
if email_to_check in WHITELISTED_EMAILS:
# registration performed
# by using copied code
else:
raise PermissionDenied
def registration_allowed(self, request):
# remaining copied code
最后我覆盖了url以便使用正确的视图:
...
from login_app.views import MyRegView
urlpatterns = [
...
url(r'^accounts/register/', MyRegView.as_view(), name='registration_register'),
...
]
这个解决方案工作正常,但我复制了太多代码。更优雅的白名单实现方案是什么?
我认为最简单的解决方案是在您的注册表中添加一个 clean_email
方法,然后在此处进行白名单处理。
class MyRegForm(ParentForm):
def clean_email(self):
email = self.cleaned_data['email']
# If the parent class already cleans the email, you might want to do
# email = super(MyRegForm, self).clean_email()
# Then check email here, and raise forms.ValidationError()
# if the email is not in the whitelist
return email
我有可行的解决方案,但我相信我的解决方案不是很 pythonic。所以我希望有人能提出更好的方法。
对于 Django 版本 1.8.2,我使用的是 django-registration-redux 版本 1.2。我有自己的表格,因此我有设置 REGISTRATION_FORM = 'login_app.forms.MyRegForm'
.
此外,我需要一个功能,以便只允许列入白名单的电子邮件注册。根据 registration/backends/default/urls.py
寄存器视图由 class RegistrationView
在 registration/backends/default/views.py
:
...
from registration.backends.default.views import RegistrationView
...
url(r'^register/$',
RegistrationView.as_view(),
name='registration_register'),
...
RegistrationView
class 可以在 Github 上查看。因为这个 class 及其功能提供了所需的功能,所以我对它进行了子 class 编辑并复制了它的所有内容,只添加了几行我的代码。在我的 login_app.views.py
:
from registration.backends.default.views import RegistrationView
# and many other imports to satisfy actions inside MyRegView
class MyRegView(RegistrationView):
# some copied code
def register(self, request, form):
# some copied code
WHITELISTED_EMAILS = getattr(settings, 'WHITELISTED_EMAILS')
email_to_check = form.cleaned_data['email']
if email_to_check in WHITELISTED_EMAILS:
# registration performed
# by using copied code
else:
raise PermissionDenied
def registration_allowed(self, request):
# remaining copied code
最后我覆盖了url以便使用正确的视图:
...
from login_app.views import MyRegView
urlpatterns = [
...
url(r'^accounts/register/', MyRegView.as_view(), name='registration_register'),
...
]
这个解决方案工作正常,但我复制了太多代码。更优雅的白名单实现方案是什么?
我认为最简单的解决方案是在您的注册表中添加一个 clean_email
方法,然后在此处进行白名单处理。
class MyRegForm(ParentForm):
def clean_email(self):
email = self.cleaned_data['email']
# If the parent class already cleans the email, you might want to do
# email = super(MyRegForm, self).clean_email()
# Then check email here, and raise forms.ValidationError()
# if the email is not in the whitelist
return email