문제

사용자가 등록 할 수있는 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().

일반적으로 파이썬에서는 블록을 제외하고는 예외 처리기를 비우는 것으로 예외 핸들러를 갖는 것이 좋지 않은 것으로 간주됩니다. 다시 말해, 항상 다음과 같은 특정 예외를 캡처하십시오. User.DoesNotExist 이 경우.

안에 많은 줄을 두는 것도 열악한 연습입니다. 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 ...

최종적이고 사소한 권장 사항은 귀하의 사이트가 무거운 등록 요청을보기 시작하면 확장되지 않기 때문에 귀하의 견해로 직접 이메일을 보내지 않는 것입니다. 추가하는 것이 좋습니다 Django-Mailer 작업을 다른 프로세스로 처리 한 대기열에 오프로드하는 앱.

다른 팁

나는 개인적으로 if-else 진술의 짧은 지점을 먼저 배치하려고 노력합니다. 특히 돌아 오면. 이것은 어디에서 끝나는 것을보기 어려운 큰 가지를 얻지 않도록합니다. 많은 사람들이 당신이 한 것을 좋아하고 다른 진술에 의견을 제시합니다. 그러나 파이썬에는 항상 형식이 유효하지 않은 경우와 같이 블록 문의 끝이 없습니다.

예를 들어 :

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 ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top