python - 模板中的 django request.session.user

标签 python django session

我正在尝试使用自定义用户模型,并且在登录时,我想将用户重定向到带有 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 %}

https://docs.djangoproject.com/en/1.7/ref/contrib/auth/#django.contrib.auth.models.User.is_authenticated

关于python - 模板中的 django request.session.user,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27517874/

相关文章:

python - 如何通过python google drive api创建一个新文件夹以及MediaFileUpload的用途是什么?

python - 列表中列表的随机播放功能

python - 带有 CKEditor 的 Django 2.0.1 在管理页面上不起作用

python - 使用 Django + HTML 表单上传文件

django - 如何在 Django 中创建 "empty" session ?

跟踪缓存变量/函数依赖关系的 Pythonic 方法

python - 如何在django中检索特定模型的所有权限?

php - 将 $_SESSION[] 数据制作成 php 变量,但它仍然无法在 mysql 查询中工作

php - 对于某些具有 session 变量的用户,插入查询有时不起作用

java - 小端到整数(或 BigInteger)