用Zoundry Raven发表带Slug和可自定日期的文章
用Zoundry Raven发表带缩略名(Slug)解决方案
在micolog后台的系统设置里,我使用了默认结构化链接为%(year)s/%(month)s/%(day)s/%(postname)s.html,这样我的文章的链接将是2009/11/18/slug-name.html的形式,您可以把slug-name换成其它喜欢的缩略名,使得链接的指向一目了然。在网页上写文章时,编辑器下方有个Slug文本框可以设置,但在使用Zoundry Raven发表时,即使我在软件"设置"里面加了缩略名,可还是没效果。

博客程序目录下的api_rpc.py是完成接受Zoundry Raven的数据并完成发表工作的。该文件里面的metaWeblog_newPost方法具体完成发表新文章的功能,它的第二个参数struct传入的就是博客的数据。我测试了一下,发现当我把Zoundry Raven的很多属性都设置上后,最终传到metaWeblog_newPost的struct有以下几个属性及它们的内容:
- mt_keywords : 标签Tags
- mt_convert_breaks:未知
- title:标题
- description:正文
- dateCreated:日期
唯独没有wp_slug,我在想是不是WordPress才支持,但无论如何,这不是api_rpc.py没处理这个问题,而是Zoundry Raven没传递过来。要在Zoundry Raven上找解决方法似乎更难些,于是我想这样来解决吧,把Slug附加到Title后面。
定义:Zoundry Raven发文的struct结构中的title值包含Title和Slug,标题最后一个@(如果存在)之后的所有字符串为Slug,之前的为标题。
示例:
"今天真冷" == Titile: "今天真冷" ; Slug: 无
"今天真冷@cold-day-today" == Title:"今天真冷" ; Slug: "cold-day-today"
"我的邮件是xxx@yyy.com@my-email" == Title:"我的邮件是xxx@yyy.com" Slug:"my-email"
就这样,不用担心@做了特殊符号而输入不了,只要在写完的标题之后加上@slug-name即可。下面是api_rpc.py文件要修改的代码,后面有注释中文的就是要改动的行,很容易找到这些行的:
for cate in cates: c=Category.all().filter('name =',cate) if c: newcates.append(c[0].key())
titleAndslug = struct['title'].rsplit('@',1) #添加这一行,把Title分离 entry=Entry(title = titleAndslug[0], #修改这一行,取出标题 content =struct['description']+string, categorie_keys=newcates )
if struct.has_key('mt_text_more'): content=struct['mt_text_more'] if content: entry.content=entry.content+"<!--more-->"+struct['mt_text_more'] if struct.has_key('mt_keywords'): entry.settags(struct['mt_keywords'])
# if struct.has_key('wp_slug'): #注释掉这行
# entry.slug=struct['wp_slug'] #注释掉这行 if len(titleAndslug)>1 and titleAndslug[1]!='': #添加这一行,如果长度>1则表示有Slug entry.slug=titleAndslug[1] #添加这一行,将Slug赋值
这样就可以实现了,以后用Zoundry Raven写文章时就记得把Slug加在标题后面吧,用网页的编辑器对这个就无效了,您需要在网页编辑器下面的Slug文本框添加。
用Zoundry Raven设置发文时间
如前面提到的,如果在发文的时候,设置了发文的时间的话(选中上图中的"覆盖发布时间"),那么Zoundry Raven传递给api_rpc.py的struct里就有一个dateCreated的值,它是这样的格式:YYYYMMDDTHH:mm:ssZ,如20091118T12:44:46Z 。在api_rpc.py里面处理一下这个值并赋值给entry里的date即可。代码如下,有中文注释的即为修改的行,很容易找到在哪里加入:
if struct.has_key('mt_excerpt'): entry.excerpt=struct['mt_excerpt']
if struct.has_key('dateCreated'): #如果有日期属性 d_s = str(struct['dateCreated']) #格式:YYYYMMDDTHH:mm:ssZ year = int(d_s[0:4]) #获取年,int类型 month = int(d_s[4:6]) #获取月 day = int(d_s[6:8]) #获取日 hour = int(d_s[9:11]) #获取时 minute = int(d_s[12:14]) #获取分 second = int(d_s[15:17]) #获取秒 d = datetime(year,month,day,hour,minute,second) #建立该时间的对象 entry.date = d #赋值给entry里的date
修改之后记得appcfg.py update更新哦,如果想安全点测试,可以通过修改app.yaml里面的version来实现,这时就可以在App Engine后台选择版本了。
转载请注明:来自pugWoo's Life
本文地址:http://www.pugwoo.com/2009/11/18/zoundry-set-slug-datetime.html
2 条评论
我要留言Zoundry Raven 发表于 2010-06-14 at 14:56 回复 引用
pugwoo 发表于 2010-06-14 at 19:54 回复 引用
这个是我设置错了,不好意思误导大家啊