سؤال

هذه مشاهدات تسجيل الدخول الخاصة بي:

def login(request):

    redirect_to = request.REQUEST.get("next")
    if request.method == 'POST': 

        formL = LoginForm(data=request.POST)           
        if formL.is_valid(): 

            if not redirect_to or '//' in redirect_to or ' ' in redirect_to:
                redirect_to = "/blogs/"

            from django.contrib.auth import login
            login(request, formL.get_user())
            if request.session.test_cookie_worked():
                request.session.delete_test_cookie()
            return HttpResponseRedirect(redirect_to)

    else:

    formL = LoginForm(request)                 

request.session.set_test_cookie()  

return render_to_response('blogs.html', {
    'formL': formL, }, context_instance=RequestContext(request))

تسجيل الدخول = never_cache (تسجيل الدخول)

عندما أذهب ، على سبيل المثال ، إلى example.com/myblog/ ثم تم إعادة توجيه إلى example.com/accounts/login/؟next=/myblog/

ولكن عندما أقوم بإدخال المستخدم و PSW لتسجيل الدخول ، فقد تم إعادة توجيه /مدونات /وليس /myBlog /

لماذا ا ؟

تحرير: request.request.get ('next' ، '') ارجع دائمًا ''

أنا لا أعرف لماذا :-

هل كانت مفيدة؟

المحلول

كيف يبدو قالب نموذج تسجيل الدخول الخاص بك؟

مشكلتك

أنت لا ترسل redirect_to الطريق إلى القالب الخاص بك ويجب عليك. يجب أن تبدو عودتك هكذا:

return render_to_response('blogs.html', {
        'formL': formL,
        'next': redirect_to,
    }, context_instance=RequestContext(request)
)

يجب أن يبدو إجراء نموذج تسجيل الدخول هكذا:

<form action="/your_login_url/?next={{ next }}" method="post">

لذلك عندما تذهب إلى /myblog/ يتم إعادة توجيهك إلى /your_login_url/?next=/myblog/, ، عرض تسجيل الدخول ثم يجعل نموذج تسجيل الدخول ويحل محل next متغير في سمة عمل نموذج تسجيل الدخول لذلك يبدو /your_login_url/?next=/myblog/ وعندما تقوم بإرسال النموذج الذي يتم تسجيل الدخول إليه وإعادة توجيهك إليه /myblog/ (الاشياء بعد if request.method == 'POST': يتم تنفيذها).

في رأيك ، redirect_to = request.REQUEST.get("next") يعمل بشكل جيد عندما تكون فقط GET صفحة تسجيل الدخول ولكن عندما تكون POST لذلك ليس هناك next مجموعة متغيرة في GET.

ملاحظة أيضا

يجب ألا تقدم عرض تسجيل الدخول مدونتك ، يجب أن تفعل المدونات ذلك.

هذه هي الطريقة التي تبدو بها استجابة Django التي تم إرجاعها ، لاحظ الخط الذي تقول فيه redirect_field_name: redirect_to,, redirect_field_name له قيمة next بشكل افتراضي.

return render_to_response(template_name, {
    'form': form,
    redirect_field_name: redirect_to,
    'site': current_site,
    'site_name': current_site.name,
}, context_instance=RequestContext(request))

ويبدو أنك تتجاوز عرض تسجيل الدخول فقط لإعادة التوجيه الافتراضي؟ هذا ليس صحيحا IMHO. المكان المناسب لتعيين الموقع الافتراضي لإعادة توجيه تسجيل الدخول في الإعدادات الخاصة بك login_redirect_url.

ولكن نظرًا لأنك تكتب عرض تسجيل الدخول الخاص بك لماذا لا تستخدم الشخص في Django كهيكل عظمي ثم توسع عليه ما تحتاجه.

نصائح أخرى

لان

 not redirect_to or '//' in redirect_to or ' ' in redirect_to

يقيم إلى صحيح؟


ربما إذا علمنا الرجل الصيد؟http://docs.python.org/library/logging.html

ضع هذا في الأعلى

import logging
LOG_FILENAME = '/tmp/logging_example.out'
logging.basicConfig(filename=LOG_FILENAME,level=logging.DEBUG)

ضع هذا حيث يبدو مناسبًا في الكود الخاص بك (على سبيل المثال بعد البيان IF)

logging.debug("redirect_to = %s" % redirect_to)

قم بتشغيله ، ثم انظر إلى محتويات "/tmp/logging_example.out"

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top