【问题标题】:django session object inconsistent behaviordjango会话对象不一致的行为
【发布时间】:2014-07-11 00:39:25
【问题描述】:

我有自定义中间件,我在其中设置用户详细信息,例如用户名,如下所示。但是每次用户请求新的 url 时,会话上下文都会丢失,我最终再次设置详细信息我在这里做错了什么

settings.py

MIDDLEWARE_CLASSES = (
  ....
  ....
  'custom.api.get_username'
)

INSTALLED_APPS = (
  ....   
  'custom',

)

自定义/api.py

class get_username(object):
    def process_request(self, request):
       print dir(request.session)
       if request.user.is_authenticated():
           if not in hasattr(request.session,'username'):
              user = api.get_user.(request.user.id).get("result")
              username = user.get('first_name')
              request.session["username"] = u.username
              request.session.save()
              print dir(request.session)

这是下面的两个目录打印语句

['TEST_COOKIE_NAME', 'TEST_COOKIE_VALUE', '__class__', '__contains__', '__delattr__', '__delitem__', '__dict__', '__doc__', '__format__', '__getattribute__', '__getitem__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_get_new_session_key', '_get_or_create_session_key', '_get_session', '_get_session_key', '_hash', '_session', '_session_cache', '_session_key', 'accessed', 'clear', 'clear_expired', 'create', 'cycle_key', 'decode', 'delete', 'delete_test_cookie', 'encode', 'exists', 'flush', 'get', 'get_expire_at_browser_close', 'get_expiry_age', 'get_expiry_date', 'has_key', 'items', 'iteritems', 'iterkeys', 'itervalues', 'keys', 'load', 'modified', 'pop', 'save', 'serializer', 'session_key', 'set_expiry', 'set_test_cookie', 'setdefault', 'test_cookie_worked', 'update', 'values']

['TEST_COOKIE_NAME', 'TEST_COOKIE_VALUE', '__class__', '__contains__', '__delattr__', '__delitem__', '__dict__', '__doc__', '__format__', '__getattribute__', '__getitem__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_get_new_session_key', '_get_or_create_session_key', '_get_session', '_get_session_key', '_hash', '_session', '_session_cache', '_session_key', 'accessed', 'clear', 'clear_expired', 'create', 'cycle_key', 'decode', 'delete', 'delete_test_cookie', 'username', 'encode', 'exists', 'flush', 'get', 'get_expire_at_browser_close', 'get_expiry_age', 'get_expiry_date', 'has_key', 'items', 'iteritems', 'iterkeys', 'itervalues', 'keys', 'load', 'modified', 'pop', 'save', 'serializer', 'session_key', 'set_expiry', 'set_test_cookie', 'setdefault', 'test_cookie_worked', 'update', 'values']

编辑:

名字不可用,必须进行 api 调用才能获得名字,这就是我选择这种使用会话变量的途径的原因。如果我错了,请纠正我

【问题讨论】:

    标签: django django-views django-middleware django-sessions


    【解决方案1】:

    将数据设置到会话中的正确语法是:

    request.session['username'] = u.username
    

    阅读django docs for samples

    def login(request):
        m = Member.objects.get(username=request.POST['username'])
        if m.password == request.POST['password']:
            request.session['member_id'] = m.id
            return HttpResponse("You're logged in.")
        else:
            return HttpResponse("Your username and password didn't match.")
    

    还要检查'django.contrib.sessions.middleware.SessionMiddleware' 是否包含在您的MIDDLEWARE_CLASSES 中。

    【讨论】:

    • 因为 request.session 是一个请求对象,做 request.session.username 有什么问题?
    【解决方案2】:

    你做错了很多事情。首先,会话实现了字典接口,而不是属性一。所以你应该这样做:

    if 'username' not in request.session:
        request.session['username'] = u.username
    

    其次,请求没有id 属性,因此您的查找将失败并出现AttributeError。也许你的意思是request.user.id

    但是在解决了这个问题之后,您应该问问自己为什么要这样做。用户名始终可通过request.user.username 获得。那么为什么还要在会话中额外存储呢?

    【讨论】:

    • 嗨丹尼尔:是的,你是对的,它是 request.user.id。我已经编辑了我的问题以及为什么要这样做。所以这就是我使用会话变量的原因
    • 另一个问题是我实现了一个中间件来实现一个通用功能是正确的还是我应该为此采取其他途径
    猜你喜欢
    • 2014-09-16
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    • 2013-12-09
    • 2012-06-01
    相关资源
    最近更新 更多