[英]How can I improve this “register” view in Django?
我有一個基於 Django 的站點,允許用戶注冊(但需要管理員批准該帳戶才能查看站點的某些部分)。 我基於django.contrib.auth
。 我要求用戶使用某個域名的 email 地址進行注冊,因此我覆蓋了UserCreationForm
的save()
和clean_email()
方法。
我的注冊頁面使用以下視圖。 我有興趣了解如何改進這個視圖——代碼改進或流程改進(或其他任何東西,真的)。
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)
)
你甚至不需要這段代碼,但我認為風格:
pk = None
try: pk = User.objects.filter(username=username)[0].pk
except: pass
更自然地寫成:
try:
user = User.objects.get(username=username)
except User.DoesNotExist:
user = None
然后在您的管理員通知模板中使用{{ user.id }}
而不是{{ pk }}
。
但是,就像我說的那樣,您根本不需要該代碼,因為您已經通過調用authenticate()
獲得了用戶 object 。
通常在 Python 中,將 try/except 塊中的異常處理程序設為空被認為是不好的做法。 換句話說,對於這種情況,始終捕獲特定異常,例如User.DoesNotExist
。
在 try/except 塊的try
部分中有很多行也是不好的做法。 以這種方式編碼是更好的形式:
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 ...
最后的次要建議是不要在您的視圖中直接發送 email,因為如果您的站點開始看到大量注冊請求,這將無法擴展。 最好在django-mailer應用程序中添加以將工作卸載到由另一個進程處理的隊列中。
我個人嘗試將 if-else 語句的短分支放在首位。 特別是如果它返回。 這是為了避免在難以看到什么結束的地方獲得大分支。 許多其他人確實像您所做的那樣,並在 else 語句中發表評論。 但是 python 並不總是有塊語句的結尾 - 就像表單對您無效一樣。
例如:
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)
)
...
第一反應:它看起來比 95% 的“改進我的代碼”問題要好得多。
你有什么特別不滿意的地方嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.