2

我正在使用自定义后端(子类 django-registration 的 SimpleBackend)。我重写了该register()方法,因为我需要在注册过程中做一些处理(例如,与外部服务通信)。

如果注册失败,我可以告诉注册表错误吗?

这是否需要在表单验证级别实现?

作为另一个示例,在创建用户时可能会发生数据库错误。注册如何优雅地失败?

编辑:这是我的 SimpleBackend 子类:

class MySimpleBackend(SimpleBackend):
    def register(self, request, **kwargs):
        username, email, password = kwargs['username'], kwargs['email'], kwargs['password1']

        # 
        # Make a call to some external API, for example
        retval = api_call_to_somewhere()
        if retval is False:
            # Request failed: display some error message on registration form
            return something
            # OR
            raise some_other

        # Rest of code is the same as django-registration

        User.objects.create_user(username, email, password)

        # authenticate() always has to be called before login(), and
        # will return the user we just created.
        new_user = authenticate(username=username, password=password)
        login(request, new_user)
        signals.user_registered.send(sender=self.__class__,
                                     user=new_user,
                                     request=request)
        return new_user
4

2 回答 2

0

如果您要覆盖该register方法,则需要处理 ErrorHandling、ExceptionHandling、向用户显示消息以及在该register方法中记录自己。

如果您担心向用户显示错误消息,您可以查看django 的消息框架,这很简单:

def register(request):
    try:
        # Try something here
    except Exception:
        messages.error(request, "An Error Occured !")

此外,正如您谈到的验证,最好同时拥有客户端(jquery / ajax)验证和服务器端(django)验证,以远离垃圾邮件发送者和坏人。

如果您想记录错误以供服务器管理员、版主等使用,您可能还需要查看日志记录模块。

于 2012-12-21T23:10:26.593 回答
0

我最终定制了 django-registration 的register视图,来自registration.views(不要与SimpleBackend.register方法混淆)

原始视图调用backend.register()if form.is_valid(),然后重定向到成功 URL,因此它假定用户是在 中创建的backend.register(),没有捕获任何异常。添加我自己的代码来捕获异常,我可以引发错误backend.register()并将它们作为表单错误显示给用户。

下面是出现在函数django-registration\registration\views中间的register代码,其中包含我添加的行:

if request.method == 'POST':
    form = form_class(data=request.POST, files=request.FILES)
    if form.is_valid():
        try:  # added this line
            new_user = backend.register(request, **form.cleaned_data)
            if success_url is None:
                to, args, kwargs = backend.post_registration_redirect(request, new_user)
                return redirect(to, *args, **kwargs)
            else:
                return redirect(success_url)
        # added these 3 lines below
        except Exception, err:
            errors = form._errors.setdefault(NON_FIELD_ERRORS, ErrorList())
            errors.append(err)
于 2012-12-26T16:50:32.253 回答