如何在Django中设置和获取会话?

73
我需要在用户登录时设置一个会话变量。我该如何做到这一点?
if request.user.is_authenticated():
    profile = request.user.get_profile()
    request.session['idempresa'] = profile.idempresa

我的另一个问题是以表格形式呈现的:
class PedidoItensForm(ModelForm):
    class Meta:
        model = ItensPedido

    def __init__(self, *args, **kwargs):
        profile = kwargs.pop('vUserProfile', None)
        super(PedidoItensForm, self).__init__(*args, **kwargs)

如何获取会话中的"idempresa"值,以便在我的查询集中使用?

编辑:这一行代码:profile = kwargs.pop('vUserProfile', None) 不起作用... 当我使用inlineformset_factory时,我不知道如何传递vUserProfile,如果我知道如何使用inlineformset_factory传递vUserProfile,这个问题就解决了! - fh_bash
1
1: 构建自己的中间件。或者将其放置在身份验证发生的任何地方。https://docs.djangoproject.com/en/dev/topics/http/middleware/2: 在新问题中提出新问题。 - Yuji 'Tomita' Tomita
3个回答

101

设置会话变量:

request.session['idempresa'] = profile.idempresa

获取会话数据:

if 'idempresa' in request.session:
    idempresa = request.session['idempresa']

4
Django 会话(sessions)没有 save() 方法。当会话发生更改时,它们会自动保存,或者您可以通过将 request.session.modified 设置为 True 来强制保存。 - voodoo-burger
您可以在模板中像这样使用会话 {{ request.session.idempresa }} - Kaz Miller

65

2
你可以在Django视图中使用request.session['key']来设置和获取会话,并使用request.session.get('key')来获取会话,如下所示。*如果键不存在,request.session.get()默认返回None,你可以将None更改为其他值,例如Doesn't exist,通过将其设置为第二个参数,如下所示。你可以查看When sessions are saved以及解释会话何时何地保存的我的问题我的答案
# "views.py"

from django.shortcuts import render

def test(request):
    request.session['person'] = {'name':'John','age':27}
    print(request.session['person']) # {'name':'John','age':27}
    print(request.session['person']['name']) # John
    print(request.session['person']['age']) # 27
    print(request.session.get('person')) # {'name':'John','age':27}
    print(request.session.get('person')['name']) # John
    print(request.session.get('person')['age']) # 27
    print(request.session.get('animal')) # None
    print(request.session.get('animal', "Doesn't exist")) # Doesn't exist
    return render(request, 'index.html', {})

在Django模板中,你可以通过request.session.key来获取会话。
# "templates/index.html"

{{ request.session.person }}      {# {'name':'John','age':27} #}
{{ request.session.person.name }} {# John #}
{{ request.session.person.age }}  {# 27 #}

而且,您可以使用以下代码删除会话。*request.session.pop('key') 可以获取并删除会话,如果键不存在且第二个参数未设置,则会出现错误;如果键不存在且第二个参数已设置,则返回第二个参数,并且 request.session.clear()request.session.flush() 可以删除所有当前会话,您可以查看 我的问题答案 来解释 request.session.clear()request.session.flush() 之间的区别:
# "views.py"

from django.shortcuts import render

def test(request):
    del request.session['person']
    del request.session['person']['name']
    del request.session['person']['age']
    print(request.session.pop('person')) # {'name':'John','age':27}
    print(request.session.pop('animal') # Error
    print(request.session.pop('animal', "Doesn't exist")) # Doesn't exist
    request.session.clear()
    request.session.flush()
    return render(request, 'index.html', {})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接