3

django アプリケーションを最適化したいので、django_debug_toolbar を使用して、HTML ページを計算するためにどのような SQL リクエストが実行されるかを確認します。開いているファイルに対して同じことをしたい: django_debug_toolbar プラグインはありますか、または HTML ページ要求中に開いたファイルを追跡するための django ミドルウェアを開発する方法はありますか?

4

1 に答える 1

0

最後に、自分で django ミドルウェアを書きました:

import __builtin__
def newFileClassFactory(oldfile,openfiles):
    class newfile(oldfile):
        def __init__(self, *args):
            self.thepath = args[0]
            print "### OPENING %s ###" % str(self.thepath)
            try:
                oldfile.__init__(self, *args)
            except Exception,e:
                print e
                raise
            openfiles.add(self.thepath)

        def close(self):
            print "### CLOSING %s ###" % str(self.thepath)
            oldfile.close(self)
            openfiles.remove(self.thepath)
    return newfile

class OpenedFiles(object):
    def __init__(self):
        self.oldfile = __builtin__.file
        self.openfiles = set()
        self.newfile = newFileClassFactory(self.oldfile,self.openfiles) 
        self.oldopen = __builtin__.open
        def newopen(*args):
            return self.newfile(*args)
        self.newopen = newopen

    def process_response(self, request, response):        
        if request.path.split('.')[-1].lower() not in ('ico','jpg','jpeg','gif','png','js','css'):
            if self.openfiles:
                print 'Not closed files :'
                print '----------------'
                print '/n'.join(self.openfiles)
            print '*' * 60,' End of Request (%s)' % request.path            
            __builtin__.file = self.oldfile
            __builtin__.open = self.oldopen
        return response

    def process_request(self, request):
        if request.path.split('.')[-1].lower() not in ('ico','jpg','jpeg','gif','png','js','css'):
            __builtin__.file = self.newfile
            __builtin__.open = self.newopen
            print '*' * 60,' Beginning of Request (%s)' % request.path
        return None

MIDDLEWARE_CLASSES の settings.py に 'your.module.path.OpenedFiles' を追加するだけです (django がそのミドルウェアで何をするかをキャプチャする場合は最初の行で)。django ビルトインの実行中に、開いているすべてのファイルがコンソールに出力されます。 server (python manage.py runserver) 発生したエラーと閉じられていないファイルも出力します。

多くのローカル ファイルが django またはアプリケーションによって開かれ、動的ページ (テンプレート、セッション ファイル、キャッシュされた情報、オンザフライ サムネイルを生成するための画像など) が生成されるのを見るのは面白いことです。

于 2012-08-27T16:53:02.517 に答える