تسجيل الدخول وإعادة التوجيه
-
26-09-2019 - |
سؤال
هذه مشاهدات تسجيل الدخول الخاصة بي:
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"