2016-03-04 48 views
1

我不能重定向到认证后的Django中的下一页。我已经在views.py文件中定义了下一个,并调用了该值,但是在URL中它重定向到Login页面网址如下:认证后,它不会重定向到Django的下一页

而且没有@login_required其正常

工作将用户名和密码重定向到

http://127.0.0.1:8000/?next=/home/

之后,但我想:

http://127.0.0.1:8000/home(和显示首页)

请帮忙。

views.py

from django.shortcuts import render 
from django.contrib.auth import authenticate, login, logout 
from django.contrib.auth.decorators import login_required 
from django.http import HttpResponseRedirect, HttpResponse 
from django.contrib import auth 
from django.conf import settings 
from django.core.urlresolvers import reverse 
def login(request): 
    next = request.POST.get('next', 'home/') 
    if request.method == "POST": 
      username = request.POST['username'] 
      password = request.POST['password'] 
      user = authenticate(username=username, password=password) 


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

          return HttpResponseRedirect(settings.LOGIN_REDIRECT_URL) 
        else: 
          return HttpResponse("Inactive user.") 
      else: 
        return HttpResponseRedirect(settings.LOGIN_URL) 
    return render(request, "login.html") 

def logout(request): 
    auth.logout(request) 
    return HttpResponseRedirect(settings.LOGIN_URL) 

@login_required(redirect_field_name='next') 
def home(request): 
    return render (request, "home.html") 

App-urls.py:

from django.conf.urls import url 

from . import views 

urlpatterns = [ 
     url(r'^$', views.home, name='home'), 
    ] 

项目网址:

from django.conf.urls import url, include 
from django.contrib import admin 
from django.contrib.auth import views 


urlpatterns = [ 
     url(r'^admin/', admin.site.urls), 
     url(r'^home/', include('login.urls', namespace="login")), 
     url(r'^$', views.login), 
     url(r'^logout/$', views.logout), 
] 

Settings.py:

import os 

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


# Quick-start development settings - unsuitable for production 
# See  https://docs.djangoproject.com/en/1.9/howto/deployment/checklist/ 

# SECURITY WARNING: keep the secret key used in production secret! 
SECRET_KEY = '([email protected][email protected])_fo1l#k%78up_cheab#!(b24xv$!uj' 

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

ALLOWED_HOSTS = [] 


# Application definition 

INSTALLED_APPS = [ 
     'login', 
     'django.contrib.admin', 
     'django.contrib.auth', 
     'django.contrib.contenttypes', 
     'django.contrib.sessions', 
     'django.contrib.messages', 
     'django.contrib.staticfiles', 
    ] 

MIDDLEWARE_CLASSES = [ 
     'django.middleware.security.SecurityMiddleware', 
     'django.contrib.sessions.middleware.SessionMiddleware', 
     'django.middleware.common.CommonMiddleware', 
     'django.middleware.csrf.CsrfViewMiddleware', 
     'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 
    ] 

ROOT_URLCONF = 'myproject.urls' 

TEMPLATES = [ 
    { 
    'BACKEND': 'django.template.backends.django.DjangoTemplates', 
    'DIRS': [], 
    'APP_DIRS': True, 
    'OPTIONS': { 
     'context_processors': [ 
      'django.template.context_processors.debug', 
      'django.template.context_processors.request', 
      'django.contrib.auth.context_processors.auth', 
      'django.contrib.messages.context_processors.messages', 
     ], 
    }, 
}, 
] 

WSGI_APPLICATION = 'myproject.wsgi.application' 


# Database 
# https://docs.djangoproject.com/en/1.9/ref/settings/#databases 

DATABASES = { 
'default': { 
    'ENGINE': 'django.db.backends.sqlite3', 
    'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 
} 
} 


# Password validation 
# https://docs.djangoproject.com/en/1.9/ref/settings/#auth-password-  validators 

AUTH_PASSWORD_VALIDATORS = [ 
    { 
    'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 
}, 
{ 
    'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 
}, 
{ 
    'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 
}, 
{ 
    'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 
}, 
] 


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

LANGUAGE_CODE = 'en-us' 

TIME_ZONE = 'UTC' 

USE_I18N = True 

USE_L10N = True 

USE_TZ = True 


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

STATIC_URL = '/static/' 


LOGIN_URL = 'login/' 
APPEND_SLASH = False 

的login.html:

<!DOCTYPE html> 
<center> 

<section class="loginform cf"> 
<h1 style="color:blue"> User Login </h1> 
<form name="login" method="post" accept-charset="utf-8" action="{% url 'login:home' %}"> 
{% csrf_token %} 
<label for="usermail" align="center">User-Id </label> 
<input type="alphanumeric" name="userid" > 
<br \> 
<label for="password" align="center">Password </label> 
<input type="alphanumeric" name="password" > 
<br \> 
<input type="submit" value="Login" style="color:blue"> 
<input type="hidden" name="next" value="{{ next }}"/> 
</center> 
</form> 
</section> 
+0

首先,确保你改变密钥,因为它现在可供所有人看到... – ngoue

回答

1

你有一些不同的东西怎么回事正在影响它。您的urls.py文件需要一些清理。由于您已经定义了自己的登录/注销方法,因此不需要使用django.contrib.auth.views中的那些方法。所以,你的基地urls.py文件应该是这样的:

from django.conf.urls import url 
from django.contrib import admin 
import login.views 

urlpatterns = [ 
    url(r'^admin/', admin.site.urls), 
    url(r'^home/', include('login.urls') 
    url(r'^$', login.views.login) 
    url(r'^logout/$', login.views.logout) 
] 

login/urls.py文件可以保持不变。现在我们将登录/注销指向您的视图,而不是django.contrib.auth.views

您有settings.LOGIN_URL设置为login/,但您的urls.py文件指示/登录功能。对于这个答案,我将settings.LOGIN_URL更改为/以匹配您的网址文件。

您的login/views.py文件现在只需要进行一些更改,我们已经更新了urls.py文件。

我清理了一些不必要的导入语句,我从@login_required中删除了redirect_field_name='next',因为'next'是默认值。

我们需要检查POSTGET对象以获取next参数。

最大的变化是经过我们认证用户和验证,他们是积极的,而不是return HttpResponseRedirect(settings.LOGIN_REDIRECT_URL)我们只是做return HttpResponseRedirect('/home')或将它们发送到next URL我们从POST/GET数据抓起。

from django.shortcuts import render 
from django.contrib import auth 
from django.contrib.auth.decorators import login_required 
from django.http import HttpResponse, HttpResponseRedirect 
from django.conf import settings 

def login(request): 
    next = request.POST.get('next', request.GET.get('next', '')) 
    if request.method == "POST": 
     username = request.POST.get('username') 
     password = request.POST.get('password') 
     user = auth.authenticate(username=username, password=password) 
     if user is not None: 
      if user.is_active: 
       login(request, user) 
       if next: 
        return HttpResponseRedirect(next) 
       return HttpResponseRedirect('/home') 
      else: 
       return HttpResponse('Inactive user') 
     else: 
      return HttpResponseRedirect(settings.LOGIN_URL) 
    return render(request, "login.html") 

def logout(request): 
    auth.logout(request) 
    # Redirect back to login page 
    return HttpResponseRedirect(settings.LOGIN_URL) 


@login_required 
def home(request): 
    return render(request, "home.html") 

一旦你的,除非有别的东西我失踪,@login_required应适当重定向到登录页面,如果用户没有登录。

+0

没有工作仍然面临同样的问题。 –

+0

不知道我没有看到您的项目可以帮助您。当我创建一个新项目时,我的回答对我来说很好。 – ngoue

+0

但是我已经分享了所有相关文件.. :( –