Differences between revisions 8 and 10 (spanning 2 versions)
Revision 8 as of 2005-12-24 10:49:55
Size: 7551
Editor: ZoomQuiet
Comment:
Revision 10 as of 2005-12-30 04:35:38
Size: 7701
Editor: ZoomQuiet
Comment:
Deletions are marked like this. Additions are marked like this.
Line 174: Line 174:
== 明日任务 == == 小节 ==
 * 实际上,本日,你使用 .ks 体验了一把函式化的页面发布,成果就一个脚本'''index.ks'''
  * 但是以前完成的`.pih` 依然好用,而你将趁兴将它们都重构为更加爽快的'''函式化页面发布'''
 * 而且,你忍不住对CSS进行了深入的定制,在输出代码的最简和页面表现丰富之间进行了有效的探索
 
 
 
 
=== 明日任务 ===
Line 184: Line 192:
 * 实际上,本日,你使用 .ks 体验了一把函式化的页面发布,成果就一个脚本'''index.ks'''
  * 但是以前完成的`.pih` 依然好用,而你将趁兴将它们都重构为更加爽快的'''函式化页面发布'''
Line 189: Line 195:
    [wiki:selfsvn/zqlib/trunk/zqlib/tangle/zoomq/Karrigell/obpKWD/KwDay4/ KwDay4实例]     [wiki:selfsvn/zqlib/tangle/zoomq/Karrigell/obpKWD/KwDay4/ KwDay4实例]

::-- ZoomQuiet [DateTime(2005-12-11T04:45:50Z)] TableOfContents

1. K4日:KS

attachment:snap-KwDay40-3Leo.png

不爽直!使用新的KS 页面组织BR现在想来,你实现了三个小功能就用了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

attachment:snap-KwDay40.png

  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 用户会话对象

  • 好了,实际的登录表单还是 [http://www.orionlab.net/karrigell_quickform/Karrigell_QuickForm.html 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"
    
    先别让页面自动跳走,看一看,是否随愿的将登录信息记录了?!

attachment:snap-KwDay4sess.png

  • 问卷的使用原则是,任何人都可以登录,问答,但是:
    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                     )

attachment:snap-KwDay4list.png

1.5. 小节

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

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

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

1.5.1. 明日任务

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

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

1.6. 实例下载

使用 [wiki:self/AllAboutSubversion SVN 下载]:

  • [wiki:selfsvn/zqlib/tangle/zoomq/Karrigell/obpKWD/KwDay4/ KwDay4实例]

1.7. 讨论

Include(/Discuss)


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

KwDay4 (last edited 2009-12-25 07:19:11 by localhost)