2010-05-13 128 views
3

這是我的登錄訪問量:登錄和重定向

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/然後我一直重定向到例如.COM /帳號/登錄/?接下來=/myblog/

,但是當我插入用戶和PSW進行登錄,然後我一直重定向到/博客/不/ myblog/

爲什麼?

編輯:request.REQUEST.get( '未來', '')總是返回'

我不知道爲什麼: - \

+0

你可以提供blogs.html,這很可能是一個錯誤 – KillianDS 2010-05-13 10:49:17

回答

8

您的登錄表單模板的外觀如何?

你的問題

你是不是發送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它存在GET不next變量集。

還要注意

登錄而不應該使你的博客,博客查看應該這樣做。

這就是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)) 

而且,你似乎只爲默認重定向覆蓋登錄視圖?這是不正確的恕我直言。 通過設置LOGIN_REDIRECT_URL,您可以在settings.py中設置登錄重定向默認位置的正確位置。

但是,由於您正在編寫自己的登錄視圖,爲什麼不使用django中的一個作爲骨架,然後在其上展開所需的內容。

+0

老實說,我的理解和理解都是分開的,但是你的整個故事根本不清楚。請更加符合名稱和原因。例如。你在談論redirect_to,但是你在模板中使用{{next}},你會從無處獲得url標記,並且你正在談論LOGIN_REDIRECT_URL,這是全局重定向,特定重定向默認通過'下一個「,所以他就在那裏。不過,你又是對的,他可以更容易地擴展默認登錄(只需覆蓋模板)。 – KillianDS 2010-05-13 12:07:22

+0

erm ...好的,我不是世界上最好的英文作家,哎呀,我幾乎可以正確拼寫克羅地亞文,但除此之外,我已經根據您的異議編輯了我的答案,但仍然是'redirect_to =「/ blogs/「'是不對的,正確的做法是使用全局重定向,即LOGIN_REDIRECT_URL,這就是爲什麼它在那裏。另外,歡迎您複製我的答案並對其進行編輯,以便舉例說明答案的外觀。 – 2010-05-13 12:43:23

+0

你對此表示感謝;) – xRobot 2010-05-13 22:33:20

1

因爲

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'

+0

是的,但爲什麼它是真的? 這是錯誤的嗎? : redirect_to = request.REQUEST.get(「next」) – xRobot 2010-05-13 09:36:51