Пользовательское промежуточное ПО Django портит промежуточное ПО сессии

Я пытаюсь диагностировать ошибку в моем собственном промежуточном программном обеспечении, так или иначе, сбивает мое промежуточное программное обеспечение сеанса. Пользовательское промежуточное ПО - это простое приложение, которое удаляет старые файлы в некоторых папках.

class DeleteMediaMiddleware(object):
    time_limit = 100.

    def check_folder(self,folder):
    '''Deletes the files older than "time_limit" '''
        os.chdir(folder)
        files_in_folder = os.listdir(os.curdir)
        for my_file in files_in_folder:
            creation_time = os.path.getmtime(my_file)
            file_lifetime = time.time() - creation_time
            if file_lifetime > self.time_limit:
                os.remove(my_file)

    def process_request(self, request):
    '''Standard middleware method which runs on every request'''
        self.check_folder(config.input_folder)
        self.check_folder(config.output_folder)
        self.check_folder(config.plot_folder)
        self.check_folder(config.report_folder)
    return None

Он находится в папке проекта Django. (Уровни - это то, как Django создает по умолчанию. В моем случае проект называется expofit, а структура папок - expofit / expofit)

project_folder_lvl1/project_folder_lvl2/mymiddleware.py

Я добавил промежуточное ПО в настройки Djagno:

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'server.mymiddleware.DeleteMediaMiddleware',
    )

Тем не менее, я в конечном итоге с ошибкой.

Exception Value:    no such table: django_session

это от проверки значения сеанса в views.py:

....    
if request.session.has_key('user_id'):
....

Как только я отключаю свое промежуточное ПО в настройках Django, все работает нормально.

ОБНОВИТЬ:

Я успешно открываю базу данных, которая представляет собой файл sqlite, расположенный в project_folder_lvl1, и нахожу таблицу, которая недоступна.

Вот полный трекбек Django.

Environment:

Request Method: GET
Request URL: http://localhost:8000/expofit/

Django Version: 1.4.1
Python Version: 2.7.3
Installed Applications:
('django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'expofit_django_app',
'south',
'django.contrib.admin')
Installed Middleware:
('django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'server.mymiddleware.DeleteMediaMiddleware')


Traceback:
File "/home/alan/Desktop/expofit/expofit_env/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
111.                         response = callback(request, *callback_args, **callback_kwargs)
File "/home/alan/Desktop/expofit/expofit_env/local/lib/python2.7/site-packages/django/views/decorators/csrf.py" in wrapped_view
77.         return view_func(*args, **kwargs)
File "/home/alan/Desktop/expofit/expofit_hg/py/server/expofit_django_app/views.py" in check
59.         return view(request, *args, **kwargs)
File "/home/alan/Desktop/expofit/expofit_hg/py/server/expofit_django_app/views.py" in start
23.     if request.session.has_key('user_id'):
File "/home/alan/Desktop/expofit/expofit_env/local/lib/python2.7/site-packages/django/contrib/sessions/backends/base.py" in has_key
103.         return key in self._session
File "/home/alan/Desktop/expofit/expofit_env/local/lib/python2.7/site-packages/django/contrib/sessions/backends/base.py" in _get_session
165.                 self._session_cache = self.load()
File "/home/alan/Desktop/expofit/expofit_env/local/lib/python2.7/site-packages/django/contrib/sessions/backends/db.py" in load
19.                 expire_date__gt=timezone.now()
File "/home/alan/Desktop/expofit/expofit_env/local/lib/python2.7/site-packages/django/db/models/manager.py" in get
131.         return self.get_query_set().get(*args, **kwargs)
File "/home/alan/Desktop/expofit/expofit_env/local/lib/python2.7/site-packages/django/db/models/query.py" in get
361.         num = len(clone)
File "/home/alan/Desktop/expofit/expofit_env/local/lib/python2.7/site-packages/django/db/models/query.py" in __len__
85.                 self._result_cache = list(self.iterator())
File "/home/alan/Desktop/expofit/expofit_env/local/lib/python2.7/site-packages/django/db/models/query.py" in iterator
291.         for row in compiler.results_iter():
File "/home/alan/Desktop/expofit/expofit_env/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py" in results_iter
763.         for rows in self.execute_sql(MULTI):
File "/home/alan/Desktop/expofit/expofit_env/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py" in execute_sql
818.         cursor.execute(sql, params)
File "/home/alan/Desktop/expofit/expofit_env/local/lib/python2.7/site-packages/django/db/backends/util.py" in execute
40.             return self.cursor.execute(sql, params)
File "/home/alan/Desktop/expofit/expofit_env/local/lib/python2.7/site-packages/django/db/backends/sqlite3/base.py" in execute
337.             return Database.Cursor.execute(self, query, params)

Exception Type: DatabaseError at /expofit/
Exception Value: no such table: django_session

Ищете идеи о том, как отладить эту проблему?

1 ответ

Решение

Проблема была решена путем добавления абсолютного пути к базе данных sqlite.

settings.py, который привел к ошибке:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': 'expofit_database',  
        ...
        ...      

новые settings.py:

PROJECT_PATH = os.path.realpath(os.path.dirname(__file__))
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join( PROJECT_PATH, 'expofit_database'),  
        ...
        ...      

Из того, что я понял, проблема заключалась в вызове

os.chdir(folder)

внутри функции check_folder, которая испортила пути выполнения. Хотя установка абсолютного пути решила проблему доступа к базе данных, я удалил os.chdir(папку), чтобы предотвратить возможные ошибки в будущем.

def check_folder(folder):
    time_limit = 100.
    files_in_folder = os.listdir(folder)
    for file_name in files_in_folder:
        file_path = os.path.join(folder,file_name)
        creation_time = os.path.getmtime(file_path)
        file_lifetime = time.time() - creation_time
        if file_lifetime > time_limit:
            os.remove(file_path)
Другие вопросы по тегам