## page was renamed from zhArticleTemplate ##language:zh #pragma section-numbers on ::-- ZoomQuiet [<>] <> = K4日:KS = ||{{attachment:snap-KwDay40-3Leo.png}} ||'''不爽直!使用新的KS 页面组织'''<
>现在想来,你实现了三个小功能就用了7,8个文件……有些想念 CherryPy 的对象式网站发布了!|| == lovely session == '''学习一下子文档吧!''' * http://localhost/demo/ksTest.ks/index * {{{#!python so = Session() if not hasattr(so, 'x'): so.x = 0 def index(): print "x = %s" %so.x print '
Increment' print '
Decrement' print '
Reset' def increment(): so.x = _private(so.x) raise HTTP_REDIRECTION,"index" def decrement(): so.x -= 1 raise HTTP_REDIRECTION,"index" def reset(): so.x = 0 raise HTTP_REDIRECTION,"index" def _private(x): """The function name begins with _ : internal function, can't be call by a url""" return x+1 }}} 不是吧!! 一个页面就作完了四种动作!完全是CherryPy 味的!! * Session 完全是对象了,标准的KarriGell 内置对象! * 又不是CherryPy 那样严格的对象属性,是文件级别的全局性变量,容易引用! * 但是,还是要在优雅的Python 脚本中掺杂HTML 代码,不爽直! == HTMLTags == '''函式化的HTML生成''' * http://localhost/doc/en/htmltags.htm * 唉呀呀!!还真的是心想事儿成!2.2 增加的新功能哪! {{{#!python stylesheet = LINK(rel="Stylesheet",href="doc.css") header = TITLE('Record collection')+stylesheet title = H1('My record collection') rows = Sum ([TR(TD(rec.title,Class="title") +TD(rec.artist,Class="Artist")) for rec in records]) table = TABLE(TR(TH('Title')+TH('Artist')) + rows) print HTML(HEAD(header) + BODY(title + table)) }}} 可以将一个标准的HTML页面由几行 Py脚本自然生成! * 那未,只要结合 KS 和 HTMLTags 功能就可以快速实现想要的复杂展示功能了!还可以方便的复用! * 当然的使用[[Leo]] 八股化你所有的.KS {{attachment:snap-KwDay40.png}} 1. `<< page declarations >>` 同样是引用声明什么的 1. `<< htmlcode >>` 就是利用[[Leo]]来快速复用的各种 HTML 代码 1. `<>` 初始化部分,就是各响应页面都要使用的变量准备 1. `@others` 包含以下各种 `def action():` 样定义的实际响应页面和`def _function():` 可以反复调用的不作为页面响应的普通函式声明 == 登录 == '''从默许的index 自动导向 login 那''' * 在{{{#!python def index(): << pagehead >> if sess.usr["name"]=="NULL": raise HTTP_REDIRECTION,"login" else: pass }}} 照猫画虎, 使用`raise HTTP_REDIRECTION,"login"` 来根据是否有登录过来导向登响应 * 当然的,要在 .KS 的 ini 初始化部分先声明会话容器: {{{#!python # 使用 Session来记忆成员信息 sess = Session() if not hasattr(sess, 'usr'): sess.usr = {"name":"NULL"} }}}在没有进行登录前,准备一个值为`NULL` 的`usr` 用户会话对象 * 好了,实际的登录表单还是 [[http://www.orionlab.net/karrigell_quickform/Karrigell_QuickForm.html|KQF]]来干: {{{#!python p = Karrigell_QuickForm('fm_login' ,'POST' ,'chkusr' ,"登录自学问卷") p.addHtmNode('text','uname' ,"staff帐号" ,{'size':40,'maxlength':8}) p.addGroup(["submit","btn_submit","提交","btn"] ,["reset","btn_reset","重写","btn"]) p.addRule('uname','required' ,"成员名是必须的!Login name is required!") p.display() }}} 非常简洁,标准 * 进行有效性判别的处理也是个标准的KS 函式{{{#!python def chkusr(**args): """检查用户登录情况 """ print QUERY sess.usr["name"] = QUERY["uname"] if sess.usr["name"] in pmguys: # pmguys 是个元组,预定义的有管理整理的成员帐号 sess.usr["pm"] = 1 print sess.usr #raise HTTP_REDIRECTION,"index" }}}先别让页面自动跳走,看一看,是否随愿的将登录信息记录了?! {{attachment:snap-KwDay4sess.png}} * 问卷的使用原则是,任何人都可以登录,问答,但是: 1. 只有有效的成员问答才会统计 1. 只有个别的成员才有管理/编辑问卷的权限 == 多问卷选择 == ''' 有了登录后的用户信息,就可以根据不同的角色进行处理了''' === fnmatch === * 指定目录中某模式的所有文件的尋找………… * 有内置的处理模块哪!'''fnmatch''' * 配合统一设置进行搜索{{{#!python qcfglist = [] for f in os.listdir(conf.qpage.qpath): if fnmatch.fnmatch(f, '*.cfg'): if ("__init__" in f): pass else: qcfglist.append(f) print qcfglist }}} 就可以找出目录中所有以`.cfg`结尾的文件! * conf 对象是新发布模式下的统一设置信息对象 * 因为,担心可能需要多个.KS 文件来组织网站,不想象原先那样滥用[[Leo]]来复用信息了 * 所以,建立`@nosent questionnaire.cfg` 统一配置文件 * 这样,`conf = DictIni("questionnaire.cfg")` 一下子,就可以在所有.KS 页面中获取统一的站点设置了 === 列表所有问卷 === '''根据问卷的状态进行归类列表''' {{{#!python # 识别问卷发布情况:: qdone = {} qdoing = {} qdesign = {} for p in qcfglist: cfgp = DictIni(conf.qpage.qpath+p) if 0==cfgp.desc.done: qdesign[p]=cfgp elif 1==cfgp.desc.done: qdoing[p]=cfgp elif 2==cfgp.desc.done: qdone[p]=cfgp else: qdesign[p]=cfgp }}} 使用不同的字典容器先过滤一下子搜索出来的文件; * 然后使用类似的输出就好: {{{#!python print H4("问卷进行中::") print UL("".join([str(LI( B(A(qdoing[i].desc.pname ,href="page?qpname=%s&do=doing"%i.split(".")[-2]) )+ SUP(qdoing[i].desc.learn)+ SUB(A("问答统计",href="stat?qp=%s"%i)) ) ) for i in qdoing.keys() ]) ) }}} {{attachment:snap-KwDay4list.png}} == 小节 == * 实际上,本日,你使用 .ks 体验了一把函式化的页面发布,成果就一个脚本'''index.ks''' * 但是以前完成的`.pih` 依然好用,而你将趁兴将它们都重构为更加爽快的'''函式化页面发布''' * 而且,你忍不住对CSS进行了深入的定制,在输出代码的最简和页面表现丰富之间进行了有效的探索 === 明日任务 === '''心情舒畅!快速的完成了更加简练的功能页面!''' * 但是,如何将编辑,回答,统计融合起来? 1. 点击进入不同问卷,可以回答/或是编辑 1. 点击编辑就直接编辑 1. 提交就成为新版本问卷 1. 问卷要有版本管理 1. 提交后,可以立即回到问答或是问卷集首页 1. 任何页面都有安全退出的链接 1. .... 呜乎哀哉,好象越作越多了,任务………… == 实例下载 == 使用 [[self:AllAboutSubversion|SVN 下载]]: [[selfsvn:zqlib/tangle/zoomq/Karrigell/obpKWD/KwDay4/|KwDay4实例]] == 讨论 == <> ---- 返回 KarrigellWebDev -- 快速体验K开发