0

初心者の質問。

だから私はいくつかのCSS/JSファイルを追加するページのためにこのハンドラーを持っています。問題は、後続のリクエストの結果、値が何度も追加されることです。

例:

def action_index(self):
    self.template = 'index.html'

    extra_styles = ['/media/css/jquery.lightbox-0.5.css']
    extra_scripts = ['/media/js/jquery.lightbox-0.5.min.js', '/media/js/project.js']

    for style in extra_styles:
        self.styles.append(style)

    for script in extra_scripts:
        self.scripts.append(script)

オブジェクトが現在のリクエスト内にのみ存在するPHPのバックグラウンドから来ているので、通常、GoogleAppEngineのようなプラットフォームでこれをどのように処理しますか。

ありがとう

要求に応じて、基本クラスは次のとおりです。

ベースコントローラー

from google.appengine.ext.webapp import template 

import os
import config
import datetime

class BaseController(object):

    request = None
    response = None
    action = 'index'
    method = 'get'
    params = []
    template_values = {}
    template_dir = None
    template = None

    default_styles = ['/media/bootstrap/css/bootstrap.min.css', '/media/css/style.css']
    default_scripts = ['/media/js/jquery-1.6.4.min.js']

    styles = []
    scripts = []

    def __init__(self, request, response, *args, **kwargs):
        self.request = request
        self.response = response

        self.action = 'index'
        if 'action' in kwargs and kwargs['action']:
            self.action = kwargs['action']

        self.method = 'get'
        if 'method' in kwargs and kwargs['method']:
            self.method = kwargs['method']

        self.params = []
        if 'params' in kwargs and kwargs['params']:
            if isinstance(kwargs['params'], list):
                self.params = kwargs['params']

        # Initialize template related variables
        self.template_values = {}
        self.styles = list(self.default_styles)
        self.scripts = list(self.default_scripts)

    def pre_dispatch(self):
        pass

    def post_dispatch(self):
        if self.template is not None and self.template_dir is not None:
            # Populate current year
            dt = datetime.date.today()
            self.template_values['current_year'] = dt.year

            # Populate styles and scripts
            self.template_values['styles'] = self.styles
            self.template_values['scripts'] = self.scripts

            path = os.path.join(config.template_dir, self.template_dir, self.template)
            self.response.out.write(template.render(path, self.template_values))

    def run_action(self):
        action_name = 'action_' + self.action
        if hasattr(self, action_name):
            action = getattr(self, action_name)
            action()
        else:
            raise Http404Exception('Controller action not found')

    def dispatch(self):
        self.pre_dispatch()
        self.run_action()
        self.post_dispatch()

class HttpException(Exception):
    """Http Exception"""
    pass

class Http404Exception(HttpException):
    """Http 404 exception"""
    pass

class Http500Exception(HttpException):
    """Http 500 exception"""
    pass

そして子クラス

import datetime

from dclab.lysender.controller import BaseController

class ProjectsController(BaseController):

    template_dir = 'projects'

    def action_index(self):
        self.template = 'index.html'
        self.styles.extend(['/media/css/jquery.lightbox-0.5.css'])
        self.scripts.extend([
            '/media/js/jquery.lightbox-0.5.min.js',
            '/media/js/project.js'
        ])

私のせいは、リストのクローンを作成するのではなく、参照を介してリストを別のリストに割り当てていることでした。私はこの振る舞いにあまり気づいていないので、一晩中頭をかいてしまいました。

4

1 に答える 1

2

クラス定義のすぐ下でたくさんの変数を宣言しています。これを行うと、期待どおりにインスタンスメンバーが定義されるのではなく、クラス変数が定義されます。これは、Javaなどの言語の「静的」に相当します。

物事をクラス変数として宣言する代わりに、コンストラクター(__init__クラスのメソッド)内で値を初期化します。

また、独自のフレームワークを発明するのではなく、webapp2のような既存のWebフレームワークを使用することを強くお勧めします。

于 2012-09-02T21:17:14.167 に答える