我怎样才能提高在Django这个“登记”的看法?
-
21-08-2019 - |
题
我有一个基于Django的网站,允许用户注册(但需要管理员批准帐号才可以浏览网站的某些部分)。我立足其关闭django.contrib.auth
的。我要求用户从一个特定的域名的电子邮件地址注册,所以我已经覆盖了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()
有一个用户对象。
通常在Python中,它被认为是实践穷人有一试的异常处理程序/ except块是空的。换句话说,总是捕获一个特定的异常如User.DoesNotExist
对于这种情况。
这也是实践差具有在try的部分try
内许多行/ except块。这是更好的形式这样的代码:
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 ...
有一个最终的,次要的,建议是不能直接在您的看法发送电子邮件,因为如果您的网站开始看到沉重的注册请求,这将无法扩展。这是更好地加入 Django的邮件应用程序卸载工作纳入队列由另一个进程处理。
其他提示
我个人首先尝试把一个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%
。时有什么特别您不满意?
不隶属于 StackOverflow