2014-02-11 16 views
0

我目前無法獲得@login_required重定向的next值,原因有很多。我重視我的代碼爲login.html的頁面,我的項目設置@login_required得到下一個

輸入name=nextvalue=''而它應該包含從{{ next }}這是在調試轉儲顯示爲值:

GET data 
Variable Value 
u'next' [u'/accounts/profile/'] 

login.html

{% extends "base.html" %} 

{% block content %} 

    {% if form.errors %} 
    <p class="error"> Sorry, you have entered an incorrect username or password</p> 
    {% endif %} 
    <form action="/accounts/auth/" method="post">{% csrf_token %} 
    <label for="username">User name:</label> 
    <input type="text" name="username" value="" id="username"> 

    <label for="password">Password:</label> 
    <input type="password" name="password" value="" id="password"> 

    <input type='text' name="next" value="{{ next }}"> 
    <input type="submit" value="login"> 
    </form> 

{% endblock %} 

settings

# Build paths inside the project like this: os.path.join(BASE_DIR, ...) 
import os 
BASE_DIR = os.path.dirname(os.path.dirname(__file__)) 

# SECURITY WARNING: don't run with debug turned on in production! 
DEBUG = True 

TEMPLATE_DEBUG = True 

ALLOWED_HOSTS = [] 


# Application definition 

INSTALLED_APPS = (
    'django.contrib.admin', 
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    'debug_toolbar', 
    'userprofile', 
) 

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 
) 

ROOT_URLCONF = 'django_yunite.urls' 

WSGI_APPLICATION = 'django_yunite.wsgi.application' 

# Internationalization 
# https://docs.djangoproject.com/en/1.6/topics/i18n/ 

LANGUAGE_CODE = 'en-ca' 

TIME_ZONE = 'EST' 

USE_I18N = True 

USE_L10N = True 

USE_TZ = True 


# Static files (CSS, JavaScript, Images) 
# https://docs.djangoproject.com/en/1.6/howto/static-files/ 

STATIC_URL = '/static/' 

STATICFILES_DIRS = (
    ('assets', '/home/user/GitHub/venv_yunite/django_yunite/static/'), 
    ) 

TEMPLATE_DIRS = (
    './templates', 
    '/article/templates', 
) 

STATIC_ROOT = "/home/user/Documents/static/" 

AUTH_PROFILE_MODULE = 'userprofile.UserProfile' 

from django.conf import global_settings 
TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + (
     "django.core.context_processors.request", 
) 

views.py

def login(request): 
    c={} 
    c.update(csrf(request)) 
    return render_to_response('login.html', c) 
+0

這是使用自己的登入查看這裏,或正在使用'django.contrib.auth.views.login'?如果前者,你是否將'next'參數傳遞給你的上下文? – jonafato

+0

登錄視圖是我自己的,我將發佈代碼 –

回答

1

嘗試添加next參數對上下文。

def login(request): 
    c = {'next' : request.GET.get('next', '/')} 
    return render(request, 'login.html', c) 

一對夫婦在這裏附加說明:

  1. 你可能想使用render快捷方式或提供RequestContextcontext_instance參數傳送給render_to_response電話。

  2. Django的內建login視圖應該爲你處理這個,除非你需要特殊的邏輯。編寫自己的視圖沒有什麼問題,但是Django提供了很多功能,以減少自己編寫代碼的數量。內建的意見也具有經過良好測試和通用的好處。

+0

內置登錄是否包含csrf? –

+0

@MattStokes是的,CSRF保護由CsrfViewMiddleware處理。只要你已經在你的'INSTALLED_APPS'和'TEMPLATE_CONTEXT_PROCESSORS'設置中獲得了它,它就可以在任何使用'RequestContext'呈現的模板中使用,並在中間件處理你的視圖之前進行處理。 [docs](https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#how-to-use-it)解釋了它可以使用的不同方式。 – jonafato

+0

@MattStokes爲了增加一點清晰度,我在答案中使用的'render'函數自動使用'RequestContext'。這確保了所有的'TEMPLATE_CONTEXT_PROCESSOR'函數都能夠完成他們的工作,並在渲染模板之前將其他數據注入到上下文中(例如CSRF令牌,當前登錄用戶等)。 – jonafato

1

我最終做的是以下內容。對我來說,這似乎是一個黑客工作。有沒有更好的方式使用csrf登錄?

views

def login(request): 
    c={} 
    c.update(csrf(request)) 
    if 'next' in request.GET: 
    c['next'] = request.GET.get('next') 
    return render_to_response('login.html', c) 

def auth_view(request): 
    username = request.POST.get('username', '') 
    password = request.POST.get('password', '') 
    user = auth.authenticate(username=username, password=password) 

    if user is not None: 
    auth.login(request, user) 

    if request.POST.get('next') != '': 
     return HttpResponseRedirect(request.POST.get('next')) 
    else: 
     return HttpResponseRedirect('/accounts/loggedin') 
    else: 
    return HttpResponseRedirect('/accounts/invalid') 

login.html

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

我也在尋找這個,你的答案是幫助我的人。我認爲這應該是正確的答案。 – Robin