2013-07-04 60 views
0

您好我使用了django inbult認證URL和我的項目的視圖,現在已經完成了初始用戶帳戶創建/登錄/重置密碼過程。Django爲什麼內置認證登錄功能沒有通過成功登錄後的用戶信息

現在,用戶可以登錄並重定向到成功登錄後的網址accounts/profile /。

我對django登錄功能有幾點疑惑。爲了方便起見,我複製粘貼下面的django內置登錄功能代碼。

@sensitive_post_parameters() 
@csrf_protect 
@never_cache 
def login(request, template_name='registration/login.html', 
      redirect_field_name=REDIRECT_FIELD_NAME, 
      authentication_form=AuthenticationForm, 
      current_app=None, extra_context=None): 
    """ 
    Displays the login form and handles the login action. 
    """ 
    redirect_to = request.REQUEST.get(redirect_field_name, '') 

    if request.method == "POST": 
     form = authentication_form(request, data=request.POST) 
     if form.is_valid(): 

      # Ensure the user-originating redirection url is safe. 
      if not is_safe_url(url=redirect_to, host=request.get_host()): 
       redirect_to = resolve_url(settings.LOGIN_REDIRECT_URL) 

      # Okay, security check complete. Log the user in. 
      auth_login(request, form.get_user()) 

      return HttpResponseRedirect(redirect_to) 
    else: 
     form = authentication_form(request) 

    current_site = get_current_site(request) 

    context = { 
     'form': form, 
     redirect_field_name: redirect_to, 
     'site': current_site, 
     'site_name': current_site.name, 
    } 
    if extra_context is not None: 
     context.update(extra_context) 
    return TemplateResponse(request, template_name, context, 
          current_app=current_app) 

我的問題是:

1被設定爲django.contrib.auth '/資料/' 功能的REDIRECT_FIELD_NAME

我可以看到這個變量是從django.contrib.auth

from django.contrib.auth import REDIRECT_FIELD_NAME, login as auth_login, logout as auth_logout, get_user_model 

我沒有這個變量任何設置進口,但畢竟用戶成功登錄後,頁面將被引導到/帳號/資料/

2登錄功能是否已通過有關用戶的帳戶信息?如果是,我該如何訪問它?

從代碼,如果用戶成功登錄後,頁面會被重定向:return HttpResponseRedirect(redirect_to)

在我的情況

,重定向到賬戶/型材/,最初爲URL的觀點只是一個

HttpResponse("You have logged in successfully") 

現在,當我試圖實現視圖功能時,我意識到沒有關於用戶的信息已經通過。

我試過在視圖函數中使用print request,但是在服務器終端打印的信息中沒有關於用戶的信息,我得到的只是一長串系統設置或其他信息。但是,登錄應該通過誰已成功登錄到成功的登錄URL右側的信息?

非常感謝您的解釋。

回答

3

登錄後,您可以通過在視圖中引用request.user並在模板中引用來訪問用戶信息。所有你需要確保你通過HttpResponseRequestContext未來的請求。

是的,REDIRECT_FIELD_NAME在django.contrib.auth的__init__.py中定義,它只是一個"next"您從登錄表單傳遞的內容。

在Django中,有多種方法可以強制用戶登錄。通過使用@login_required裝飾查看功能,通過調用用戶定義的URL的內置登錄視圖等,請參閱登錄設置變量here。你會得到更多的想法。

Building custom login page。該鏈接爲您提供了自定義登錄實施的示例。考慮你用@login_required裝飾了一個視圖,它的相應URL是/login_test/。然後登錄表單中的{{next}}上下文變量將以/login_test/呈現。所以,在您登錄後,

<input type="hidden" name="next" value="{{ next }}" />

此元素的值將採取重定向爲每REDIRECT_FIELD_NAME。雖然我懷疑這個例子中缺少settings.LOGIN_URLlogin/的設置。沒關係,它在裝飾器本身作爲參數傳遞。

+0

嗨巴布,謝謝你回答我的問題。現在我明白了我現在第二個問題的答案。對於我的第一個問題,是的,我可以看到現在REDIRECT_FIELD_NAME已設置爲「下一個」。 「登錄表單」是什麼意思?我沒有觸及表格,也沒有傳遞任何信息。 – Mona

+0

@Mona更新了答案! – Babu

+0

你好,現在我得到了我的問題的答案,非常感謝! – Mona

1

一旦用戶被重定向到accounts/profile /,該鏈接的視圖將被返回。您可以通過使用request.user,按照此post訪問有關當前登錄用戶的信息。還可以查看您在視圖中訪問的信息。使用import pbd; pdb.set_trace()。這會彈出一個可以訪問所有當前變量的python提示符。要查看所有已定義的變量,請調用locals(),儘管這樣會打印出大量的垃圾。在模板中,如果用戶未登錄,您可以display a「無法訪問此頁」消息。

+0

嗨,非常感謝您的解釋。 – Mona

2

要覆蓋此行爲只是把按照您的應用程序的settings.py

LOGIN_REDIRECT_URL = "/"

這將重定向到您的主頁。您可以將此網址更改爲首選網址。