为 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 RegistrationViewregistration/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