2014-03-04 41 views
1

最終用戶以某種方式結束了sessionID cookie的空白(如在「sessionid =;」中)。空的sessionid cookie導致request.user中的錯誤

File "/src/django/utils/functional.py", line 204, in inner 
    self._setup() 
    File "/src/django/utils/functional.py", line 270, in _setup 
    self._wrapped = self._setupfunc() 
    File "/src/django/contrib/auth/middleware.py", line 18, in <lambda> 
    request.user = SimpleLazyObject(lambda: get_user(request)) 
    File "/src/django/contrib/auth/middleware.py", line 10, in get_user 
    request._cached_user = auth.get_user(request) 
    File "/src/django/contrib/auth/__init__.py", line 136, in get_user 
    user_id = request.session[SESSION_KEY] 
    File "/src/django/contrib/sessions/backends/base.py", line 44, in __getitem__ 
    return self._session[key] 
    File "/src/django/contrib/sessions/backends/base.py", line 167, in _get_session 
    self._session_cache = self.load() 
    File "/src/django/contrib/sessions/backends/cached_db.py", line 39, in load 
    expire_date__gt=timezone.now() 
    File "/src/django/db/models/manager.py", line 143, in get 
    return self.get_query_set().get(*args, **kwargs) 
    File "/src/django/db/models/query.py", line 398, in get 
    num = len(clone) 
    File "/src/django/db/models/query.py", line 106, in __len__ 
    self._result_cache = list(self.iterator()) 
    File "/src/django/db/models/query.py", line 317, in iterator 
    for row in compiler.results_iter(): 
    File "/src/djangotoolbox/db/basecompiler.py", line 375, in results_iter 
    results = self.build_query(fields).fetch(
    File "/src/djangotoolbox/db/basecompiler.py", line 481, in build_query 
    query.add_filters(self.query.where) 
    File "/src/djangotoolbox/db/basecompiler.py", line 174, in add_filters 
    self.add_filters(child) 
    File "/src/djangotoolbox/db/basecompiler.py", line 176, in add_filters 
    field, lookup_type, value = self._decode_child(child) 
    File "/src/djangotoolbox/db/basecompiler.py", line 216, in _decode_child 
    lookup_type, value, field, annotation) 
    File "/src/djangotoolbox/db/basecompiler.py", line 254, in _normalize_lookup_value 
    return self.ops.value_for_db(value, field, lookup_type) 
    File "/src/djangoappengine/db/base.py", line 128, in value_for_db 
    return super_value_for_db(value, field, lookup) 
    File "/src/djangotoolbox/db/base.py", line 245, in value_for_db 
    field_kind, db_type, lookup) 
    File "/src/djangoappengine/db/base.py", line 160, in _value_for_db 
    raise DatabaseError("Only strings and positive integers " 
DatabaseError: Only strings and positive integers may be used as keys on GAE. 

此錯誤的sessionid被設定爲無效的一些非空值不會發生(例如:結合使用時的Django與GAE這將導致以下錯誤調用堆棧(函數調用request.user下文)作爲「會話=垃圾」)。我認爲這是遵循行爲的對比在Python殼相關:

>>> Session.objects.filter(session_key='abc').exists() 
0 
>>> Session.objects.filter(session_key='').exists() 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "/src/django/db/models/query.py", line 610, in exists 
    return self.query.has_results(using=self.db) 
    File "/src/django/db/models/sql/query.py", line 445, in has_results 
    return compiler.has_results() 
    File "/src/dbindexer/compiler.py", line 32, in has_results 
    return super(SQLCompiler, self).has_results() 
    File "/src/djangotoolbox/db/basecompiler.py", line 384, in has_results 
    return self.get_count(check_exists=True) 
    File "/src/djangotoolbox/db/basecompiler.py", line 468, in get_count 
    return self.build_query().count(high_mark) 
    File "/src/djangotoolbox/db/basecompiler.py", line 481, in build_query 
    query.add_filters(self.query.where) 
    File "/src/djangotoolbox/db/basecompiler.py", line 174, in add_filters 
    self.add_filters(child) 
    File "/src/djangotoolbox/db/basecompiler.py", line 176, in add_filters 
    field, lookup_type, value = self._decode_child(child) 
    File "/src/djangotoolbox/db/basecompiler.py", line 216, in _decode_child 
    lookup_type, value, field, annotation) 
    File "/src/djangotoolbox/db/basecompiler.py", line 254, in _normalize_lookup_value 
    return self.ops.value_for_db(value, field, lookup_type) 
    File "/src/djangoappengine/db/base.py", line 128, in value_for_db 
    return super_value_for_db(value, field, lookup) 
    File "/src/djangotoolbox/db/base.py", line 245, in value_for_db 
    field_kind, db_type, lookup) 
    File "/src/djangoappengine/db/base.py", line 160, in _value_for_db 
    raise DatabaseError("Only strings and positive integers " 
DatabaseError: Only strings and positive integers may be used as keys on GAE. 

這是一個djangoappengine或djangotoolbox bug,或者Django的錯誤嗎?什麼是防止此錯誤的正確方法,並考慮用戶未經身份驗證?

回答

1

好吧,我想我可能要直接SessionMiddleware後添加一箇中間件類來處理這種特殊的情況,並把它:

class EmptySessionMiddleware(object): 
    def process_request(self, request): 

     session = request.session 

     if session.session_key is not None and len(session.session_key) == 0: 
      logging.info('[EmptySessionMiddleware] setting empty session key to None') 
      session._session_key = None 

這是一個奇怪的特例,但基本上問題是,Django的會話中間件僅在db(非空字符串)中查找之前僅檢查None會話,並且djangoappengine中的空字符串主鍵查詢引發異常。我不確定還有另一種方法來處理這種情況。