<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-17849398</id><updated>2024-03-13T19:06:00.457+08:00</updated><title type='text'>肥嘟嘟(Fatbobman)的学习笔记</title><subtitle type='html'>上学的时候懒不愿意做笔记，但确实了解笔记的重要性。现在想做笔记了，但是还是懒，当然对于重要性的认识丝毫没有动摇。</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://fatbobman-notes.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default?alt=atom'/><link rel='alternate' type='text/html' href='http://fatbobman-notes.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>fatbobman</name><uri>http://www.blogger.com/profile/16410958914714647924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://www.donews.net/images/www_donews_net/fatbobman/35564/o_pig.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>24</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-17849398.post-3238049567348750277</id><published>2020-05-28T08:51:00.003+08:00</published><updated>2024-02-24T17:48:17.626+08:00</updated><title type='text'>十几年后重开博客</title><content type='html'>重新创建了博客。&lt;div&gt;&lt;a href=&quot;https://fatbobman.com&quot;&gt;https://fatbobman.com&lt;/a&gt;&lt;br /&gt;
👀&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fatbobman-notes.blogspot.com/feeds/3238049567348750277/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17849398/3238049567348750277' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/3238049567348750277'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/3238049567348750277'/><link rel='alternate' type='text/html' href='http://fatbobman-notes.blogspot.com/2020/05/blog-post.html' title='十几年后重开博客'/><author><name>fatbobman</name><uri>http://www.blogger.com/profile/16410958914714647924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://www.donews.net/images/www_donews_net/fatbobman/35564/o_pig.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17849398.post-113378503231098648</id><published>2005-12-05T20:17:00.000+08:00</published><updated>2005-12-05T20:17:12.346+08:00</updated><title type='text'>python 的 urllib 如何处理gzip的页面数据</title><content type='html'>&lt;span class=&quot;gmail_quote&quot;&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; python-cn上一个朋友提出的问题，自己以前也没想过，恰巧django中有一个middleware是做gzip处理的，看了一下它的代码，了解到可以通过StringIO的方式，将字符串以文件的形式来进行处理。&lt;br&gt;StringIO应该是一个非常有用的模块，因为很多函数都是只支持文件的，使用它后就没有问题了。&lt;br&gt; &lt;pre&gt;&lt;blockquote&gt;&lt;br&gt;&lt;br&gt;import urllib2&lt;br&gt;import cStringIO&lt;br&gt;import gzip&lt;br&gt;&lt;br&gt;f=urllib2.urlopen(&#39;&lt;a href=&quot;http://www.gzip.com/aaaxxx&quot; target=&quot;_blank&quot; onclick=&quot;return top.js.OpenExtLink(window,event,this)&quot;&gt;http://www.gzip.com/aaaxxx &lt;br&gt;&lt;/a&gt;&#39;) #gzip url&lt;br&gt;zbuf=cStringIO.String(f.read())&lt;br&gt;print gzip.GzipFile(fileobj=zbuf,mode=&#39;rb&#39;).read()&lt;/blockquote&gt;&lt;/pre&gt; &lt;br clear=&quot;all&quot;&gt;&lt;br&gt;-- &lt;br&gt;我的blog: &lt;a href=&quot;http://www.donews.net/fatbobman&quot;&gt;http://www.donews.net/fatbobman&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://fatbobman-notes.blogspot.com/feeds/113378503231098648/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17849398/113378503231098648' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/113378503231098648'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/113378503231098648'/><link rel='alternate' type='text/html' href='http://fatbobman-notes.blogspot.com/2005/12/python-urllib-gzip.html' title='python 的 urllib 如何处理gzip的页面数据'/><author><name>fatbobman</name><uri>http://www.blogger.com/profile/16410958914714647924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://www.donews.net/images/www_donews_net/fatbobman/35564/o_pig.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17849398.post-113348994833181134</id><published>2005-12-02T10:19:00.000+08:00</published><updated>2005-12-02T10:19:08.376+08:00</updated><title type='text'>幸福的时光是短暂的？</title><content type='html'>&lt;p class=&quot;mobile-post&quot;&gt;从昨天夜里开始，我又无法通过正常途径访问我在blogger上的blog了。我不知道该用悲哀还是什么其他的情绪来看待这个现象。&lt;br /&gt;ok,恢复我在donews上的blog,不过继续保留通过gmail向这里发blog，或许、说不定、可能、但可是在某年某月的某一天,GFW又伸出它那仁慈的臂膀，将blogger推向我的怀抱呢：）&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://fatbobman-notes.blogspot.com/feeds/113348994833181134/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17849398/113348994833181134' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/113348994833181134'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/113348994833181134'/><link rel='alternate' type='text/html' href='http://fatbobman-notes.blogspot.com/2005/12/blog-post.html' title='幸福的时光是短暂的？'/><author><name>fatbobman</name><uri>http://www.blogger.com/profile/16410958914714647924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://www.donews.net/images/www_donews_net/fatbobman/35564/o_pig.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17849398.post-113344990388332230</id><published>2005-12-01T23:11:00.000+08:00</published><updated>2005-12-01T23:11:43.886+08:00</updated><title type='text'>python challenge 又解过两关</title><content type='html'>&lt;p class=&quot;mobile-post&quot;&gt;花了2天时间终于过了第12关。呵呵，感觉到里面提供的很多线索其实是一种误导，需要认真、认真、再认真才可以呀。&lt;br /&gt;时间有点晚了，明天再总结一下解题的思路吧。&lt;br /&gt;打算从11题起，不将谜底直接说出来了，保留悬念。python challenge真是好玩呀：）再称赞一下！&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://fatbobman-notes.blogspot.com/feeds/113344990388332230/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17849398/113344990388332230' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/113344990388332230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/113344990388332230'/><link rel='alternate' type='text/html' href='http://fatbobman-notes.blogspot.com/2005/12/python-challenge_01.html' title='python challenge 又解过两关'/><author><name>fatbobman</name><uri>http://www.blogger.com/profile/16410958914714647924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://www.donews.net/images/www_donews_net/fatbobman/35564/o_pig.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17849398.post-113324420148683216</id><published>2005-11-29T14:03:00.000+08:00</published><updated>2005-11-29T14:03:21.493+08:00</updated><title type='text'>Python Challenge 答案 （6-10）</title><content type='html'>&lt;p class=&quot;mobile-post&quot;&gt; [http://www.pythonchallenge.com/]&lt;/p&gt;&lt;p class=&quot;mobile-post&quot;&gt;The Python Challenge&lt;/p&gt;&lt;p class=&quot;mobile-post&quot;&gt;第6题： zip 模块&lt;br /&gt; title提示是一对。&lt;br /&gt; 源代码中出现〈!-- 〈-- zip --〉字样&lt;br /&gt; 从http://www.pythonchallenge.com/pc/def/channel.zip 下载zip文件&lt;br /&gt; (提示够变态吧)&lt;br /&gt; 打开zip文件中的readme.txt 可以看到&lt;br /&gt;welcome to my zipped list.&lt;/p&gt;&lt;p class=&quot;mobile-post&quot;&gt;hint1: start from 90052&lt;br /&gt;hint2: answer is inside the zip&lt;br /&gt;感觉解题思路基本上和上面那个反复调用url的题一样&lt;br /&gt;r=re.compile(r&#39;(\d+)$&#39;)&lt;br /&gt;nextnothing=&#39;90052&#39;&lt;/p&gt;&lt;p class=&quot;mobile-post&quot;&gt;while(1):&lt;br /&gt; try:&lt;br /&gt; f=open(&#39;./python challenge/%s.txt&#39; % nextnothing)&lt;br /&gt; result=f.read()&lt;br /&gt; f.close()&lt;br /&gt; print result&lt;br /&gt; oldnextnothing=nextnothing&lt;br /&gt; nextnothing=r.search(result).group()&lt;br /&gt; except:&lt;br /&gt; break&lt;/p&gt;&lt;p class=&quot;mobile-post&quot;&gt;执行后最后显示&lt;br /&gt;collect the comments&lt;/p&gt;&lt;p class=&quot;mobile-post&quot;&gt;有点昏吧，哪里来的comments。其实就在zip文件里。这道题最后还是需要用zip模块来完成&lt;br /&gt;import re&lt;br /&gt;r=re.compile(r&#39;(\d+)$&#39;)&lt;/p&gt;&lt;p class=&quot;mobile-post&quot;&gt;import zipfile&lt;br /&gt;comment=[]&lt;br /&gt;nextnothing=&#39;90052&#39;&lt;br /&gt;f=zipfile.ZipFile(&#39;./python challenge/channel.zip&#39;)&lt;br /&gt;while(1):&lt;br /&gt; try:&lt;br /&gt; comment.append(f.getinfo(&#39;%s.txt&#39; % nextnothing).comment)&lt;br /&gt; nextnothing=r.search(f.read(&#39;%s.txt&#39; % nextnothing)).group()&lt;br /&gt; except:&lt;br /&gt; print &#39;&#39;.join(comment)&lt;br /&gt; break&lt;/p&gt;&lt;p class=&quot;mobile-post&quot;&gt;运行屏幕显示一个由字符组成的图片，可以看出图案是HOCKEY&lt;br /&gt;进入http://www.pythonchallenge.com/pc/def/hockey.html&lt;br /&gt;什么？还没结束！&lt;br /&gt;上面显示it&#39;s in the air. look at the letters.&lt;br /&gt;此时，再次注意观察前面出现的hockey图片发现，每个字母的图案都是由一个单独的字母组成，得到最终答案oxygey&lt;br /&gt;下题入口http://www.pythonchallenge.com/pc/def/oxygen.html&lt;/p&gt;&lt;p class=&quot;mobile-post&quot;&gt;第7题： pil出场。颜色拾取&lt;br /&gt;屏幕上显示一幅图，图片的中间部分是由规律的灰度块组成。猜测信息应该是由这些灰度提供。&lt;br /&gt;通过gimp进一步分析可获得整个区域灰度块长度为608，除第一小块外，其他间隔都是7个象素点。也就是说每隔7个点可以获得一个颜色数据。由于图片是彩色的（RGBA模式），而只有灰度的颜色数据应该是255级以内，推测可能会是ascii。&lt;/p&gt;&lt;p class=&quot;mobile-post&quot;&gt;import Image&lt;br /&gt;im = Image.open(&#39;./python challenge/oxygen.png&#39;)&lt;br /&gt;ilist = im.convert(&#39;L&#39;).getdata() #将色彩转换为灰度，这样只获得一个值&lt;br /&gt;result=[]&lt;br /&gt;for i in range(0,608,7):&lt;br /&gt; result.append(chr(ilist[im.size[0]*50+i]))&lt;br /&gt;print &#39;&#39;.join(result)&lt;/p&gt;&lt;p class=&quot;mobile-post&quot;&gt;果然，运行程序显示：smart guy, you made it. the next level is [105, 110, 116,&lt;br /&gt;101, 103, 114, 105, 116, 121]&lt;br /&gt;再次处理可得到答案&lt;br /&gt;hint=[105, 110, 116, 101, 103, 114, 105, 116, 121]&lt;br /&gt;answer=[]&lt;br /&gt;for c in hint:&lt;br /&gt; answer.append(chr(c))&lt;br /&gt;print &#39;&#39;.join(answer)&lt;/p&gt;&lt;p class=&quot;mobile-post&quot;&gt;最终答案：integrity&lt;br /&gt;下题入口：http://www.pythonchallenge.com/pc/def/integrity.html&lt;/p&gt;&lt;p class=&quot;mobile-post&quot;&gt;第8题：bz2解码&lt;br /&gt;屏幕显示一个蜜蜂图片。查看页面源代码可以看到里面提示有加过密的用户名、密码。&lt;br /&gt;点击蜜蜂可进入一个需要输入口令的页面，说明此题应该就是解开用户名、密码&lt;br /&gt;说实话，这道题我始终没有找到破解加密算法的思路，直到看到网上有人说google以下BZh91AY。这个字符串时用户名和密码最开始相同的部分。google后可以看到介绍python&lt;br /&gt;bz2模块，得到解题思路。&lt;br /&gt;import bz2&lt;/p&gt;&lt;p class=&quot;mobile-post&quot;&gt;un = &#39;BZh91AY&amp;amp;SYA\xaf\x82\r\x00\x00\x01\x01\x80\x02\xc0\x02\x00&lt;br /&gt;\x00!\x9ah3M\x07&amp;lt;]\xc9\x14\xe1BA\x06\xbe\x084&#39;&lt;br /&gt;pw = &#39;BZh91AY&amp;amp;SY\x94$|\x0e\x00\x00\x00\x81\x00\x03$&lt;br /&gt;\x00!\x9ah3M\x13&amp;lt;]\xc9\x14\xe1BBP\x91\xf08&#39;&lt;/p&gt;&lt;p class=&quot;mobile-post&quot;&gt;un=bz2.decompress(un)&lt;br /&gt;pw=bz2.decompress(pw)&lt;/p&gt;&lt;p class=&quot;mobile-post&quot;&gt;print un&lt;br /&gt;print pw&lt;/p&gt;&lt;p class=&quot;mobile-post&quot;&gt;运行得到答案&lt;br /&gt;huge&lt;br /&gt;file&lt;br /&gt;登录即可进入下题&lt;/p&gt;&lt;p class=&quot;mobile-post&quot;&gt;下题入口http://www.pythonchallenge.com/pc/return/good.html&lt;/p&gt;&lt;p class=&quot;mobile-post&quot;&gt;第9题：pil再度出马，描点&lt;br /&gt;屏幕上显示一幅风景画，上面有很多小黑点。&lt;br /&gt;title提示，连接点&lt;br /&gt;page source中可以看到两组数据 first second 并提示 first+second=?&lt;br /&gt;起初我真的在gimp上把图片上面的点用画笔描了起来，看看是否有什么提示，不过一无所获。&lt;br /&gt;后来观察first和second的数据，发现其值均在该图片的x,y size之内，并且两组数据的个数都为偶数，获得灵感是否是坐标数据&lt;br /&gt;import Image&lt;br /&gt;first=[&lt;br /&gt;146,399,163,403,170,393,... snip]&lt;br /&gt;second=[&lt;br /&gt;156,141,165,135,169,...snip]&lt;br /&gt;im=Image.open(&#39;./python challenge/good.jpg&#39;)&lt;br /&gt;f=[]&lt;br /&gt;for i in range(0,len(first),2):&lt;br /&gt; f.append((first[i],first[i+1]))&lt;br /&gt;print f&lt;br /&gt;for xy in f:&lt;br /&gt; im.putpixel(xy,(255,0,0))&lt;/p&gt;&lt;p class=&quot;mobile-post&quot;&gt;f=[]&lt;br /&gt;for i in range(0,len(second),2):&lt;br /&gt; f.append((second[i],second[i+1]))&lt;br /&gt;print f&lt;br /&gt;for xy in f:&lt;br /&gt; im.putpixel(xy,(255,0,0))&lt;br /&gt;im.show()&lt;/p&gt;&lt;p class=&quot;mobile-post&quot;&gt;呵呵，可以隐约在图片上面由红色的点组成了一头牛的图案。&lt;br /&gt;first是外缘轮廓，second是头的轮廓&lt;br /&gt;赶紧进入http://www.pythonchallenge.com/pc/return/cow.html&lt;br /&gt;结果发现提示hmm. it&#39;s a male.&lt;br /&gt;唉，分得还挺细。。&lt;br /&gt;得到最后结果：bull&lt;/p&gt;&lt;p class=&quot;mobile-post&quot;&gt;下题入口：http://www.pythonchallenge.com/pc/return/bull.html&lt;/p&gt;&lt;p class=&quot;mobile-post&quot;&gt;第10题： 数字列表&lt;br /&gt;屏幕下方提示 ：len(a[30]) = ?&lt;br /&gt;点击图片可获得数据：&lt;br /&gt;a = [1, 11, 21, 1211, 111221,&lt;br /&gt;知道应该是根据这个提示找出规律，扩充列表获得答案。&lt;br /&gt;不过规律何在？解此题。。。。耗时超过2小时。。。。主要是笨呀。&lt;br /&gt;最后终于明白值之间的规律。就是每个值都是对前一个值得文字描述。&lt;br /&gt;什么？文字描述，不错，念起来就知道了&lt;br /&gt;比如说第一个是 1&lt;br /&gt;第二个就是 1个1 （11）&lt;br /&gt;第三个就是 2个1 （21）&lt;br /&gt;第4个就是 1个2 1个1 （1211）&lt;br /&gt;第5个就使 1个1 1个2 2个1 （111221）&lt;br /&gt;一次类推。。。。说实话，开始总是想数字之间是否有什么数学运算上的关系，所以总也推算不出。&lt;/p&gt;&lt;p class=&quot;mobile-post&quot;&gt;olda = [1, 11, 21, 1211, 111221]&lt;/p&gt;&lt;p class=&quot;mobile-post&quot;&gt;def _index(c,list):&lt;br /&gt; for i in range(len(list)):&lt;br /&gt; if list[i]!=c:&lt;br /&gt; return i&lt;br /&gt; return -1&lt;/p&gt;&lt;p class=&quot;mobile-post&quot;&gt;while len(olda)&amp;lt;31:&lt;br /&gt; result=&#39;&#39;&lt;br /&gt; resultlist=[]&lt;br /&gt; a=str(olda[-1])&lt;br /&gt; while len(a)&amp;gt;0:&lt;br /&gt; firstdiffindex = _index(a[0],a[1:])&lt;br /&gt; if firstdiffindex==-1:&lt;br /&gt; resultlist.append(a)&lt;br /&gt; break&lt;br /&gt; else:&lt;br /&gt; resultlist.append(a[0:firstdiffindex+1])&lt;br /&gt; a=a[firstdiffindex+1:]&lt;br /&gt; for l in resultlist:&lt;br /&gt; result +=str(len(l))+str(l[0])&lt;/p&gt;&lt;p class=&quot;mobile-post&quot;&gt; olda.append(int(result))&lt;/p&gt;&lt;p class=&quot;mobile-post&quot;&gt;print len(str(olda[30]))&lt;/p&gt;&lt;p class=&quot;mobile-post&quot;&gt;得到答案：5808&lt;br /&gt;下题入口：http://www.pythonchallenge.com/pc/return/5808.html&lt;/p&gt;&lt;p class=&quot;mobile-post&quot;&gt;--&lt;br /&gt;Posted by fatbobman to 肥嘟嘟的闲言碎语 at 11/29/2005 01:58:15 下午&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://fatbobman-notes.blogspot.com/feeds/113324420148683216/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17849398/113324420148683216' title='2 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/113324420148683216'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/113324420148683216'/><link rel='alternate' type='text/html' href='http://fatbobman-notes.blogspot.com/2005/11/python-challenge-6-10.html' title='Python Challenge 答案 （6-10）'/><author><name>fatbobman</name><uri>http://www.blogger.com/profile/16410958914714647924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://www.donews.net/images/www_donews_net/fatbobman/35564/o_pig.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17849398.post-113322637327548746</id><published>2005-11-29T09:06:00.000+08:00</published><updated>2005-11-29T09:06:13.323+08:00</updated><title type='text'>Django 提供了非关键字的url map方式</title><content type='html'>http://www.djangoproject.com/documentation/url_dispatch&lt;br /&gt;&lt;br /&gt;from django.conf.urls.defaults import *&lt;br /&gt;&lt;br /&gt;urlpatterns = patterns(&#39;&#39;,&lt;br /&gt;    (r&#39;^articles/2003/$&#39;, &#39;news.views.special_case_2003&#39;),&lt;br /&gt;    (r&#39;^articles/(\d{4})/$&#39;, &#39;news.views.year_archive&#39;),&lt;br /&gt;    (r&#39;^articles/(\d{4})/(\d{2})/$&#39;, &#39;news.views.month_archive&#39;),&lt;br /&gt;    (r&#39;^articles/(\d{4})/(\d{2})/(\d+)/$&#39;, &#39;news.views.article_detail&#39;),&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;由于没有关键字，因此所获得的参数是按顺序调用&lt;br /&gt;类似：news.views.month_archive(request, &#39;2005&#39;, &#39;03&#39;)&lt;br /&gt;个人所好不同吧。总之django一直在努力！</content><link rel='replies' type='application/atom+xml' href='http://fatbobman-notes.blogspot.com/feeds/113322637327548746/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17849398/113322637327548746' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/113322637327548746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/113322637327548746'/><link rel='alternate' type='text/html' href='http://fatbobman-notes.blogspot.com/2005/11/django-url-map.html' title='Django 提供了非关键字的url map方式'/><author><name>fatbobman</name><uri>http://www.blogger.com/profile/16410958914714647924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://www.donews.net/images/www_donews_net/fatbobman/35564/o_pig.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17849398.post-113318571094715883</id><published>2005-11-28T21:48:00.000+08:00</published><updated>2005-11-28T21:56:10.986+08:00</updated><title type='text'>Python Challenge 答案 （1-5）</title><content type='html'>&lt;a href=&quot;http://www.pythonchallenge.com/&quot;&gt;The Python Challenge&lt;/a&gt;&lt;br /&gt;从没想过解题还能这么有趣。&lt;br /&gt;刚打开pythonchallenge的站点时有点莫名其妙的感觉，并不清楚到底问题在哪里。后来发现其中的奥秘就是你要在他所给的线索中找到下一题的url，这样便可以进入下一关了。&lt;br /&gt;python challenge中有几个地方是重要的线索来源：&lt;br /&gt;1：title （其中通常含有解题的思路提示）&lt;br /&gt;2：page source (页面源代码，中间通常有数据资源，或者指明数据资源的位置）&lt;br /&gt;&lt;br /&gt;第0题：&lt;br /&gt; 出现一幅画面，上面写着2**38，教你如何进入下一关。&lt;br /&gt; 计算出2**38 =&lt;br /&gt; 将浏览器中的 http://www.pythonchallenge.com/pc/def/0.html 改成 http://www.pythonchallenge.com/pc/def/274877906944.html 即可&lt;br /&gt;&lt;br /&gt;第1题：密码转换&lt;br /&gt; 图片中显示出字符转换的规律 new_c=chr(ord(old_c)+2) 超过自动回转&lt;br /&gt; title中提示making trans&lt;br /&gt; 因此比较简单的方法是直接使用string.translate进行转换。&lt;br /&gt; oldstr = &#39; ...&#39;  #屏幕上显示的加密数据&lt;br /&gt; import string&lt;br /&gt; old=&#39;abcdefghijklmnopqrstuvwxyz&#39;&lt;br /&gt; new=&#39;cdefghijklmnopqrstuvwxyzab&#39;&lt;br /&gt; print string.translate(oldstr,string.maketrans(old,new))&lt;br /&gt;&lt;br /&gt; 得到如下显示：&lt;br /&gt;i hope you didnt translate it by hand. thats what computers are for.&lt;br /&gt;doing it in by hand is inefficient and that&#39;s why this text is so long.&lt;br /&gt;using string.maketrans() is recommended. now apply on the url.&lt;br /&gt;&lt;br /&gt; 然后再对url http://www.pythonchallenge.com/pc/def/map.html上面的 map 进行一次转换得到ocr.&lt;br /&gt; 下一题入口：&lt;br /&gt;  &lt;a href=&quot;http://www.pythonchallenge.com/pc/def/ocr.html&quot;&gt;http://www.pythonchallenge.com/pc/def/ocr.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt; ps:说实话如果不是做这题，我可能跟不不会想起用maketrans这类的函数。&lt;br /&gt;&lt;br /&gt;第2题： 抽取字符&lt;br /&gt; 页面显示提示数据在page source中&lt;br /&gt; 查看页面源代码。可以看到一组混乱的数据，并得到如下提示：find rare characters in the mess below:&lt;br /&gt;  最初我解此题时是将数据中所有出现的字符都放入哈希并计算出现的次数，后来发现只有英文字母是之出现一次的，由于哈希没有顺序，猜结果耗费的不少时间，后来干脆只提取字符一下子就获得的最后的结果。&lt;br /&gt;&lt;br /&gt;#chardict={}&lt;br /&gt;#for c in ocrstr:&lt;br /&gt;#    if chardict.has_key(c) :&lt;br /&gt;#        chardict[c]+=1&lt;br /&gt;#    else:&lt;br /&gt;#        chardict[c]=0&lt;br /&gt;#&lt;br /&gt;#print chardict&lt;br /&gt;&lt;br /&gt;print &#39;&#39;.join([c for c in ocrstr if c.isalpha()])&lt;br /&gt;&lt;br /&gt; 计算后得到答案：equality&lt;br /&gt; 下题入口：&lt;a href=&quot;http://www.pythonchallenge.com/pc/def/equality.html&quot;&gt;http://www.pythonchallenge.com/pc/def/equality.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;第3题: 提取字符&lt;br /&gt; title中提示使用正则&lt;br /&gt; 页面显示 两侧被3个（且只为3个）大写字母包围的小写字母&lt;br /&gt; page source中有待处理的数据&lt;br /&gt;&lt;br /&gt; import re&lt;br /&gt; result=re.findall(r&#39;[a-z][A-Z]{3}([a-z])[A-Z]{3}[a-z]&#39;,sourcestr)&lt;br /&gt; print &#39;&#39;.join(result)&lt;br /&gt;&lt;br /&gt; 得到答案 linkedlist。&lt;br /&gt; 进入http://www.pythonchallenge.com/pc/def/linkedlist.html后显示linkedlist.php&lt;br /&gt; 下题入口 &lt;a href=&quot;http://www.pythonchallenge.com/pc/def/linkedlist.php&quot;&gt;http://www.pythonchallenge.com/pc/def/linkedlist.php&lt;/a&gt;&lt;br /&gt;&lt;br /&gt; ps:不是python解题吗，怎么用php:)&lt;br /&gt;&lt;br /&gt;第4题：变态的url刷新&lt;br /&gt; 从title和图片可以看出来这题就像打水井一样，需要一遍又一遍的机械进行才能获得答案。&lt;br /&gt; page source显示 图片的href 后面有一个nothing=12345的调用&lt;br /&gt; urllib may help. don&#39;t try ALL nothings, since it will never&lt;br /&gt;end. ~300 times is enough.&lt;br /&gt; 调用linkedlist.php?nothing=12345得到了and the next nothing is 92512 从中得到规律，根据每次获得的nothing值来进行下次url访问。&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;import urllib2&lt;br /&gt;import re&lt;br /&gt;r=re.compile(r&#39;(\d+)$&#39;)&lt;br /&gt;nextnothing=&#39;12345&#39;&lt;br /&gt;i=0&lt;br /&gt;while(1):&lt;br /&gt;   try:&lt;br /&gt;       f=urllib2.urlopen(&#39;http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=%s&#39;% nextnothing)&lt;br /&gt;       result=f.read()&lt;br /&gt;       f.close()&lt;br /&gt;       print result&lt;br /&gt;       oldnextnothing=nextnothing&lt;br /&gt;       nextnothing=r.search(result).group()&lt;br /&gt;       i+=1&lt;br /&gt;   except:&lt;br /&gt;       nextnothing=oldnextnothing&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;需要提示的是，这题竟然在访问的过程中还有变化。在进行了漫长的调用后当nothing 为92118，会显示Yes. Divide by two and keep going。中断程序，将nothing设置为 46059 继续运行。获得最后结果 peak.html&lt;br /&gt;     下题入口：&lt;a href=&quot;http://www.pythonchallenge.com/pc/def/peak.html&quot;&gt;http://www.pythonchallenge.com/pc/def/peak.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;第5题：pickle应用&lt;br /&gt; 说实在的尽管页面提示我将 peak hell 读出声来，我还是没有意识到pickle这个词（英文都还给了党）。&lt;br /&gt; source page中有如下显示&lt;peakhell src=&quot;banner.p&quot;&gt;&lt;br /&gt; 查看http://www.pythonchallenge.com/pc/def/banner.p，通过显示的数据才反应过来应该是pickle&lt;br /&gt;&lt;br /&gt;import urllib2&lt;br /&gt;import cPickle as pickle&lt;br /&gt;f=urllib2.urlopen(&#39;http://www.pythonchallenge.com/pc/def/banner.p&#39;)&lt;br /&gt;result=pickle.Unpickler(f).load()&lt;br /&gt;&lt;br /&gt;result是一个多维列表。分析数据感觉应该是一个字符组成的图画描述。&lt;br /&gt;line=&#39;&#39;&lt;br /&gt;for n in result:&lt;br /&gt; for m in n:&lt;br /&gt;     line+= m[0]*m[1]&lt;br /&gt; print line+&#39;\n&#39;&lt;br /&gt; line=&#39;&#39;&lt;br /&gt;&lt;br /&gt; 打印后可获得答案channel&lt;br /&gt; 下题入口：&lt;a href=&quot;http://www.pythonchallenge.com/pc/def/channel.html&quot;&gt;http://www.pythonchallenge.com/pc/def/channel.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;python challenge目前共有33题，通过做这些题不仅可以开阔思路，更可以强迫自己去使用可能很少会使用的一些python模块，让自己在实践中提高。&lt;/peakhell&gt;</content><link rel='replies' type='application/atom+xml' href='http://fatbobman-notes.blogspot.com/feeds/113318571094715883/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17849398/113318571094715883' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/113318571094715883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/113318571094715883'/><link rel='alternate' type='text/html' href='http://fatbobman-notes.blogspot.com/2005/11/python-challenge-1-5.html' title='Python Challenge 答案 （1-5）'/><author><name>fatbobman</name><uri>http://www.blogger.com/profile/16410958914714647924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://www.donews.net/images/www_donews_net/fatbobman/35564/o_pig.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17849398.post-113317909030851068</id><published>2005-11-28T19:58:00.000+08:00</published><updated>2005-11-28T22:57:11.703+08:00</updated><title type='text'>道语言最新版本0.9.6beta发布</title><content type='html'>&lt;a href=&quot;http://www.xdao.org%20/&quot;&gt;Google 网上论坛 : cn.bbs.comp.lang.python&lt;/a&gt;: &quot;道语言最新版本0.9.6beta发布&quot;&lt;br /&gt;刚才在论坛里看见的。&lt;br /&gt;简单的看了一下文档，感觉很不错。国人的作品！支持一下！&lt;br /&gt;&lt;a href=&quot;http://xdao.org/chinese/fulimin.php&quot;&gt;作者傅利民简介&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://fatbobman-notes.blogspot.com/feeds/113317909030851068/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17849398/113317909030851068' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/113317909030851068'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/113317909030851068'/><link rel='alternate' type='text/html' href='http://fatbobman-notes.blogspot.com/2005/11/096beta.html' title='道语言最新版本0.9.6beta发布'/><author><name>fatbobman</name><uri>http://www.blogger.com/profile/16410958914714647924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://www.donews.net/images/www_donews_net/fatbobman/35564/o_pig.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17849398.post-113310648334214846</id><published>2005-11-27T23:48:00.000+08:00</published><updated>2005-11-27T23:48:03.346+08:00</updated><title type='text'>Django 支持静态文件的web服务了(续)</title><content type='html'>&lt;a href=&quot;http://www.djangoproject.com/documentation/static_files/&quot;&gt;Django | Documentation | How to serve static files&lt;/a&gt;&lt;br /&gt;试用了一下,很好用.&lt;br /&gt;mime支持是用python自带的 mimetypes模块&lt;br /&gt;mimetype = mimetypes.guess_type(fullpath)[0]&lt;br /&gt;另外可以通过设置&lt;br /&gt;show_indexes=True 来显示目录结构&lt;br /&gt;(r&#39;^site_media/(?P&lt;path&gt;.*)&#39;,&#39;django.views.static.serve&#39;,{&#39;document_root&#39;:&#39;d:/myscripts/rssforward/media&#39;,&#39;show_indexes&#39;:True}),&lt;br /&gt;&lt;br /&gt;各个静态文档之间的嵌套也完美的支持了。&lt;br /&gt;&lt;br /&gt;呵呵，又解决了一个问题。本来我还打算用middleware做一个呢。结果django自己在view层支持了，省了不少心。&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://fatbobman-notes.blogspot.com/feeds/113310648334214846/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17849398/113310648334214846' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/113310648334214846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/113310648334214846'/><link rel='alternate' type='text/html' href='http://fatbobman-notes.blogspot.com/2005/11/django-web_27.html' title='Django 支持静态文件的web服务了(续)'/><author><name>fatbobman</name><uri>http://www.blogger.com/profile/16410958914714647924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://www.donews.net/images/www_donews_net/fatbobman/35564/o_pig.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17849398.post-113310559722007046</id><published>2005-11-27T23:33:00.000+08:00</published><updated>2005-11-27T23:33:17.233+08:00</updated><title type='text'>Django 支持静态文件的web服务了</title><content type='html'>&lt;a href=&quot;http://www.djangoproject.com/documentation/static_files/&quot;&gt;http://www.djangoproject.com/documentation/static_files/&lt;/a&gt;&lt;br /&gt;尽管django仅仅是推荐在debug方式下使用，不过还是增添了很大的便利性。对于小型的应用终于可以不需要第三方web server参与了。&lt;br /&gt;不过还不知道对于各种文件类型的meta支持如何。明天测试一下。</content><link rel='replies' type='application/atom+xml' href='http://fatbobman-notes.blogspot.com/feeds/113310559722007046/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17849398/113310559722007046' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/113310559722007046'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/113310559722007046'/><link rel='alternate' type='text/html' href='http://fatbobman-notes.blogspot.com/2005/11/django-web.html' title='Django 支持静态文件的web服务了'/><author><name>fatbobman</name><uri>http://www.blogger.com/profile/16410958914714647924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://www.donews.net/images/www_donews_net/fatbobman/35564/o_pig.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17849398.post-113271067783519027</id><published>2005-11-23T09:51:00.000+08:00</published><updated>2005-11-23T09:51:17.866+08:00</updated><title type='text'>Django admin 下藏有乾坤</title><content type='html'>    标题有点夸大，不过django中确实有很多undocument的东西有趣又有用。&lt;br /&gt;    随便翻看了一下django的代码，看到了不少不知道的好东西。比如 /admin/doc&lt;br /&gt;    这个文档中包含了整个项目所有model的详细说明（自动生成的）。&lt;br /&gt;    又比如django自己内部的url配置中还使用通过判断某个模块安装与否来动态添加url map，这些都是目前文档没有提到的。&lt;br /&gt;    应该说以django的强大功能来衡量，目前的文档资料还是很匮乏的，不过开源项目就是有这个优势，我们可以通过阅读源代码来学习，一方面补充资料的不足，另一方面可以更好的理解系统的原理。&lt;br /&gt;    学海无涯呀。</content><link rel='replies' type='application/atom+xml' href='http://fatbobman-notes.blogspot.com/feeds/113271067783519027/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17849398/113271067783519027' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/113271067783519027'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/113271067783519027'/><link rel='alternate' type='text/html' href='http://fatbobman-notes.blogspot.com/2005/11/django-admin.html' title='Django admin 下藏有乾坤'/><author><name>fatbobman</name><uri>http://www.blogger.com/profile/16410958914714647924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://www.donews.net/images/www_donews_net/fatbobman/35564/o_pig.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17849398.post-113264757338492389</id><published>2005-11-22T16:19:00.000+08:00</published><updated>2005-11-22T16:21:39.566+08:00</updated><title type='text'>newedit 发布3.1并支持django wizard及model定义</title><content type='html'>&lt;p class=&quot;mobile-post&quot;&gt;&lt;a href=&quot;http://blog.donews.com/limodou/archive/2005/11/22/635273.aspx&quot;&gt;http://blog.donews.com/limodou/archive/2005/11/22/635273.aspx&lt;/a&gt;&lt;br /&gt;newedit 发布了3.1。并增加了交互式的django定义model功能。效果很好，不过暂时还不支持META 的定义。&lt;br /&gt;newedit确实越来越好了，打算今后大部分的python开发都在这上面来完成。&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://fatbobman-notes.blogspot.com/feeds/113264757338492389/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17849398/113264757338492389' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/113264757338492389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/113264757338492389'/><link rel='alternate' type='text/html' href='http://fatbobman-notes.blogspot.com/2005/11/newedit-31django-wizardmodel.html' title='newedit 发布3.1并支持django wizard及model定义'/><author><name>fatbobman</name><uri>http://www.blogger.com/profile/16410958914714647924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://www.donews.net/images/www_donews_net/fatbobman/35564/o_pig.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17849398.post-113228446697874630</id><published>2005-11-18T11:27:00.000+08:00</published><updated>2005-11-18T11:27:47.006+08:00</updated><title type='text'>如何判断rss feed内容是否更新</title><content type='html'>&lt;p class=&quot;mobile-post&quot;&gt;为了熟悉django，打算照rssfwd.com的模式制作一个类似的项目。&lt;br /&gt;在判断rss feed内容是否有更新上，我遇到了一点麻烦。我在python下使用feedparser.py来解析各种格式的rss或者atom等信息，结果发现很多站点提供的信息里面没有updated或者modified等时间信息。etag也是没有几个站点支持。这样造成了我的困惑，对于没有时间信息的rss资源如何判断是否更新过呢？&lt;br /&gt;好在rssfwd是开源的，看了一下它的ruby程序。虽然不懂ruby，但大概上还是能看明白的。我发现rssfwd采用通过将每个feed里content&lt;br /&gt;hash后的数据保存在catch中的方法来判断是否有变化。这确实不是一个很好的方法（效率低、占用存储空间大、无论是否更改都再度占用带宽下载），不过这是一个非常有效地解决手段。一下子将程序中需要考虑的众多针对各种版本rss/atom等资源兼容性问题就巧妙解决了。&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://fatbobman-notes.blogspot.com/feeds/113228446697874630/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17849398/113228446697874630' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/113228446697874630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/113228446697874630'/><link rel='alternate' type='text/html' href='http://fatbobman-notes.blogspot.com/2005/11/rss-feed.html' title='如何判断rss feed内容是否更新'/><author><name>fatbobman</name><uri>http://www.blogger.com/profile/16410958914714647924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://www.donews.net/images/www_donews_net/fatbobman/35564/o_pig.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17849398.post-113219512461278503</id><published>2005-11-17T10:38:00.000+08:00</published><updated>2005-11-17T10:38:44.616+08:00</updated><title type='text'>为blog增加了rss feed</title><content type='html'>&lt;p class=&quot;mobile-post&quot;&gt;google的blogger本身只支持atom.不过在国内更多的聚合产品仅支持rss。&lt;br /&gt;使用了一下http://feeds.feedburner.com/的rss服务，为我的blog也增加了rss聚合。&lt;br /&gt;现在聚合真是无所不在呀。&lt;br /&gt;我自己用rssforward来跟踪blog，效果也很不错，不过是ruby完成的，打算用django配合其他几个库也完成一个类似功能的试验项目，算练连手了。&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://fatbobman-notes.blogspot.com/feeds/113219512461278503/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17849398/113219512461278503' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/113219512461278503'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/113219512461278503'/><link rel='alternate' type='text/html' href='http://fatbobman-notes.blogspot.com/2005/11/blogrss-feed.html' title='为blog增加了rss feed'/><author><name>fatbobman</name><uri>http://www.blogger.com/profile/16410958914714647924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://www.donews.net/images/www_donews_net/fatbobman/35564/o_pig.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17849398.post-113213368512869611</id><published>2005-11-16T17:34:00.000+08:00</published><updated>2005-11-16T17:34:45.160+08:00</updated><title type='text'>Django model定义使用外部模块</title><content type='html'>&lt;p class=&quot;mobile-post&quot;&gt;尝试着用django写个小的试验项目，结果在model定义上就出现了问题。&lt;br /&gt;由于需要使用md5模块，所以在程序最前面我加上了 import md5&lt;br /&gt;但在类定义中总说没有引用这个模块。除非在类中重新import才能使用，感到不解。&lt;br /&gt;查看了一下django自己的model core的代码，发现原来需要在META中使用module_constants再次声明一下才可以。&lt;br /&gt;类似如下结构&lt;br /&gt;from django.core import meta&lt;br /&gt;import md5&lt;br /&gt;from random import choice&lt;/p&gt;&lt;p class=&quot;mobile-post&quot;&gt;class test(meta.Model):&lt;br /&gt;    name=meta.CharField(maxlength=10)&lt;/p&gt;&lt;p class=&quot;mobile-post&quot;&gt;   def test(self):&lt;br /&gt;       return md5.new(&#39;aaa&#39;).hexdigest()&lt;/p&gt;&lt;p class=&quot;mobile-post&quot;&gt;    class MEAT:&lt;br /&gt;        module_constants = {&lt;br /&gt;            &#39;md5&#39;: md5,&lt;br /&gt;            &#39;choice&#39;: choice,&lt;br /&gt;        }&lt;/p&gt;&lt;p class=&quot;mobile-post&quot;&gt;其实module_constants在model文档中有过简单的介绍，还是怪自己太粗心。&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://fatbobman-notes.blogspot.com/feeds/113213368512869611/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17849398/113213368512869611' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/113213368512869611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/113213368512869611'/><link rel='alternate' type='text/html' href='http://fatbobman-notes.blogspot.com/2005/11/django-model.html' title='Django model定义使用外部模块'/><author><name>fatbobman</name><uri>http://www.blogger.com/profile/16410958914714647924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://www.donews.net/images/www_donews_net/fatbobman/35564/o_pig.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17849398.post-113169460959313064</id><published>2005-11-11T15:36:00.000+08:00</published><updated>2005-11-11T15:36:49.613+08:00</updated><title type='text'>Django的flatpage 和 redirects 都做出了调整</title><content type='html'>&lt;p class=&quot;mobile-post&quot;&gt;Django果然还是一个没有正式release的项目：）&lt;br /&gt;现在django将flatpage和redirect都作为两个选装项目，需要在settings中加入才能启用。另外数据结构以及命名都作了调整。&lt;br /&gt;具体改动可以参看：&lt;br /&gt;http://code.djangoproject.com/wiki/BackwardsIncompatibleChanges&lt;br /&gt;使用方法：&lt;br /&gt;    * The flatpages app: http://www.djangoproject.com/documentation/flatpages/&lt;br /&gt;    * The redirects app: http://www.djangoproject.com/documentation/redirects/&lt;br /&gt;前几天blog里面的模版里的类命名也发生了变化。&lt;br /&gt;改成{{ flatpage.content }}就可以了。&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://fatbobman-notes.blogspot.com/feeds/113169460959313064/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17849398/113169460959313064' title='2 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/113169460959313064'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/113169460959313064'/><link rel='alternate' type='text/html' href='http://fatbobman-notes.blogspot.com/2005/11/djangoflatpage-redirects.html' title='Django的flatpage 和 redirects 都做出了调整'/><author><name>fatbobman</name><uri>http://www.blogger.com/profile/16410958914714647924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://www.donews.net/images/www_donews_net/fatbobman/35564/o_pig.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17849398.post-113108588706100937</id><published>2005-11-04T14:31:00.000+08:00</published><updated>2005-11-04T14:35:09.396+08:00</updated><title type='text'>在Django下使用flat pages</title><content type='html'>django包含直接对flat pages的支持。在admin状态下可以看到flatpage的管理，但由于没有更具体的说明并不清楚怎么使用。通过分析源代码，发现flatpage render时会送出 {&#39;flatfile&#39;: f} 。因此只需要在模版中通过 {{ flatfile.content }} 即可显示出content内容。&lt;br /&gt;    如果不在admin中指定使用的模版，系统会自动使用 templates\flatfiles\default.html.&lt;br /&gt;    通过flat page,可以快速制作静态也面，而且无需url解析。&lt;br /&gt;    一个说不上是不是问题的问题：flatpage 的url定义只能是目录，不能指定成文件形式。</content><link rel='replies' type='application/atom+xml' href='http://fatbobman-notes.blogspot.com/feeds/113108588706100937/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17849398/113108588706100937' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/113108588706100937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/113108588706100937'/><link rel='alternate' type='text/html' href='http://fatbobman-notes.blogspot.com/2005/11/djangoflat-pages.html' title='在Django下使用flat pages'/><author><name>fatbobman</name><uri>http://www.blogger.com/profile/16410958914714647924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://www.donews.net/images/www_donews_net/fatbobman/35564/o_pig.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17849398.post-113047031734208825</id><published>2005-10-28T11:31:00.000+08:00</published><updated>2005-10-28T11:31:57.360+08:00</updated><title type='text'>Django&#39;s model 参考（三）</title><content type='html'>&lt;span style=&quot;font-weight: bold;&quot;&gt;Model methods&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br&gt; &lt;/span&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; __repr__&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; get_absolute_url&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 如何表现对象的url&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; def get_absolute_url(self):&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return &amp;quot;/pizzas/%i/&amp;quot; % &lt;a href=&quot;http://self.id&quot;&gt;self.id&lt;/a&gt;&lt;br&gt; &lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; _pre_save&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 内容数据库保存前需要做的事情。比如可以对某些字段进行计算等&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; _post_save 保存后做的。比如处理其他相关数据表&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; _pre_delete&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; _post_delete&lt;br&gt; &lt;br&gt; Module-level methods&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 通过在method名字前面加_module_可以定义module-level的methods&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; class Pizza(meta.Model):&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; def _module_get_pizzas_to_deliver():&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return get_list(delivered__exact=False) #__exact 相当于==&amp;nbsp; __ne相当于!= 比较奇怪的用法&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt; &lt;pre class=&quot;literal-block&quot;&gt;&amp;gt;&amp;gt;&amp;gt; from django.models.pizza_hut import pizzas&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; pizzas.get_pizzas_to_deliver()&lt;br&gt;[ ... ]&lt;br&gt;&lt;br&gt;    Manipulator methods&lt;br&gt;    通过在method前面加上_manipulator_定义。用来自定义字段检验。使用相应validate事会自动调用 &lt;br&gt;&lt;br&gt;    &lt;br&gt;class Pizza(meta.Model):&lt;br&gt;    # ...&lt;br&gt;&lt;br&gt;    def _manipulator_validate_customer_id(self, field_data, all_data):&lt;br&gt;        from django.core import validators&lt;br&gt;        from django.conf.settings import BAD_CUSTOMER_IDS &lt;br&gt;&lt;br&gt;        if int(field_data) in BAD_CUSTOMER_IDS:&lt;br&gt;            raise validators.ValidationError, &amp;quot;We don&#39;t deliver to this customer.&amp;quot;&lt;/pre&gt; &lt;br&gt; 使用 models&lt;br&gt; &amp;nbsp; &amp;nbsp; &lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;django-admin.py&lt;/span&gt; &lt;span class=&quot;pre&quot;&gt;startapp 创建&lt;br&gt; &lt;/span&gt;&lt;/tt&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt; &lt;pre class=&quot;literal-block&quot;&gt;myapp/&lt;br&gt;    __init__.py          # Empty file&lt;br&gt;    models/&lt;br&gt;        __init__.py      # Contains &amp;quot;__all__ = [&#39;mymodels&#39;]&amp;quot;&lt;br&gt;&lt;br&gt;   &lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt; &lt;/span&gt;&lt;/tt&gt;        mymodels.py      # Contains your models&lt;/pre&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt; &lt;pre class=&quot;literal-block&quot;&gt;    在setting 中的 &lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;INSTALLED_APPS 加上 mymodels&lt;br&gt;    &lt;br&gt;&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://fatbobman-notes.blogspot.com/feeds/113047031734208825/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17849398/113047031734208825' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/113047031734208825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/113047031734208825'/><link rel='alternate' type='text/html' href='http://fatbobman-notes.blogspot.com/2005/10/djangos-model_28.html' title='Django&#39;s model 参考（三）'/><author><name>fatbobman</name><uri>http://www.blogger.com/profile/16410958914714647924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://www.donews.net/images/www_donews_net/fatbobman/35564/o_pig.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17849398.post-113046796517649238</id><published>2005-10-28T10:52:00.000+08:00</published><updated>2005-10-28T10:52:45.203+08:00</updated><title type='text'>Django&#39;s model 参考（二）</title><content type='html'>&lt;span style=&quot;font-weight: bold;&quot;&gt;关系数据库&lt;/span&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; Django可以支持关系数据库中的表结构的多对一、多对多、一对一多种方式。&lt;br&gt; &lt;br&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;多对一&lt;/span&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 使用ForeignKey&lt;br&gt; &lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; class City(meta.Model):&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #....&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; class Place(meta.Model):&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #....&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; city = meta.ForeignKey(City)&lt;br&gt; &lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 通常情况下，ForeignKey中应该是对应的Model的名字，实际上系统会使用对应Model的_id来维持这个关系。&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 使用 meta.ForeignKey(&amp;quot;self&amp;quot;) 尽兴递归性的多对一&lt;br&gt; &lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; ForeignKey 参数：&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; edit_inline 如果为否，不可在admin模式下编辑。&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; limit_choices_to 使用字典来限制admin模式下的选项。&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; limit_choice_to={&#39;pub_date__lte&#39; : meta.LazyDate()}&lt;br&gt; &lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; max_num_in_admin&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; min_num_in_admin&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; num_extra_on_change&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; num_in_admin&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; raw_id_admin&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 都是用于admin模式&lt;br&gt; &lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; related_name&amp;nbsp; 设置别名&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 对于一个对象相对多次关联另一个对象很有用&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; meta.ForeignKey( Category, related_name=&amp;quot;primary_story&amp;quot;)&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; meta.ForeignKey(Category, related_name=&amp;quot;secondary_story&amp;quot;)&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # get_primary_story_list()&amp;nbsp;&amp;nbsp;&amp;nbsp; get_secondary_story_list()&lt;br&gt; &lt;br&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;多对多&lt;/span&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; ManyToManyField&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 选项： &lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; related_name 同上&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; filter_interface admin模式下使用js而不是select&lt;br&gt; &amp;nbsp; &amp;nbsp; limit_choices_to 同上&lt;br&gt; &lt;br style=&quot;font-weight: bold;&quot;&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;一对一&lt;/span&gt;&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;  OneToOneField&lt;br&gt; &lt;br&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;META 选项&lt;/span&gt;&amp;nbsp; 非数据库字段&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; class Foo(meta.Model):&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bar = meta.CharField(maxlength=30)&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #....&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; class META:&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; admin = meta.Admin()&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # ....&lt;br&gt; &lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 选项：&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; admin 一个meta.Admin对象。表示是否在admin模式下可见&lt;br&gt; &lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; db_table &lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; db_table=&amp;quot;pizza_orders&amp;quot; 否则采用app_lable+&#39;_&#39;+module_name给表命名&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; exceptions&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; exceptions = (&amp;quot;aaa&amp;quot;,&amp;quot;bbb&amp;quot;)&amp;nbsp;&amp;nbsp; ？&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; get_latest_by&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get_lastedt_by = &amp;quot;order_date&amp;quot;对应 一个DateField或者DateTimeField。对象将可通过get_lastest()访问&lt;br&gt; &lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; module_constants &lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 一个可用于module_level使用的常量定义字典&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; module_constants={&#39;MEAT_TYPE_PEPPERONI&#39;:1,&#39;META_TYPE_SAUSAGE&#39;:2,}&lt;br&gt; &lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; module_name&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 如果不指定。系统自动使用 小写class名+&#39;s&#39;&lt;br&gt; &lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; order_with_respect_to&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; order_with_respet_to = &#39;pizza&#39;&amp;nbsp; 根据相关对象排序。如果有关联的话&lt;br&gt; &lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; ordering&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ordering = [&#39;-order_date&#39;] 真正的排序。get_list -号倒序 ?号乱序&lt;br&gt; &lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; permissions&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 使用二元数组或元组定义admin模式下permissions权限&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; ((permission_code, human_readable_permission_name),)&lt;br&gt; &lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; unique_together&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 使用list of lists 定义。用于数据库创建或admin模式&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; unique_together = ((&amp;quot;driver&amp;quot;,&amp;quot;restaurant&amp;quot;),)&lt;br&gt; &lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; verbose_name&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; human-readable version&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; verbose_name_plural 复数版本&lt;br&gt; &lt;br&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;Admin 选项&lt;/span&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; date_hierarchy&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; date_hierarchy=&#39;order_date&#39;&amp;nbsp; admin通过date过滤对象&lt;br&gt; &lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; fields&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 设置用来显示的字短列表。&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; [(name, field_options)] options是一个控制字段的字典。字典键值如下：&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; fields 显示那些字段&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; classes css设置&lt;br&gt; &amp;nbsp;  &lt;br&gt; &lt;pre class=&quot;literal-block&quot;&gt;  fields = (&lt;br&gt;       (None, {&lt;br&gt;        &#39;fields&#39;: (&#39;url&#39;, &#39;title&#39;, &#39;content&#39;, &#39;sites&#39;)&lt;br&gt;        }),&lt;br&gt;       (&#39;Advanced options&#39;, {&lt;br&gt;        &#39;classes&#39;: &#39;collapse&#39;,&lt;br&gt;        &#39;fields&#39; : (&#39;enable_comments&#39;, &#39;registration_required&#39;, &#39;template_name&#39;) &lt;br&gt;        }),&lt;br&gt;      ),&amp;nbsp;&amp;nbsp;  &lt;br&gt;&lt;/pre&gt; 显示效果&amp;nbsp;  &lt;br&gt; &lt;img alt=&quot;http://media.djangoproject.com/img/doc/flatfiles_admin.png&quot; src=&quot;http://media.djangoproject.com/img/doc/flatfiles_admin.png&quot;&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; js&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 在admin模式下现实的一个js字符串列表&lt;br&gt; &lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; list_display&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 采用列表显示。&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; list_filter 打开过滤器。布朗型或多对一&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt; &lt;pre class=&quot;literal-block&quot;&gt;list_display = (&#39;username&#39;, &#39;email&#39;, &#39;first_name&#39;, &#39;last_name&#39;, &#39;is_staff&#39;),&lt;br&gt;&lt;br&gt;list_filter = (&#39;is_staff&#39;, &#39;is_superuser&#39;),&lt;/pre&gt; &lt;br&gt; &lt;img style=&quot;width: 453px; height: 233px;&quot; alt=&quot;http://media.djangoproject.com/img/doc/users_changelist.png&quot; src=&quot;http://media.djangoproject.com/img/doc/users_changelist.png&quot;&gt;&lt;br&gt; &lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ordering 排序&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; save_as 另存一个新对象&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; save_on_top 上方显示save&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; search_fields 上图上面的searech 框&lt;br&gt; &lt;br&gt;</content><link rel='replies' type='application/atom+xml' href='http://fatbobman-notes.blogspot.com/feeds/113046796517649238/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17849398/113046796517649238' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/113046796517649238'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/113046796517649238'/><link rel='alternate' type='text/html' href='http://fatbobman-notes.blogspot.com/2005/10/djangos-model.html' title='Django&#39;s model 参考（二）'/><author><name>fatbobman</name><uri>http://www.blogger.com/profile/16410958914714647924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://www.donews.net/images/www_donews_net/fatbobman/35564/o_pig.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17849398.post-113040277515495388</id><published>2005-10-27T16:46:00.000+08:00</published><updated>2005-10-27T16:46:15.216+08:00</updated><title type='text'>Django model 参考（一）</title><content type='html'>django 中model 作为数据资源指定了字段以及一些处理该相应的功能。通常情况下，每个model对应数据库中的一张表&lt;br&gt; &lt;ul&gt;   &lt;li&gt;每个model都是从django.core.meta.Model中派生出来的&lt;/li&gt;   &lt;li&gt;model中每个属性(class attribute)对应着数据库表中的一个字段&lt;/li&gt;   &lt;li&gt;非字段信息(Model metadata)在类中被称作META&lt;/li&gt; &lt;/ul&gt; Field Objects&lt;br&gt; 每个class attributes对应着数据库中的一个字段，其应该是由meta.Filed的派生的。&lt;br&gt; &lt;br&gt; from django.core import meta&lt;br&gt; class Person(meta.Model):&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; first_name = meta.CharField(maxlength=30)&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; last_name = meta.CharFiled(&amp;quot;lastname&amp;quot;,maxlength=30)&lt;br&gt; &lt;br&gt; 除了 ForeignKey, ManytoManyFiled OneToOneField 使用verbose_name关键字以外，第一个可选参数是用来为字段命名的，如果不设置，系统会自动为起起名。&lt;br&gt; sites = meta.ManyToManyField(site,verbose_name=&amp;quot;list of sites&amp;quot;)&lt;br&gt; &lt;br&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;Field 选项&lt;/span&gt;&lt;br&gt; &lt;br&gt; null &lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; null 缺省设置为false.通常不将其用于字符型字段上，比如CharField,TextField上.字符型字段如果没有值会返回空字符串。&lt;br&gt; &lt;br&gt; blank&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 该字段是否可以为空。如果为假，则必须有值&lt;br&gt; &lt;br&gt; choices&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 一个用来选择值的2维元组。第一个值是实际存储的值，第二个用来方便进行选择。&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; SEX_CHOICES= ((&#39;F&#39;,&#39;Female&#39;),(&#39;M&#39;,&#39;Male&#39;),)&lt;br&gt; &lt;br&gt; core&lt;br&gt; db_column&lt;br&gt; db_index&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 如果为真将为此字段创建索引&lt;br&gt; default&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 缺省值&lt;br&gt; &lt;br&gt; editable&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 如果为假，admin模式下将不能改写。缺省为真&lt;br&gt; &lt;br&gt; help_text&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; admin模式下帮助文档&lt;br&gt; &lt;br&gt; primary_key&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 设置主键。如果没有设置django创建表时会自动加上&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; id = meta.AutoField(&#39;ID&#39;, primary_key=True)&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;primary_key=True&lt;/span&gt;&lt;/tt&gt; implies &lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;blank=False&lt;/span&gt;&lt;/tt&gt;, &lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;null=False&lt;/span&gt; &lt;/tt&gt; and &lt;tt class=&quot;docutils literal&quot;&gt;&lt;span class=&quot;pre&quot;&gt;unique=True&lt;/span&gt;&lt;/tt&gt;. Only one primary key is allowed on an object.&lt;br&gt; &lt;br&gt; radio_admin&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 用于admin模式下将select转换为radio显示。只用于ForeignKey或者设置了choices&lt;br&gt; &lt;br&gt; unique&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 数据唯一&lt;br&gt; &lt;br&gt; unique_for_date&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; title =&amp;nbsp; meta.CharField(maxlength=30,unique_for_date=&#39;pub_date&#39;)&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 系统将不允许title和pub_date两个都相同的数据重复出现&lt;br&gt; &lt;br&gt; unique_for_month / unique_for_year&lt;br&gt; &lt;br&gt; validator_list&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 有效性检查。非有效产生 django.core.validators.ValidationError 错误&lt;br&gt; &lt;br&gt; &lt;br&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;Field Types&lt;/span&gt;&lt;br&gt; &lt;br&gt; AutoField &lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 自动增长的整型字段。通常无需自己添加&lt;br&gt; &lt;br&gt; BooleanField&lt;br&gt; CharField&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 对于大量文字应该使用TextField。参数： maxlength&lt;br&gt; &lt;br&gt; DateField&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 参数： auto_now&amp;nbsp; 自动设置为对象保存时刻的时间。对于类似最后改动之类的应用很有效&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; auto_now_add&amp;nbsp; 从最初保存对象至今的增量时间&lt;br&gt; &lt;br&gt; DateTimeField 同上&lt;br&gt; EmailField &lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 检查是否为email的CharField字段&lt;br&gt; &lt;br&gt; FileField&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 保存文件的相对路径名称&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 绝对路径需要在setting中设置 MEDIA_ROOT。对于ImageField设置 MEDIA_URL。&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 参数upload_to.相对于MEDIA_ROOT目录的子目录&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 通过get_&amp;lt;fieldname&amp;gt;_url获取绝对路径&lt;br&gt; &lt;br&gt; FilePathField&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 通过给定参数获取文件列表（个人感觉）&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; path 必须要有。 文件系统的绝对路径&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; match 可选。一个正则表达式。用来做文件筛选过滤&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; recursive 可选。True 包含子目录查找&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; FilePathField(path=&amp;quot;/home/images&amp;quot;, match=&amp;quot;foo.*&amp;quot; , recursive=True)&lt;br&gt; &lt;br&gt; FloatField&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 浮点数字段。两个必须选项&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; max_digits 数字最多位数&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; decimal_places 小数点位置&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; meta.FloatField(...,max_digits=5,decimal_places=2)&amp;nbsp;&amp;nbsp; /////100.00&lt;br&gt; &lt;br&gt; ImageField&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 基本上同FileField.会进行文件格式检查。两个额外选项&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; height_field, width_field 如果设置这两项，会自动对图片进行缩放后再保存&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 需要 &lt;a href=&quot;http://www.pythonware.com/products/pil/&quot;&gt;python Imaging library&lt;/a&gt;&lt;br&gt; &lt;br&gt; IntegerField&lt;br&gt; IPAddressField&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;&lt;a href=&quot;http://10.1.1.3&quot;&gt;10.1.1.3&lt;/a&gt;&amp;quot;&lt;br&gt; &lt;br&gt; NullBooleanField&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 比BooleanField多了一个NULL状态&lt;br&gt; &lt;br&gt; PhoneNumberField&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 美国格式电话号码 xxx-xxx-xxxx. CharField&lt;br&gt; &lt;br&gt; PositiveIntegerField&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 正整数&lt;br&gt; &lt;br&gt; PositiveSmallIntegerField&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 一个小的正整数。根据数据库的设置&lt;br&gt; &lt;br&gt; SlugField&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 小片断。什么都可以。通常用来存url&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; SlugField 被暗指 maxlength=50 db_index=True&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 选项： prepopulate_from 一个用来自动生成slug的字段列表&lt;br&gt; &lt;br&gt; SmallIntegerField&lt;br&gt; TextField&lt;br&gt; &lt;br&gt; TimeField&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 选项： auto-population(可能不对) from DateField and DateTimeField&lt;br&gt; &lt;br&gt; URLField&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 选项： verify_exists&amp;nbsp; 如果为True ，系统自动检查该url是否存在不为404&lt;br&gt; &lt;br&gt; USStateField&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 两字符美国州简写&lt;br&gt; &lt;br&gt; XMLField&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 保存xml数据。&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 选项：schema_path .指定relaxNG格式schema用来检验xml合法性&lt;br&gt; &lt;br&gt; &lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt; &lt;br&gt; &lt;br&gt; &lt;br&gt; &lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt; &lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt; &lt;br&gt; &lt;br&gt; </content><link rel='replies' type='application/atom+xml' href='http://fatbobman-notes.blogspot.com/feeds/113040277515495388/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17849398/113040277515495388' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/113040277515495388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/113040277515495388'/><link rel='alternate' type='text/html' href='http://fatbobman-notes.blogspot.com/2005/10/django-model.html' title='Django model 参考（一）'/><author><name>fatbobman</name><uri>http://www.blogger.com/profile/16410958914714647924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://www.donews.net/images/www_donews_net/fatbobman/35564/o_pig.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17849398.post-113038998047929183</id><published>2005-10-27T13:13:00.000+08:00</published><updated>2005-10-27T13:13:00.503+08:00</updated><title type='text'>Django + mysql 安装出现的问题</title><content type='html'>　　打算学习以下django，不过刚开始就碰上了问题。由于配合的是mysql，所以按照其要求装了所需的各种模块。可以顺利生成myproject目录。不过init时总报错。&lt;br&gt; &lt;span style=&quot;color: rgb(51, 51, 255);&quot;&gt;C:\Python24\Lib\site-packages&amp;gt;python django\bin\django-admin.py init --settings=&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 51, 255);&quot;&gt; &lt;span style=&quot;color: rgb(51, 51, 255);&quot;&gt;myproject.settings&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 51, 255);&quot;&gt; &lt;span style=&quot;color: rgb(51, 51, 255);&quot;&gt;Error: The database couldn&#39;t be initialized.&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 51, 255);&quot;&gt; &lt;span style=&quot;color: rgb(51, 51, 255);&quot;&gt;an integer is required&lt;br&gt; &lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;　　后来发现其实只要将settings.py 中的DATABASE_PORT =&amp;nbsp; &#39;3306&#39;&amp;nbsp; 改成 DATABASE_PORT = 3306&amp;nbsp;&amp;nbsp;&amp;nbsp; 就可以了，虚惊一场。&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;br&gt; &lt;/span&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://fatbobman-notes.blogspot.com/feeds/113038998047929183/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17849398/113038998047929183' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/113038998047929183'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/113038998047929183'/><link rel='alternate' type='text/html' href='http://fatbobman-notes.blogspot.com/2005/10/django-mysql.html' title='Django + mysql 安装出现的问题'/><author><name>fatbobman</name><uri>http://www.blogger.com/profile/16410958914714647924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://www.donews.net/images/www_donews_net/fatbobman/35564/o_pig.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17849398.post-112951769662293082</id><published>2005-10-17T10:54:00.000+08:00</published><updated>2005-10-17T11:01:55.526+08:00</updated><title type='text'>使用rico实现ajax应用的例子(1)</title><content type='html'>　　关于ajax是什么已经有很多方面的介绍了。本着拿来主义的原则，选择了&lt;a href=&quot;http://openrico.org/rico/home.page&quot;&gt;rico&lt;/a&gt;这个纯js解决方案后端配合&lt;a href=&quot;http://karrigell.sourceforge.net/&quot;&gt;karrigell&lt;/a&gt;来实现一些ajax应用。&lt;br /&gt;　　rico 的ajaxEngine 有多种获取、处理数据的方式。其中通过直接将xml数据与element相绑定可能是最简单的一种。&lt;br /&gt;　　rico中实现ajax应用通常需要分3步走：&lt;br /&gt;&lt;div style=&quot;margin-left: 40px;&quot;&gt; &lt;ol&gt;   &lt;li&gt;Register the Ajax request handler. This tells the AjaxEngine that a specific&lt;br /&gt;web service or server call is mapped to a request handler name.&lt;br /&gt; &lt;/li&gt;   &lt;li&gt;Register the Ajax response handler. This is either specifies an HTML element&lt;br /&gt;as the target of the data being returned (in which case the contents of the&lt;br /&gt;response is HTML code) or it specifies a specific JavaScript object that will&lt;br /&gt;manage the response&lt;br /&gt; &lt;/li&gt;   &lt;li&gt;Invoke the Ajax request when the appropriate event occurs in the interface.&lt;br /&gt; &lt;/li&gt; &lt;/ol&gt; &lt;/div&gt;&lt;br /&gt;　　通过一个实际的例子来演示。&lt;br /&gt;&lt;br /&gt;　　客户端 ajaxtest.html&lt;br /&gt;&lt;div style=&quot;margin-left: 40px;&quot;&gt;&lt;span style=&quot;color: rgb(51, 51, 255);&quot;&gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;AjaxTest&amp;lt;/title&amp;gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(204, 0, 0);&quot;&gt;//这两个文件是rico实现任何功能的基础，必须要有：）&lt;/span&gt;&lt;br /&gt;&amp;lt;script src=&quot;/jsscripts/prototype.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script src=&quot;/jsscripts/rico.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;    &amp;lt;script&amp;gt;&lt;br /&gt;     var onloads = new Array();&lt;br /&gt;     function bodyOnLoad() {&lt;br /&gt;         for ( var i = 0 ; i &amp;lt; onloads.length ; i++ )&lt;br /&gt;          onloads[i]();&lt;br /&gt;     }&lt;br /&gt;  &amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body onload=&quot;javascript:bodyOnLoad()&quot;&amp;gt;&lt;br /&gt;&amp;lt;script&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(51, 51, 255);&quot;&gt;&lt;span style=&quot;color: rgb(204, 0, 0);&quot;&gt;//要在onload时完成所要注册的request、ajaxelement等物件。这个问题最初困扰了我好几个小时。&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(51, 51, 255);&quot;&gt;onloads.push( registerAjaxStuff );&lt;br /&gt;&lt;span style=&quot;color: rgb(204, 0, 0);&quot;&gt;&lt;/span&gt;function registerAjaxStuff()&lt;br /&gt; {&lt;br /&gt;&lt;span style=&quot;color: rgb(204, 0, 0);&quot;&gt;   //注册一个request,命名为getwords,后端处理程序为 ajaxresponse.py。如果你后端不想通过动态语言处理的话，也可以直接使用xml文件。&lt;/span&gt;&lt;br /&gt;  ajaxEngine.registerRequest(&#39;getwords&#39;,&#39;ajaxresponse.py&#39;);&lt;br /&gt; &lt;span style=&quot;color: rgb(204, 0, 0);&quot;&gt;//注册一个客户端显示的element,  id=&#39;word&#39; ，必须在html里面有。 &lt;/span&gt;&lt;br /&gt;  ajaxEngine.registerAjaxElement(&#39;word&#39;);&lt;br /&gt; }&lt;br /&gt;    function getword()&lt;br /&gt;  {    &lt;br /&gt;     &lt;span style=&quot;color: rgb(204, 0, 0);&quot;&gt;//获取数据、自动完成更新。可以调用参数，如下结构：ajaxEngine.sendRequest(&#39;getPersonInfo&#39;,&quot;firstName=&quot; + firstName,&quot;lastName=&quot; + lastName ); &lt;/span&gt;&lt;br /&gt;      ajaxEngine.sendRequest(&#39;getwords&#39;);&lt;br /&gt;  }&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;div id=&quot;word&quot;&amp;gt;This is a test&amp;lt;/div&amp;gt; &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&lt;br /&gt;//实际运行时会将后端获取的数据替换掉div word中的内容。后端数据可以直接包含html、css等元素，这样可以连版式调整问题一并解决。&lt;/span&gt;&lt;br /&gt;&amp;lt;div &amp;gt;&amp;lt;a href=&quot;javascript:getword();&quot;&amp;gt;Click Here&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;　　服务端程序 ajaxresponse.py&lt;br /&gt;&lt;div style=&quot;margin-left: 40px;&quot;&gt;&lt;span style=&quot;color: rgb(51, 51, 255);&quot;&gt;import random&lt;br /&gt;RESPONSE[&#39;Content-Type&#39;] = &#39;text/xml&#39;&lt;br /&gt;RESPONSE[&#39;Cache-Control&#39;]=&#39;no-store&#39; &lt;span style=&quot;color: rgb(204, 0, 0);&quot;&gt;#解决ie下刷新问题&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(51, 51, 255);&quot;&gt;print &quot;&quot;&quot;&amp;lt;?xml version=&quot;1.0&quot; ?&amp;gt;&lt;br /&gt;&amp;lt;ajax-response&amp;gt;&lt;br /&gt;&amp;lt;response type=&quot;element&quot; id=&quot;word&quot;&amp;gt;&lt;br /&gt;&amp;lt;b&amp;gt;hello world&lt;br /&gt;&quot;&quot;&quot;&lt;br /&gt;print str(random.random())&lt;br /&gt;print &quot;&quot;&quot;&amp;lt;/b&amp;gt;&lt;br /&gt;&amp;lt;/response&amp;gt;&lt;br /&gt;&amp;lt;/ajax-response&amp;gt;&lt;br /&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;　　后端程序生成的xml数据类似如下：&lt;br /&gt;&lt;div style=&quot;margin-left: 40px;&quot;&gt;&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;&amp;lt;ajax-response&amp;gt;&lt;/span&gt;  &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;    &amp;lt;response type=&quot;element&quot; id=&quot;word&quot;&amp;gt;&lt;/span&gt;  &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;       &amp;lt;b&amp;gt;hello world&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;0.208002263747&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;&amp;lt;/b&amp;gt;&lt;/span&gt;  &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;    &amp;lt;/response&amp;gt;&lt;/span&gt;  &lt;span style=&quot;color: rgb(0, 153, 0);&quot;&gt;&amp;lt;/ajax-response&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;　　数据必须包含&amp;lt;ajax-response&amp;gt;.这点可能正是rico 灵活性方面的弱势吧，只能接受其规定格式的xml数据。&lt;br /&gt;　　每个被绑定的element 都需要一个response 返回数据。可以在程序中使用&lt;span style=&quot;color: rgb(51, 51, 255);&quot;&gt;registerAjaxElement&lt;/span&gt;绑定多个element,每个对应xml数据中相对应id的&amp;lt;response&amp;gt;.&lt;br /&gt;&lt;br /&gt;　　这是一个很简单的例子来感受ajax所带来的变化，以及rico实现上的便捷。&lt;br /&gt;&lt;span style=&quot;color: rgb(51, 51, 255);&quot;&gt;&lt;/span&gt; &lt;div style=&quot;margin-left: 40px;&quot;&gt;&lt;span style=&quot;color: rgb(51, 51, 255);&quot;&gt;&lt;/span&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fatbobman-notes.blogspot.com/feeds/112951769662293082/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17849398/112951769662293082' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/112951769662293082'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/112951769662293082'/><link rel='alternate' type='text/html' href='http://fatbobman-notes.blogspot.com/2005/10/ricoajax1.html' title='使用rico实现ajax应用的例子(1)'/><author><name>fatbobman</name><uri>http://www.blogger.com/profile/16410958914714647924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://www.donews.net/images/www_donews_net/fatbobman/35564/o_pig.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17849398.post-112929875878141436</id><published>2005-10-14T22:05:00.000+08:00</published><updated>2005-10-14T22:05:58.783+08:00</updated><title type='text'>关于ajax应用在ie下不刷新的解决</title><content type='html'>　　正在学习ajax.前端用rico ，后端karrigell.后端产生的xml是动态的，每次访问产生的结果不同。在firefox下测试没有问题，每次点击都可以获得新的数据。不过在ie下就不行了。第一次点击后的数据好像都是从catch中获取的。&lt;br&gt; 　　通过在pythonchinese获得帮助，通过于karrigell端设置如下语句得以解决：&lt;br&gt; 　　&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;RESPONSE[&#39;Cache-Control&#39;]=&#39;no-store&#39;&lt;br&gt; 　　&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;服务端测试程序如下：&lt;/span&gt;&lt;br&gt; &lt;/span&gt; &lt;div style=&quot;margin-left: 40px; color: rgb(51, 51, 255);&quot;&gt;import random&lt;br&gt; RESPONSE[&#39;Content-Type&#39;] = &#39;text/xml&#39;&lt;br&gt; RESPONSE[&#39;Cache-Control&#39;]=&#39;no-store&#39;&lt;br&gt; print &amp;quot;&amp;quot;&amp;quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; ?&amp;gt;&lt;br&gt; &amp;lt;ajax-response&amp;gt;&lt;br&gt; &amp;lt;response type=&amp;quot;element&amp;quot; id=&amp;quot;word&amp;quot;&amp;gt;&lt;br&gt; &amp;lt;b&amp;gt;hello world&lt;br&gt; &amp;quot;&amp;quot;&amp;quot;&lt;br&gt; print str(random.random())&lt;br&gt; print &amp;quot;&amp;quot;&amp;quot;&amp;lt;/b&amp;gt;&lt;br&gt; &amp;lt;/response&amp;gt;&lt;br&gt; &amp;lt;/ajax-response&amp;gt;&lt;br&gt; &amp;quot;&amp;quot;&amp;quot;&lt;br&gt; &lt;/div&gt; 　　&lt;br&gt; 　　ps:这篇文章是通过gmail post过来的，顺便测试一下gmail下的版式在blogspot上处理的如何。如果效果可以，以后这样写起来方便点。&lt;br&gt; &lt;div style=&quot;color: rgb(51, 51, 255);&quot;&gt;&lt;br&gt; &lt;/div&gt; &lt;div style=&quot;color: rgb(51, 51, 255);&quot;&gt;&lt;br&gt; &lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fatbobman-notes.blogspot.com/feeds/112929875878141436/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17849398/112929875878141436' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/112929875878141436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/112929875878141436'/><link rel='alternate' type='text/html' href='http://fatbobman-notes.blogspot.com/2005/10/ajaxie_14.html' title='关于ajax应用在ie下不刷新的解决'/><author><name>fatbobman</name><uri>http://www.blogger.com/profile/16410958914714647924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://www.donews.net/images/www_donews_net/fatbobman/35564/o_pig.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17849398.post-112929557881057686</id><published>2005-10-14T21:10:00.000+08:00</published><updated>2005-10-14T21:22:27.220+08:00</updated><title type='text'>学习笔记开张</title><content type='html'>　　由于blogger没有提供分类，所以单独开了这个地方用来记录我在学习上面的问题、心得。</content><link rel='replies' type='application/atom+xml' href='http://fatbobman-notes.blogspot.com/feeds/112929557881057686/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/17849398/112929557881057686' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/112929557881057686'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17849398/posts/default/112929557881057686'/><link rel='alternate' type='text/html' href='http://fatbobman-notes.blogspot.com/2005/10/blog-post.html' title='学习笔记开张'/><author><name>fatbobman</name><uri>http://www.blogger.com/profile/16410958914714647924</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://www.donews.net/images/www_donews_net/fatbobman/35564/o_pig.gif'/></author><thr:total>0</thr:total></entry></feed>