python - Google App Engine,定义一个预处理类

标签 python google-app-engine web-applications django-templates preprocessor


我正在尝试定义一个 base request handling 类,以便 webapp 页面可以继承一些基本方法和变量,否则需要为应用程序的每个页面重复定义这些方法和变量。一种类似于 django 预处理器 的类似功能。这是其他页面继承的我的基类:

class BasePage(webapp.RequestHandler):
    def __init__(self):    
        self.user = users.get_current_user()    
        self.template_values = {
                'user': self.user,       
                'environ': self,   #I don't like the idea of passing the whole environ object to a template

                ##The below three functions cannot be executed during _init_ because of absence of self.request 
                #'openid_providers': self.openid_providers(),  
                #'logout_url': self.get_logout_url(),
                #'request': self.get_request(),
            }           

    ##A sort of similar functionality like render_to_response in django
    def render_template(self, template_name, values = None, *args, **kwargs):
        #PATH is the directory containing the templates
        if values: 
            for value in values:  self.template_values[value] = values[value]
        self.response.out.write(template.render(PATH+template_name, self.template_values, *args, **kwargs))                 

    ##Returns request as the name suggests
    def logout_url(self):
        return users.create_logout_url(self.request.url)

    ##Returns request as the name suggests
    def request(self):
        return request

    ##Returns openid login urls        
    def openid_providers(self):
        #OPENID_POVIDERS  is a list of dictionary 
        for p in OPENID_PROVIDERS:
             p['login_url'] = users.create_login_url(self.request.get('next', '/') , p['name'], p['url'])
        return OPENID_PROVIDERS  

一切正常,除了我无法在初始化期间传递一些变量,因为 self.request 不可用。因此,对于解决方法,我所做的是将整个 self 变量作为模板变量传递。

是否有其他方法可以向模板提供模板变量(请求、注销网址等)?

最佳答案

一个比 bgporter 更简单的解决方案是在 webapp.RequestHandlerinitialize 方法中进行通用设置。这是工作中的一个例子,我们想在请求对象中添加一个类似 Django 的 is_ajax 方法:

class BaseHandler(webapp.RequestHandler):
    def initialize(self, request, response):
        super(BaseHandler, self).initialize(request, response)
        # Add a Django-like is_ajax() method to the request object
        request.is_ajax = lambda: \
            request.environ.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest'

在调用适当的 getpost(或其他)方法之前,调用此方法是为了使用当前请求和响应对象初始化每个请求处理程序.

关于python - Google App Engine,定义一个预处理类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4488015/

相关文章:

java - 丰富的 :autocomplete ‘label’ and ‘value’ of suggestion list?

java - 使用 Maven 时为 "Plugin not found for prefix app engine"

java - 更新 GAE 应用程序时出错 - 缺少 appengine-web.xml

google-app-engine - 限制特定 Google 网上论坛成员的访问权限

java - 我应该为我的网络应用程序的后端选择 Java 还是 Javascript?

python - django--LayerMapError : Could not retrieve geometry from feature

python - 如何检查复选按钮是否被选中?

python - 无法解释的 Django 错误。诊断任何人?

python - 给定最小/最大的多个两列集,如果数字落在最小/最大之间,如何返回索引

python - 有没有办法从 jupyter 笔记本制作网络应用程序?