::-- ZoomQuiet [2005-12-11 04:45:50]

1. K4日:KS

不爽直!使用新的KS 页面组织
现在想来,你实现了三个小功能就用了7,8个文件……有些想念 CherryPy 的对象式网站发布了!

1.1. lovely session

学习一下子文档吧!

  • http://localhost/demo/ksTest.ks/index

  •    1 so = Session()
       2 if not hasattr(so, 'x'):
       3     so.x = 0
       4 def index():
       5     print "x = %s" %so.x
       6     print '<br><a href="increment">Increment</a>'
       7     print '<br><a href="decrement">Decrement</a>'
       8     print '<br><a href="reset">Reset</a>'
       9 
      10 def increment():
      11     so.x = _private(so.x)
      12     raise HTTP_REDIRECTION,"index"
      13 def decrement():
      14     so.x -= 1
      15     raise HTTP_REDIRECTION,"index"
      16 def reset():
      17     so.x = 0
      18     raise HTTP_REDIRECTION,"index"
      19 def _private(x):
      20     """The function name begins with _ : internal function, 
      21     can't be call by a url"""
      22     return x+1
    

    不是吧!! 一个页面就作完了四种动作!完全是CherryPy 味的!!

    • Session 完全是对象了,标准的KarriGell 内置对象!

    • 又不是CherryPy 那样严格的对象属性,是文件级别的全局性变量,容易引用!

      • 但是,还是要在优雅的Python 脚本中掺杂HTML 代码,不爽直!

1.2. HTMLTags

函式化的HTML生成

  • http://localhost/doc/en/htmltags.htm

  • 唉呀呀!!还真的是心想事儿成!2.2 增加的新功能哪!
       1 stylesheet = LINK(rel="Stylesheet",href="doc.css")
       2 header = TITLE('Record collection')+stylesheet
       3 title = H1('My record collection')
       4 rows = Sum ([TR(TD(rec.title,Class="title")
       5                 +TD(rec.artist,Class="Artist"))
       6     for rec in records])
       7 table = TABLE(TR(TH('Title')+TH('Artist')) + rows)
       8 print HTML(HEAD(header) + BODY(title + table))
    
    可以将一个标准的HTML页面由几行 Py脚本自然生成!
  • 那未,只要结合 KS 和 HTMLTags 功能就可以快速实现想要的复杂展示功能了!还可以方便的复用!
  • 当然的使用Leo 八股化你所有的.KS

  1. << page declarations >> 同样是引用声明什么的

  2. << htmlcode >> 就是利用Leo来快速复用的各种 HTML 代码

  3. <<ini>> 初始化部分,就是各响应页面都要使用的变量准备

  4. @others 包含以下各种 def action(): 样定义的实际响应页面和def _function(): 可以反复调用的不作为页面响应的普通函式声明

1.3. 登录

从默许的index 自动导向 login 那

  •    1 def index():
       2     << pagehead >>
       3 
       4     if sess.usr["name"]=="NULL":
       5         raise HTTP_REDIRECTION,"login"
       6     else:
       7         pass
    

    照猫画虎, 使用raise HTTP_REDIRECTION,"login" 来根据是否有登录过来导向登响应

  • 当然的,要在 .KS 的 ini 初始化部分先声明会话容器:
    •    1 # 使用 Session来记忆成员信息
         2 sess = Session()
         3 if not hasattr(sess, 'usr'):
         4     sess.usr = {"name":"NULL"}
      

      在没有进行登录前,准备一个值为NULLusr 用户会话对象

  • 好了,实际的登录表单还是 KQF来干:

   1 p = Karrigell_QuickForm('fm_login'
   2                         ,'POST'
   3                         ,'chkusr'
   4                         ,"登录自学问卷")
   5 p.addHtmNode('text','uname'
   6              ,"staff帐号"
   7              ,{'size':40,'maxlength':8})
   8 p.addGroup(["submit","btn_submit","提交","btn"]
   9            ,["reset","btn_reset","重写","btn"])
  10 p.addRule('uname','required'
  11           ,"成员名是必须的!Login name is required!")
  12 p.display()

  • 非常简洁,标准
    • 进行有效性判别的处理也是个标准的KS 函式

         1 def chkusr(**args):
         2     """检查用户登录情况
         3     """
         4     print QUERY
         5     sess.usr["name"] = QUERY["uname"]
         6     if sess.usr["name"] in pmguys:
         7         # pmguys 是个元组,预定义的有管理整理的成员帐号
         8         sess.usr["pm"] = 1
         9     print sess.usr
        10     #raise HTTP_REDIRECTION,"index"
      
      先别让页面自动跳走,看一看,是否随愿的将登录信息记录了?!

    • 问卷的使用原则是,任何人都可以登录,问答,但是:
      1. 只有有效的成员问答才会统计
      2. 只有个别的成员才有管理/编辑问卷的权限

    1.4. 多问卷选择

    有了登录后的用户信息,就可以根据不同的角色进行处理了

    1.4.1. fnmatch

    • 指定目录中某模式的所有文件的尋找…………
    • 有内置的处理模块哪!fnmatch

    • 配合统一设置进行搜索

         1 qcfglist = []
         2 for f in os.listdir(conf.qpage.qpath):
         3     if fnmatch.fnmatch(f, '*.cfg'):
         4         if ("__init__" in f):
         5             pass
         6         else:
         7             qcfglist.append(f)
         8 print qcfglist
      

      就可以找出目录中所有以.cfg结尾的文件!

      • conf 对象是新发布模式下的统一设置信息对象
        • 因为,担心可能需要多个.KS 文件来组织网站,不想象原先那样滥用Leo来复用信息了

        • 所以,建立@nosent questionnaire.cfg 统一配置文件

        • 这样,conf = DictIni("questionnaire.cfg") 一下子,就可以在所有.KS 页面中获取统一的站点设置了

    1.4.2. 列表所有问卷

    根据问卷的状态进行归类列表

       1 # 识别问卷发布情况::
       2 qdone = {}
       3 qdoing = {}
       4 qdesign = {}
       5 for p in qcfglist:
       6     cfgp = DictIni(conf.qpage.qpath+p)
       7     if 0==cfgp.desc.done:
       8        qdesign[p]=cfgp
       9     elif 1==cfgp.desc.done:
      10        qdoing[p]=cfgp
      11     elif 2==cfgp.desc.done:
      12        qdone[p]=cfgp
      13     else:
      14         qdesign[p]=cfgp
    

  • 使用不同的字典容器先过滤一下子搜索出来的文件;
    • 然后使用类似的输出就好:

       1 print H4("问卷进行中::")
       2 print UL("".join([str(LI(
       3              B(A(qdoing[i].desc.pname
       4                  ,href="page?qpname=%s&do=doing"%i.split(".")[-2])
       5                  )+
       6                  SUP(qdoing[i].desc.learn)+
       7                  SUB(A("问答统计",href="stat?qp=%s"%i))
       8                          )
       9                         ) for i in qdoing.keys()
      10                     ])
      11                     )
    

    1.5. 小节

    • 实际上,本日,你使用 .ks 体验了一把函式化的页面发布,成果就一个脚本index.ks

      • 但是以前完成的.pih 依然好用,而你将趁兴将它们都重构为更加爽快的函式化页面发布

    • 而且,你忍不住对CSS进行了深入的定制,在输出代码的最简和页面表现丰富之间进行了有效的探索

    1.5.1. 明日任务

    心情舒畅!快速的完成了更加简练的功能页面!

    • 但是,如何将编辑,回答,统计融合起来?
      1. 点击进入不同问卷,可以回答/或是编辑
      2. 点击编辑就直接编辑
      3. 提交就成为新版本问卷
      4. 问卷要有版本管理
      5. 提交后,可以立即回到问答或是问卷集首页
      6. 任何页面都有安全退出的链接
      7. .... 呜乎哀哉,好象越作越多了,任务…………

    1.6. 实例下载

    使用 SVN 下载:

    1.7. 讨论


    返回 KarrigellWebDev -- 快速体验K开发