我正在尝试使用自定义用户模型,并且在登录时,我想将用户重定向到带有 session 中当前用户信息的主页。我在 Debug模式下运行应用程序并在 Chrome 开发工具中检查 session 信息。看起来一切都按要求设置了,但模板代码无法正确读取 session 信息
models.py
class User(AbstractBaseUser):
name=models.CharField(max_length=255)
email=models.CharField(max_length=255)
slug = models.SlugField(unique=True, blank=True)
.....
views.py
def sign_in(request):
user=None
# import pdb; pdb.set_trace();
if request.method=='POST':
form=SigninForm(request.POST)
if form.is_valid():
results=User.objects.filter(email=form.cleaned_data['email'])
if len(results) == 1:
if results[0].check_password(form.cleaned_data['password']):
request.session['user'] = results[0].pk
request.user=results[0]
return HttpResponseRedirect('/')
else:
.........
模板
{% if user %} <!-- I have also tried request.session.user !>
<li><a href="{% url 'sign_out' %}">Logout</a></li>
{% else %}
<li><a href="{% url 'sign_in' %}">Login</a></li>
<li><a href="{% url 'register' %}">Register</a></li>
{% endif %}
调试 session 。
>>> from django.test import Client
>>> resp=Client().post('/sign_in/',{'email':'<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="a6c7c8c9d2cec3d4e6d3d5c3d488c5c9cb" rel="noreferrer noopener nofollow">[email protected]</a>','password':'anotherpassword2'})
> .../account/views.py(10)sign_in()
-> if request.method=='POST':
...
-> if len(results) == 1:
(Pdb) n
> .../account/views.py(15)sign_in()
-> if results[0].check_password(form.cleaned_data['password']):
(Pdb) n
> .../account/views.py(16)sign_in()
-> request.session['user'] = results[0].pk
(Pdb) n
> .../account/views.py(17)sign_in()
-> request.user=results[0]
(Pdb) n
> .../account/views.py(18)sign_in()
-> return HttpResponseRedirect('/')
(Pdb) request.session.user
*** AttributeError: 'SessionStore' object has no attribute 'user'
(Pdb) request.session['user']
9
(Pdb) user
(Pdb)
我还注意到 session 有一些信息,这就是我解码信息时得到的信息。
>>> from django.contrib.sessions.models import Session
>>> sess = Session.objects.get(pk='XXXX')
>>> print(sess.session_data)
.....
>>> print(sess.get_decoded())
{u'_auth_user_hash': u'XXXXX', u'_auth_user_backend': u'django.contrib.auth.backends.ModelBackend', u'_auth_user_id': 1, u'user': 9}
>>> from django_project import settings
>>> settings.AUTH_USER_MODEL
'account.User'
最佳答案
request.session
通常没有user
对象 - 通过运行 p request.session.keys()
进行双重检查在Pdb
。
根据您呈现模板的方式*,您可以通过 {% request.user %}
访问用户。
{% user %}
不会工作,除非你特别通过 user
到模板。
* https://docs.djangoproject.com/en/dev/topics/http/shortcuts/#render
示例:
View 中:
from django.shortcuts import render
def foo(request):
#...stuff
return render(request, 'index.html', {})
在模板中
{% request.user %}
或
View 中:
def foo(request):
#...stuff
user = request.user
return render(request, 'index.html', {'user':user})
在模板中
{% user %}
编辑
如果您想检查用户是否已登录,您应该使用 {% if user.is_authenticated %}
在你的模板中。不是{% if user %}
关于python - 模板中的 django request.session.user,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27517874/