0

カスタムミドルウェアのエラーを診断しようとしていますが、どういうわけかセッションミドルウェアがダウンします。カスタム ミドルウェアは、一部のフォルダー内の古いファイルを削除するシンプルなアプリです。

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 設定でミドルウェアを無効にするとすぐに、すべて正常に動作します。

アップデート:

project_folder_lvl1 にある sqlite ファイルであるデータベースを正常に開き、アクセスできないテーブルを見つけます。

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

この問題をデバッグする方法についてのアイデアをお探しですか?

4

1 に答える 1

0

この問題は、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)
于 2012-12-21T15:24:07.347 に答える