## page was renamed from CherrPyTut/08 sessions.py
##language:zh

{{{#!python
# -*- coding: utf-8 -*-
"""
Tutorial 08 - 对话

保存对话信息在 CP2 中非常的简单:
    cpg.request 提供了一个字典对象叫 sessionMap 记录了当前用户的会话数据.
如果你使用的是内存(RAM)式的会话,你可以保存任何类型的对象在此字典中;
否则,你将限制只能保持可以被线性化的对象.
"""
from cherrypy import cpg
#改造,增加 Aspect机制
from cherrypy.lib.aspect import Aspect, STOP, CONTINUE

class Page(Aspect):
    """要求从 Aspect 继承类
    """
    title = 'Untitled Page'

    def __init__(self):
        """增加全局性点击计数对象
        """
        self.count = 0
    def _count(self):
        """想简单的增加统一的计数函式,发现不行!
        """
        # 创建无聊的点击计数
        self.count = cpg.request.sessionMap.get('count', 0) + 1
        # 记录计数在会话对象中
        cpg.request.sessionMap['count'] = self.count

    def header(self):
        """强调页面编码
        """
        return '''
            <html>
            <head>
                <title>%s</title>
                <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
            <head>
            <body>
            <h2>%s</h2>
        ''' % (self.title, self.title)

    def footer(self):
        return '''
            </body>
            </html>
        '''

    def _before(self, methodName, method):
        """投影函式 _before 会在任何函式运行时被调用,如果你有一些函式不想如此处理
        可以在调用前检测一下
        """
        #self.count = cpg.request.sessionMap.get('count', 0) + 1
        if methodName not in ['header', 'footer']:
            return CONTINUE, self.header()
        else:
            return CONTINUE, ''

    def _after(self, methodName, method):
        """同上投影函式 _after 是在任何函式运行后自动调用
        """
        #cpg.request.sessionMap['count'] = self.count
        if methodName not in ['header', 'footer']:
            return CONTINUE, self.footer()
        else:
            return CONTINUE, ''

class HitCounter(Page):
    """点击计数页面对象
    """
    title = '点击计数 尝试页面!'
    def __init__(self):
        """直接增加下层对象
        """
        self.deep = DeepPage()
    def index(self):
        # 创建无聊的点击计数
        self.count = cpg.request.sessionMap.get('count', 0) + 1
        # 记录计数在会话对象中
        cpg.request.sessionMap['count'] = self.count        
        #self._count()
        
        # 在页面中显示计数信息
        return '''
            During your current session, you've viewed this
            page %s times! Your life is a patio of fun!

            <hr/>
            goto deep page count again!?
            <a href="deep">deep page</a>
        ''' % self.count

    index.exposed = True

class DeepPage(Page):
    """下层对象的展示
    """
    title = 'DeepPage base AnotherPage'
    def index(self):
        #self._count()
        
        # 创建无聊的点击计数
        self.count = cpg.request.sessionMap.get('count', 0) + 1
        # 记录计数在会话对象中
        cpg.request.sessionMap['count'] = self.count
        
        return '''
            <p>
            在下层对象中继续计数!
            </p>:%s
            <hr/>
            <a href="../">go back </a>
        '''% self.count

    index.exposed = True


cpg.root = HitCounter()

cpg.server.start(configFile = 'tutorial.conf')

}}}