status

正式

ZoomQuiet

完成度:95%

1. KDay 2:~ 通过表单直接完成功能!

不管37,21!直接完成心目中的功能,先,,,

小白秉承之前的习惯,先计划当日期望达成的目标:

  1. 可以直接读取原先的问卷设计 .ini 文本, 显示到页面中的 文本框(<TEXTAREA></TEXTAREA>) 中

  2. 可以提交包含问卷设计文本框的表单,并将内容保存到服务器上的指定目录中,完成问卷的更新;

1.1. 规划

行者 ‘Rockety’ 对KarriGell 的设置有很好的介绍

脚注:: 
Rockety 的Karrigell 使用体验,
访问地址:http://wiki.woodpecker.org.cn/moin/RocketyKarrigell
精巧地址:http://bit.ly/3wEwn3
另外在 PCS301 中也对最常用部分的配置进行了说明
  • 小白参考之从新规划了一下站点的开发, 对 /path/to/Karrigell/conf/Karrigell.ini 相关部分进行修订

    ...
    [Alias]
    ..
    q=%(base)s/KDays
    
    追加这一行设置行,这样一来,就可以通过
  • http://localhost:8081/q/kday2/ 来访问今天的开发成果了! 当然没有在 obp 目录中安置index.htm/index.pih 之类的默认首页 KarriGell 是不会让小白看到什么的说……

  • 简单点儿吧!

    # 约定以下全局性变量 
    qpath = "q/"
    pubq = qpath+"easy051201.cfg"
    
    • 使用这样的全局变量定义下来,使用 Leo 快速的将所有的文件控制起来
  • 计划就是这样的:
    1. http://localhost:8081/q/kday2/mana.pih 看到并可以编辑 ini 问卷设计文稿,点击提交后转到

    2. http://localhost:8081/q/kday2/qpage.pih 可以看到真正保存下来的问卷设计内容

1.2. Cheetah

小白很早之前就从身边的师兄师姐那儿就模糊的听说过 MVC 模式,说是什么将 数据模式/前端表现/业务控制 分层实现等等; 在这个简单的连数据库都没有实例小项目中,顶多是 VC 分层了,咨询了一下技术列表,有行者推荐说模板系统中 Cheetah 非常的好和稳定, 那就先尝试它了!

  • 小小看一下子示例,知道 Cheetah 的基本使用是这样的:

   1 from Cheetah.Template import Template        # 0. 引入模板
   2 page = open("你的模板文件.tmpl","r").read()    # 1. 加载模板
   3 vPool = {'cfgtxt':"随便什么字串的值就成"}          # 2. 加载数据
   4 print Template(page, searchList=[vPool])     # 3. 渲染输出`
  • 则模板文件中有 $cfgtxt 的地方就会替换为实际数据

  • 模板文件就是标准的HTML文件,只是各个期望有动态数据出现的地方,变成了 $开头的变量名

  • $开头的变量名 只要在合适的时机,先于print Template() 完成赋值就好

  • 例如以下模板文件片段

<!--你的模板文件.tmpl; 
其实模板文件可以使用任何后缀名的,甚至是.exe 只要内容是纯文本的,但是为了统一,建议还是使用一看就知道是模板的后缀
-->
<H2>$cfgtxt</H2>

详细:: 
PCS309 模板系统
综合列举了流行的一些Web应用模板系统,
分享了一些实用的模板选择和使用体验
有关 Cheetch ~ 印度豹模板系统的简要介绍在:
http://wiki.woodpecker.org.cn/moin/CheetahTemplateOrg

1.3. Leo 组织实现

小白已经习惯了通过 Leo 在一个统一界面中把握程序的全部逻辑层次/章节/元素 ;-)

  • 可以使用中文作章节名目:
    • 问卷来组织设计文案

    • 就是@nosent easy051201.cfg

    • 当然要使用@path q 来配合,这样你对 easy051201.cfg 的修改可以立即输出为具体的文件

  • Ctrl+Alt+cCtrl+Alt+vLeo 中的复制和粘贴操作:

    • 快速从原先的 @nosent index.pih 复制整个节点为

    • @nosent  mana.pih 管理页面入口

    • @nosent  questionnaire.tmpl 修改问卷模板,Cheetah

1.3.1. VC分层

至此,小白组织好了自个儿的'VC'实现:

  • @nosent  mana.pih 虽然几乎是纯HTML页面,但是通过<%Include("qdesign.py")%> 来包含一个纯操作脚本,算数据控制(Control)层?

  • @nosent  questionnaire.tmpl 模板,算表现(View)层?

嗯嗯嗯,原来所谓分层实现,就是将自然的作法,起个NB的名称... ;-)

1.3.2. 八股文样

模式化的处理脚本

  • 从文学化编程角度看,web 应用的前端应用脚本,应该说都一个样儿!

图 KDay2-1 使用 Leo 规格化的功能页面设计情景

  • Upload new attachment "kday2-leo-page.png"

  • 即:
    1. 脚本说明 @...@c 部分

    2. 脚本声明 << page declarations >> 引用的下层部分

    3. 行为定义 @others 包含的所有下级节点

    4. 实际尝试 <<try>> 引用的下层部分

1.4. 编辑实现

其实就是将指定的文件内容读出来发布到页面的输入框(<TEXTARE/>) 中

  • 模板中先准备

    <textarea NAME="cfgfile" rows="27" >
    $cfgtxt
    </textarea>
    
  • 处理脚本中

       1 #简化引用对象名
       2 from Cheetah.Template import Template as ctTpl
       3 vPool = {}
       4 vPool['cfgtxt'] = open(pubq,"r").read()
       5 page = open("questionnaire.tmpl","r").read()
       6 txp = ctTpl(page, searchList=[vPool])
       7 print txp
    
  • Bingo! 完成!

图 KDay2-2 问卷设计主页面

1.5. 展示实现

就是将ini 的内容整理为HTML的页面展示

1.5.1. 关键代码

  • from dict4ini import DictIni 当然的是使用 Limodou 贡献出的 dict4ini.py ~ 字典化ini 操作模块

  • 创建def expage(dict): 问卷输出函式,来将ini 内容整理为相应的页面

       1 exp +="<ul>"
       2 # 将字串的字典键值依照数字方式排序
       3 k = [int(i) for i in dict.ask.keys()]
       4 k.sort() # 没有回传的数组重整处理
       5 for i in k:
       6     ask = dict.ask[str(i)]
       7     exp +="<li>%s"%ask["question"]
       8     exp +="<ul>"
       9     qk = [j for j in ask.keys()]
      10     qk.sort()
      11     for q in qk:
      12         if 1==len(q):
      13             exp +="<li>%s"%ask[q]
      14         else:
      15             pass
      16     exp +="<p>正确答案::%s</p>"%ask["key"]
      17     exp +="</ul>"
      18     exp +="</li>"
      19 exp +="</ul>"
      20 return exp
    
  • 上述代码中的双层循环就可以对应的将所有类似[ask/1] 的问题,以及其中的所有

  • 类似a = 赞! 的选择项按照列表的形式输出了!

图 KDay2-3 问卷设计文本解析输出的页面效果

详细:: 
PCS208 dict4ini
知名行者 Limodou 从UliPad 项目中贡献出来的对象化操作 ini 配置文本支持模块;
在PCS208 中分享了基本技巧

1.6. 串联页面

将编辑页面和展现页面串联起来

  • 当然的要使用 HTML 表单元素 ~ <FORM/>,利用内置的提交声明 ACTION 就可以了,例如:

<FORM ENCTYPE="multipart/form-data" 
    ACTION="qpage.pih" 
    METHOD=POST>

在模板中补充以上声明;

  • 测试为先! 在 qpage.py 中加入print QUERY 确认倒底表单传送过来了什么

图 KDay2-4 使用Karrigell 内置对象 QUERY 观察表单提交

  • OK! 一切吻合想象的确是个字典对象的传送,键就是 <TEXTAREA/> 元素的 NAME;

  • 得到问卷设计文本的修订内容后,就可以简单的通过 open(qpath+pubq,"w").write(QUERY["cfgfile"])

    • 将传送来的编辑成果先写回文件, 再由后续操作整理展现, 这已经不是问题了..

1.7. 明日目标

实现了最基本的编辑到保存,还有问卷展示的脚本那未自然的:

  • 实现可以真实使用的问卷表单哪!

1.8. 实例下载

使用SVN下载地址:

kday2/
|-- dict4ini.py         Limodou 贡献的 ini 解析模块
|-- q/                  问卷设计文本收藏目录
|   `-- easy051201.cfg  第一份问卷设计
|-- mana.pih            问卷设计页面
|-- qdesign.py          问卷设计实际行为脚本
|-- qpage.pih           问卷展示页面
|-- qpage.py            问卷展示实际行为脚本
`-- questionnaire.tmpl  问卷展示模板

图 KDay2-5 本日完成的所有页面在Leo 中的组织情景

Upload new attachment "kday2-leo-all.png"

1.9. 练习

  • 在前面章节练习mysite的基础上, 完成以下功能:
  • (1) 增加编辑页面(edit.pih), 增加编辑输入框, 并保存入本地文件, 转入首页index.pih显示刚刚输入的内容, 类似于制作个人博客的编辑页面; 具体页面分布可参考png中截图;
  • (2) 允许文章的多次修改及删除, 并能体现在首页index.pih中;
  • (3) 提示: 各个文章可以保存为.cfg格式, 该格式文件的处理可参见ConfigParser的使用.


返回 KDays实例故事

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

Name Password4deL ;) :( X-( B-)