AppEngine Python - 如何处理缓存的对象值

时间:2012-09-02 04:43:33

标签: google-app-engine python-2.7

新手问题。

所以我有一个附加一些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)

你通常如何在Google AppEngine平台上处理这个问题,因为我来自PHP背景,其中对象只存在于当前请求中。

由于

根据要求,这是基类:

基本控制器

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'
        ])

我的错是我通过引用将列表分配给另一个列表,而不是克隆列表。我不太了解这种行为,这就是为什么它让我彻夜不安。

1 个答案:

答案 0 :(得分:2)

你直接在类定义下声明了很多变量。这样做并不像你期望的那样定义实例成员,而是定义类变量 - 相当于像Java这样的语言中的'static'。

不是将事物声明为类变量,而是在构造函数中初始化您的值 - 类的__init__方法。

我也强烈建议使用像webapp2这样的现有网络框架,而不是发明自己的。