用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发表时,即使我在软件"设置"里面加了缩略名,可还是没效果。

2009-11-18 10-23-01.png

博客程序目录下的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



6 条评论

我要留言