::-- ZoomQuiet [2005-12-11 04:45:50]
1. K4日:KS
|
不爽直!使用新的KS 页面组织 |
1.1. lovely session
学习一下子文档吧!
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 味的!!
1.2. HTMLTags
函式化的HTML生成
- 唉呀呀!!还真的是心想事儿成!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))
- 那未,只要结合 KS 和 HTMLTags 功能就可以快速实现想要的复杂展示功能了!还可以方便的复用!
当然的使用Leo 八股化你所有的.KS
<< page declarations >> 同样是引用声明什么的
<< htmlcode >> 就是利用Leo来快速复用的各种 HTML 代码
<<ini>> 初始化部分,就是各响应页面都要使用的变量准备
@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"}
在没有进行登录前,准备一个值为NULL 的usr 用户会话对象
好了,实际的登录表单还是 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.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 页面中获取统一的站点设置了
- conf 对象是新发布模式下的统一设置信息对象
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.6. 实例下载
使用 SVN 下载:
1.7. 讨论
返回 KarrigellWebDev -- 快速体验K开发