2014-03-04 4 views
1

최종 사용자가 어떻게 든 "sessionid =;"에서와 같이 자신의 sessionid 쿠키 공백으로 끝납니다.빈 sessionid 쿠키로 인해 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를 일부 잘못된 비어 값으로 설정되는 경우 등 (일어나지 않는다 : GAE와 함께 장고을 사용할 때 (request.user에 함수 호출 아래) 다음 오류 호출 스택을 야기 "session = garbage;"). 나는 그것이 파이썬 쉘에서 행동의 대비를 따르도록 관련이 생각 :

>>> 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 버그, 또는 장고 버그인가? 이 오류를 방지하고 사용자가 인증되지 않았다고 생각하는 적절한 방법은 무엇입니까? 좋아

답변

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 

그것은 이상한 특별한 경우지만, 기본적으로 문제가 있다는 것입니다 장고 세션 미들웨어는 db (비어있는 문자열이 아님)를 찾기 전에 None 세션 만 검사하고 djangoappengine의 빈 문자열 기본 키 쿼리는 예외를 발생시킵니다. 이 사건을 처리 할 다른 방법이 있을지 모르겠습니다.

관련 문제