كيف يمكنني تحسين هذا "تسجيل" وجهة نظر في جانغو؟

StackOverflow https://stackoverflow.com/questions/664937

سؤال

ولقد حصلت على موقع على جانغو التي تسمح للمستخدمين لتسجيل (ولكن يتطلب المسير الموافقة على الحساب قبل أن يتمكنوا من عرض أجزاء معينة من الموقع). أنا مستندة تشغيله من django.contrib.auth. I تطلب من المستخدمين لتسجيل مع عنوان بريد إلكتروني من اسم نطاق معين، حتى لقد تجاوز 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 ...

وA النهائية، بسيطة، التوصية بعدم إرسال البريد الإلكتروني مباشرة من وجهة نظرك لأن هذا سوف لا تحجيم إذا كان موقعك يبدأ لرؤية طلبات التسجيل الثقيلة. ذلك هو إضافة في أفضل جانغو-الارسال التطبيق لافراغ العمل في طابور التعامل معها من قبل عملية أخرى.

نصائح أخرى

وأنا شخصيا أحاول أن أضع فرع قصيرة من بيان إذا، آخر أولا. لا سيما إذا كان يعود. هذا لتجنب الحصول على فروع كبيرة حيث من الصعب أن نرى ما ينتهي حيث. كثير الآخرون مثل ما قمتم به ووضع تعليق في بيان آخر. ولكن الثعبان لا يتلقى دائما نهاية بيان كتلة - مثل إذا كان نموذج غير صالح بالنسبة لك.

وهكذا على سبيل المثال:

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