Frage

Ich habe eine Django-basierte Website bekam die Benutzer registrieren können (aber erfordert einen Administrator das Konto zu genehmigen, bevor sie bestimmte Teile der Seite sehen können). Ich bin stützen sie weg von django.contrib.auth. Ich muss sich der Benutzer mit einer E-Mail-Adresse von einem bestimmten Domain-Namen registrieren, also habe ich die UserCreationForm der save() und clean_email() Methoden außer Kraft gesetzt.

Meine Registrierungsseite verwendet die folgende Ansicht. Ich bin interessiert zu hören, wie ich könnte diese Ansicht-Code-Verbesserungen oder Prozessverbesserungen verbessern (oder irgendetwas anderes, wirklich).

def register(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)

        if form.is_valid():
            message = None

            form.save()

            username = form.cleaned_data['username']
            password = form.cleaned_data['password1']

            user = authenticate(username=username, password=password)

            first_name = form.cleaned_data['first_name']
            last_name = form.cleaned_data['last_name']
            email = user.email

            # If valid new user account
            if (user is not None) and (user.is_active):
                login(request, user)
                message = "<strong>Congratulations!</strong> You have been registered."

                # Send emails
                try:
                    # Admin email
                    pk = None
                    try: pk = User.objects.filter(username=username)[0].pk
                    except: pass

                    admin_email_template = loader.get_template('accounts/email_notify_admin_of_registration.txt')
                    admin_email_context = Context({
                        'first_name': first_name,
                        'last_name': last_name,
                        'username': username,
                        'email': email,
                        'pk': pk,
                    })
                    admin_email_body = admin_email_template.render(admin_email_context)
                    mail_admins("New User Registration", admin_email_body)

                    # User email
                    user_email_template = loader.get_template('accounts/email_registration_success.txt')
                    user_email_context = Context({
                        'first_name': form.cleaned_data['first_name'],
                        'username': username,
                        'password': password,
                    })
                    user_email_body = user_email_template.render(user_email_context)
                    user.email_user("Successfully Registered at example.com", user_email_body)
                except:
                    message = "There was an error sending you the confirmation email. You should still be able to login normally."
            else:
                message = "There was an error automatically logging you in. Try <a href=\"/login/\">logging in</a> manually."

            # Display success page
            return render_to_response('accounts/register_success.html', {
                    'username': username,
                    'message': message,
                },
                context_instance=RequestContext(request)
            )
    else: # If not POST
        form = UserCreationForm()

    return render_to_response('accounts/register.html', {
            'form': form,
        },
        context_instance=RequestContext(request)
    )
War es hilfreich?

Lösung

Sie haben nicht einmal diesen Code benötigen, aber ich denke, der Stil:

pk = None
try: pk = User.objects.filter(username=username)[0].pk
except: pass

ist natürlich mehr geschrieben wie:

try:
    user = User.objects.get(username=username)
except User.DoesNotExist:
    user = None

und dann in Ihrem Admin-Vorlage verwendet {{ user.id }} statt {{ pk }} informieren.

Aber, wie ich schon sagte, brauchen Sie nicht, dass Code überhaupt, weil Sie bereits über ein Benutzerobjekt aus Ihrem Anruf müssen authenticate().

Im Allgemeinen in Python, es ist eine schlechte Praxis betrachtet die Exception-Handler in einem Versuch zu haben / außer Block leer sein. Mit anderen Worten erfassen immer eine spezifische Ausnahme wie User.DoesNotExist für diesen Fall.

Es ist auch eine schlechte Praxis viele Linien innerhalb des try Teil des Try / außer Block zu haben. Es ist besser, Form auf diese Weise zu codieren:

try:
    ... a line of code that can generate exceptions to be handled ...
except SomeException:
    ... handle this particular exception ...
else:
    ... the rest of the code to execute if there were no exceptions ...

Eine letzte, kleinere, Empfehlung ist nicht die E-Mail direkt aus Ihrer Sicht zu senden, da dies nicht skaliert, wenn Ihre Website beginnt schwere Registrierungsanforderungen zu sehen. Es ist besser, fügen Sie in der django-Mailer App, die Arbeit in eine Warteschlange abzuladen von einem anderen Prozess behandelt werden.

Andere Tipps

ich persönlich versuchen, zuerst den kurzen Zweig einer if-else-Anweisung zu setzen. Vor allem, wenn er zurückkehrt. Dies zu vermeiden, große Äste bekommen, wo seine schwer zu sehen, was dort endet, wo. Viele andere tun, wie Sie getan haben, und einen Kommentar in der else-Anweisung setzen. Aber Python muß nicht immer ein Ende der Blockanweisung - wie wenn ein Formular für Sie nicht gültig ist.

So zum Beispiel:

def register(request):
    if request.method != 'POST':
       form = UserCreationForm()
       return render_to_response('accounts/register.html', 
                                 { 'form': form, },
                                 context_instance=RequestContext(request)
                                 )

    form = UserCreationForm(request.POST)
    if not form.is_valid():
       return render_to_response('accounts/register.html', 
                                 { 'form': form, },
                                 context_instance=RequestContext(request)
                                 )
    ...

Erste Antwort: Es sieht verdammt viel besser als 95% der „verbessern meinen Code“ Fragen

.

Gibt es etwas Bestimmtes Sie unzufrieden sind?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top