Wie kann ich diesen „registrieren“ Blick in Django verbessern?
-
21-08-2019 - |
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)
)
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?