gpt4 book ai didi

python - @login_required 之后的 Django 重定向到下一个

转载 作者:太空狗 更新时间:2023-10-29 19:37:37 24 4
gpt4 key购买 nike

我觉得这是一个简单的问题,我只是少了一小步。

我想执行以下任意数量的操作(作为下一个参数中的术语):

[not signed in] -> profile -> login?next=/accounts/profile/ -> auth -> profile.
[not signed in] -> newsfeed -> login?next=/newsfeed/` -> auth -> newsfeed.

而我目前要去:

[not signed in] -> profile -> login?next=/accounts/profile/ -> auth -> loggedin
[not signed in] -> newsfeed -> login?next=/newsfeed/ -> auth -> loggedin

我希望以某种方式将 next 参数从 login 上的表单传递给 auth 并获得 auth重定向到这个参数

目前我正在尝试在我的 login.html 中:

<input type='text' name="next" value="{{ next }}">

但是这并没有得到下一个值。从调试工具栏可以看到:

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

View :

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)
print request.POST
return HttpResponseRedirect(request.POST.get('next'),'/accounts/loggedin')
else:
return HttpResponseRedirect('/accounts/invalid')

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="{{ request.GET.next }}">
<input type="submit" value="login">
</form>

{% endblock %}

设置:

from django.conf.urls import patterns, include, url

from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
# Examples:

url(r'^admin/', include(admin.site.urls)),
('^accounts/', include('userprofile.urls')),

url(r'^accounts/login/$', 'django_yunite.views.login'),
url(r'^accounts/auth/$', 'django_yunite.views.auth_view'),
url(r'^accounts/logout/$', 'django_yunite.views.logout'),
url(r'^accounts/loggedin/$', 'django_yunite.views.loggedin'),
url(r'^accounts/invalid/$', 'django_yunite.views.invalid_login'),

)

设置:

# 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'

打印语句显示一个空的 u'next'

最佳答案

查询字符串被隐式传递给任何 View ,您无需编写任何特殊代码。

您所要做的就是确保 next 键是从实际登录表单传递的(在您的情况下,这是在 /accounts/login/中呈现的表单), 到 /accounts/auth View 。

为此,您需要确保在您的设置中启用了请求模板上下文处理器 (django.core.context_processors.request)。为此,首先您需要导入 TEMPLATE_CONTEXT_PROCESSORS 的默认值,然后在您的 settings.py 中将请求处理器添加到它,如下所示:

from django.conf import global_settings

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

然后在表单中:

<form method="POST" action="/accounts/auth">
{% csrf_token %}
<input type="hidden" name="next" value="{{ request.GET.next }}" />
{{ login_form }}
<input type="submit">
</form>

现在,在您的 /accounts/auth View 中:

def foo(request):
if request.method == 'POST':
# .. authenticate your user


# redirect to the value of next if it is entered, otherwise
# to /accounts/profile/
return redirect(request.POST.get('next','/accounts/profile/'))

关于python - @login_required 之后的 Django 重定向到下一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21693342/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com