为Django-registration-redux实施电子邮件白名单解决方案的正确方法?

时间:2015-10-19 13:38:01

标签: python django python-2.7 django-registration

我有工作的解决方案,但我担心我的解决方案不是pythonic。所以我希望有人能提出更好的方法。

使用Django ver 1.8.2我使用的是django-registration-redux ver 1.2。我有自己的表格,因此我设置了REGISTRATION_FORM = 'login_app.forms.MyRegForm'

此外,我需要一项功能,以便只允许列入白名单的电子邮件。根据{{​​1}}注册视图由registration/backends/default/urls.py中的RegistrationView类处理:

registration/backends/default/views.py
可以在Github上查看

... from registration.backends.default.views import RegistrationView ... url(r'^register/$', RegistrationView.as_view(), name='registration_register'), ... 课程。因为这个带有它功能的类提供了所需的功能,所以我将其子类化并复制了它的所有内容,只添加了几行代码。在我的RegistrationView

login_app.views.py

最后我覆盖了url,以便使用正确的视图:

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

此解决方案工作正常,但我复制了太多代码。什么是白名单实现更优雅的解决方案?

1 个答案:

答案 0 :(得分:2)

我认为最简单的解决方案是在您的注册表单中添加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