<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_251 - 观照无明</title><subtitle type="text">无明最自在，自在力所转</subtitle><id>http://feed.cnblogs.com/blog/u/8411/rss</id><updated>2011-07-28T02:50:51Z</updated><author><name>251</name><uri>http://www.cnblogs.com/itrust/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/itrust/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/8411/rss"/><entry><id>http://www.cnblogs.com/itrust/archive/2011/05/17/2048290.html</id><title type="text">IE9 + django开发版WEB服务器 不响应或Socket报错</title><summary type="text">IE9 + django开发版WEB服务器 不响应或Socket报错===================================================Exception happened during processing of request from (&amp;#39;127.0.0.1&amp;#39;, 49710)Traceback (most recent call last): File &amp;quot;C:\Python26\Lib\SocketServer.py&amp;quot;, line 283, in _handle_request_noblock self.process</summary><published>2011-05-16T16:27:00Z</published><updated>2011-05-16T16:27:00Z</updated><author><name>251</name><uri>http://www.cnblogs.com/itrust/</uri></author><link rel="alternate" href="http://www.cnblogs.com/itrust/archive/2011/05/17/2048290.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/itrust/archive/2011/05/17/2048290.html"/><content type="html">&lt;div&gt;&lt;span style="border-collapse: separate; color: #000000; font-family: Tahoma; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-size: medium;"&gt;&lt;span style="border-collapse: separate; color: #000000; font-family: Tahoma; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-size: medium;"&gt;&lt;span style="font-family: Simsun;"&gt;IE9 + django开发版WEB服务器 不响应或Socket报错&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;span style="border-collapse: separate; color: #000000; font-family: Tahoma; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-size: medium;"&gt;&lt;span style="font-family: Simsun;"&gt;===================================================&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;span style="border-collapse: separate; color: #000000; font-family: Tahoma; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-size: medium;"&gt;&lt;span style="font-family: Simsun;"&gt;Exception happened during processing of request from ('127.0.0.1', 49710)&lt;br /&gt;&#xD;
Traceback (most recent call last):&lt;br /&gt;&#xD;
&amp;nbsp; File "C:\Python26\Lib\SocketServer.py", line 283, in _handle_request_noblock&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp; self.process_request(request, client_address)&lt;br /&gt;&#xD;
&amp;nbsp; File "C:\Python26\Lib\SocketServer.py", line 309, in process_request&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp; self.finish_request(request, client_address)&lt;br /&gt;&#xD;
&amp;nbsp; File "C:\Python26\Lib\SocketServer.py", line 322, in finish_request&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp; self.RequestHandlerClass(request, client_address, self)&lt;br /&gt;&#xD;
&amp;nbsp; File "D:\Studio\ilo\lib\site-packages\django\core\servers\basehttp.py", line 5&lt;br /&gt;&#xD;
70, in __init__&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp; BaseHTTPRequestHandler.__init__(self, *args, **kwargs)&lt;br /&gt;&#xD;
&amp;nbsp; File "C:\Python26\Lib\SocketServer.py", line 617, in __init__&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp; self.handle()&lt;br /&gt;&#xD;
&amp;nbsp; File "D:\Studio\ilo\lib\site-packages\django\core\servers\basehttp.py", line 6&lt;br /&gt;&#xD;
10, in handle&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp; self.raw_requestline = self.rfile.readline()&lt;br /&gt;&#xD;
&amp;nbsp; File "C:\Python26\Lib\socket.py", line 444, in readline&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp; data = self._sock.recv(self._rbufsize)&lt;br /&gt;&#xD;
error: [Errno 10054]&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;span style="border-collapse: separate; color: #000000; font-family: Tahoma; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-size: medium;"&gt;&lt;span style="font-family: Simsun;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;span style="border-collapse: separate; color: #000000; font-family: Tahoma; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-size: medium;"&gt;&lt;span style="font-family: Simsun;"&gt;解决方案&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;span style="border-collapse: separate; color: #000000; font-family: Tahoma; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-size: medium;"&gt;&lt;span style="font-family: Simsun;"&gt;--------------------&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;span style="font-family: Simsun;" face="Simsun"&gt;指定IP地址运行&lt;/span&gt;&lt;span style="font-family: Simsun;"&gt;django开发版WEB服务器，不使用127.0.0.1, 如: python manage.py runserver 192.168.1.2:80&lt;/span&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/itrust/aggbug/2048290.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/itrust/archive/2011/05/17/2048290.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/itrust/archive/2011/04/29/2032348.html</id><title type="text">google chrome 下django用户登录失败的问题</title><summary type="text">问题： django做的网站，用chrome访问时，有50%的概率会发生用户登录失败，request.user依然是匿名用户的情况。Firefox没问题。分析：痛苦了半天，静下心分析原因，发现最后页面在登录重定位后，chrome在请求页面时没有提交session。具体的访问过程是这样：1 /accounts/login/ 返回 302 FOUND，响应头中Location指向 / , 返回sessionid2 / 返回301 MOVED PERMANENTLY, 响应头中Location指向 /myapp/， 未返回 sessionid3 /myapp/ 返回200 OK, 返回具体页面。这个</summary><published>2011-04-28T16:25:00Z</published><updated>2011-04-28T16:25:00Z</updated><author><name>251</name><uri>http://www.cnblogs.com/itrust/</uri></author><link rel="alternate" href="http://www.cnblogs.com/itrust/archive/2011/04/29/2032348.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/itrust/archive/2011/04/29/2032348.html"/><content type="html">&lt;p&gt;&lt;strong&gt;问题：&lt;/strong&gt; &lt;/p&gt;&#xD;
&lt;p&gt;django做的网站，用chrome访问时，有50%的概率会发生用户登录失败，request.user依然是匿名用户的情况。Firefox没问题。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;分析：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;痛苦了半天，静下心分析原因，发现最后页面在登录重定位后，chrome在请求页面时没有提交session。具体的访问过程是这样：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #003366;"&gt;1 &amp;nbsp; /accounts/login/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;返回 302 FOUND，响应头中Location指向 &amp;nbsp;/ , 返回sessionid&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #003366;"&gt;2 &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; &amp;nbsp; &amp;nbsp; &amp;nbsp;返回301 MOVED PERMANENTLY, 响应头中Location指向 &amp;nbsp;/myapp/， 未返回 sessionid&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #003366;"&gt;3 &amp;nbsp; /myapp/ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 返回200 OK, 返回具体页面。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这个过程中Firefox记下了sessionid, 在第3步中提交了；而chrome未记录，在第三步中未提交，导致问题。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;解决：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #000000;"&gt;问题的关键在于不同浏览器处理两次重定位的不同（Firefox&lt;span style="color: #000080;"&gt;聪明&lt;/span&gt;的记下了302那次请求的会话ID，而chrome没有）， 之所以有两次重定位，是因为我在urls.py直接把 / 映射到了 /myapp/，而在login.html中设置 next="/"。 如果只重定位一次，在login.html中设置 next="/myapp/"，问题就迎刃而解了。&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/itrust/aggbug/2032348.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/itrust/archive/2011/04/29/2032348.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/itrust/archive/2010/05/31/1748358.html</id><title type="text">django 开发多语言网站</title><summary type="text">Technorati 标签: django,i18n,javascript,中文,多语言  django的国际化支持非常好也很易用，支持代码、模板和JS的国际化整体解决方法。特别是到了1.2版本加入了对于模板本地的  日期和数字的本地格式化，其国际化支持已经完善。  &amp;#160;  应用方法  首先需要修改settings.py:  1. TEMPLATE_CONTEXT_PROCESSORS 加...</summary><published>2010-05-31T08:48:00Z</published><updated>2010-05-31T08:48:00Z</updated><author><name>251</name><uri>http://www.cnblogs.com/itrust/</uri></author><link rel="alternate" href="http://www.cnblogs.com/itrust/archive/2010/05/31/1748358.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/itrust/archive/2010/05/31/1748358.html"/><content type="html">&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:676f2634-f02d-41ee-9368-8a07b89b6d01" &gt;Technorati 标签: &lt;a href="http://technorati.com/tags/django" rel="tag"&gt;django&lt;/a&gt;,&lt;a href="http://technorati.com/tags/i18n" rel="tag"&gt;i18n&lt;/a&gt;,&lt;a href="http://technorati.com/tags/javascript" rel="tag"&gt;javascript&lt;/a&gt;,&lt;a href="http://technorati.com/tags/%e4%b8%ad%e6%96%87" rel="tag"&gt;中文&lt;/a&gt;,&lt;a href="http://technorati.com/tags/%e5%a4%9a%e8%af%ad%e8%a8%80" rel="tag"&gt;多语言&lt;/a&gt;&lt;/div&gt;  &lt;p&gt;django的国际化支持非常好也很易用，支持代码、模板和JS的国际化整体解决方法。特别是到了&lt;a href="http://docs.djangoproject.com/en/dev/releases/1.2/"&gt;1.2&lt;/a&gt;版本加入了对于模板本地的&lt;/p&gt;  &lt;p&gt;日期和数字的本地格式化，其国际化支持已经完善。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;应用方法&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;首先需要修改settings.py:&lt;/p&gt;  &lt;p&gt;1. TEMPLATE_CONTEXT_PROCESSORS 加入django.core.context_processors.i18n &lt;/p&gt;  &lt;p&gt;2. MIDDLEWARE_CLASSES中加入django.middleware.locale.LocaleMiddleware，注意：它要放在SessionMiddleware和&lt;tt&gt;CacheMiddleware的后面，其他中间件的前面&lt;/tt&gt;&lt;/p&gt;  &lt;p&gt;3. LANGUAGE_CODE 设置缺省的网站语言，如 en, zh-cn,&lt;tt&gt;it&lt;/tt&gt;, &lt;tt&gt;de-at&lt;/tt&gt;, &lt;tt&gt;es&lt;/tt&gt;, &lt;tt&gt;pt-br&lt;/tt&gt; &lt;/p&gt;  &lt;p&gt;4. LANGUAGES&lt;span style="font-family: courier new"&gt;设置网站所支持的所有语言，如(('en', u'English'),('zh-cn',u'中文'))&lt;/span&gt; &lt;/p&gt;  &lt;p&gt;5. USE_I18N&lt;span style="font-family: courier new"&gt; 设置为True&lt;/span&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: courier new"&gt;代码中的应用：&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: courier new"&gt;1. 所有需要国际化支持的源文件要引入函数gettext:&amp;#160; &lt;/span&gt;from django.utils.translation import ugettext_lazy as _ &lt;/p&gt;  &lt;p&gt;2.&amp;#160; 需要多语言支持的字符串如此例写： name = models.CharField(_('Name')…) &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;模板中的应用：&lt;/p&gt;  &lt;p&gt;1.&amp;#160; 所有需要国际化支持的模板文件需要加载： &lt;tt&gt;{% load i18n %}&lt;/tt&gt; &lt;/p&gt;  &lt;p&gt;2.&amp;#160; 需要多语言支持的字符串如此写：&amp;lt;title&amp;gt;{% trans &amp;quot;This is the title.&amp;quot; %}&amp;lt;/title&amp;gt; &lt;/p&gt;  &lt;p&gt;3.&amp;#160; 翻译中间带变量的句子：{% blocktrans %}This string will have {{ value }} inside.{% endblocktrans %} &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;JS中的应用（这部分看&lt;a href="http://docs.djangoproject.com/en/dev/topics/i18n/internationalization/#specifying-translation-strings-in-javascript-code"&gt;django的文档&lt;/a&gt;没搞出来，自己看源码琢磨了一个方法。你也可参考&lt;a href="http://asdfblog.com/technology/django-internationalization.html"&gt;这个文档&lt;/a&gt;）：&lt;/p&gt;  &lt;p&gt;1. 在url.py中加入： (r'^jsi18n/(?P&amp;lt;packages&amp;gt;\S+?)/$', 'django.views.i18n.javascript_catalog'), &lt;/p&gt;  &lt;p&gt;这句话告诉页面在加载这个脚本时由服务器上的javascript_catalog函数生成该脚本，具体的方法是通过packages找到locale，进而找到mo文件，然后将其中的所有翻译字符串放入生成脚本中的一个字典变量中，同时该脚本也定义了gettext函数，这样客户端脚本可使用gettext方法直接从字典中取出翻译字符串。&lt;/p&gt;  &lt;p&gt;其中packages为你的项目名或者Application名的列表以加号隔开，格式为：&amp;#160; testproject+testproject.app1+testproject.app2。这些项目或Application应在INSTALLED_APPS中申明。&lt;/p&gt;  &lt;p&gt;2. 引用jsi18n： &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;/jsi18n/testproject+testproject.app1+testproject.app2”&amp;gt;&amp;lt;/script&amp;gt; &lt;/p&gt;  &lt;p&gt;我的项目不大，只在项目目录下有locale目录因此这样写就可以了 &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;/jsi18n/testproject”&amp;gt;&amp;lt;/script&amp;gt;&lt;/p&gt;  &lt;p&gt;如果你的项目较大，可考虑在Application中放locale目录，如例写脚本链接，这样的话不用每次都生成和加载全站的JS翻译字符串，以加快速度。&lt;/p&gt;  &lt;p&gt;3. 在JS中使用gettext函数翻译：document.write(gettext('this is to be translated')); &lt;/p&gt;  &lt;p&gt;4. 翻译带变量的句子 &lt;/p&gt;  &lt;div id="codeSnippetWrapper"&gt;   &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;fmts = ngettext(&lt;span style="color: #006080"&gt;'There is %s object. Remaining: %s'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'There are %s objects. Remaining: %s'&lt;/span&gt;, 11); &lt;br /&gt;&lt;br /&gt;s = interpolate(fmts, [11, 20]); &lt;span style="color: #008000"&gt;// s is 'There are 11 objects. Remaining: 20' &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&#xD;
&#xD;
  &lt;br /&gt;&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;生成po文件和mo文件&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;这里先补补课，首先是locale目录, 请把locale创建在项目目录或Application目录中，其结构&lt;/p&gt;&#xD;
&#xD;
&lt;div id="codeSnippetWrapper" &gt;&#xD;
  &lt;div id="codeSnippet" &gt;&#xD;
    &lt;pre &gt;locale&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre &gt;en&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre &gt;LC_MESSAGES (这个目录下放django.po/mo, djangojs.po/mo)&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre &gt;zh-cn&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre &gt;LC_MESSAGES(这个目录下放django.po/mo, djangojs.po/mo)&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;django.po/djangojs.po相当于资源文件，它被编译后形成django.mo/djangojs.mo文件，在运行时被读取。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;po文件可以使用工具poedit编辑，我个人喜欢使用&amp;#160; mangage.py makemessages –a 让django自动分析源代码和模板文件&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;生成po，这里要注意两点：&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;1. 按我的实践，js中的字符串不能自动生成po,需手工生成 &lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;2. makemessages 需要调用工具xgettext, Windows没有，可下载&lt;a href="http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/"&gt;晕版的gettext&lt;/a&gt;, 要下两个文件&lt;tt&gt;gettext-runtime-X.zip&lt;/tt&gt; 和 &lt;tt&gt;gettext-tools-X.zip&lt;/tt&gt;&amp;#160; &lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&amp;#160; X为版本号，注意版本低了会报错“Django internationalization requires GNU gettext 0.15 or newer”）&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&amp;#160; 下来后放在解压在一个目录里，然后把下面的bin目录加到你系统路径中。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;3. 通过mangage.py makemessages –a自动生成后，你需要做的是编辑po文件，如 zh-cn/LC_MESSAGES/djang.po，把你的&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;翻译逐个写上去。最后一步编译： mange.py compilemessages &lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;让用户在页面上切换语言&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;把这个放到urls.py中：(r'^i18n/', include('django.conf.urls.i18n')) &lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;搞个表单提交用户选择的语言，如例&amp;#160; &lt;/p&gt;&#xD;
&#xD;
&lt;div id="codeSnippetWrapper"&gt;&#xD;
  &lt;div id="codeSnippet" &gt;&lt;!--CRLF--&gt;&#xD;
    &lt;pre &gt;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;form&lt;/span&gt; &lt;span &gt;action&lt;/span&gt;&lt;span &gt;=&amp;quot;/i18n/setlang/&amp;quot;&lt;/span&gt; &lt;span &gt;method&lt;/span&gt;&lt;span &gt;=&amp;quot;post&amp;quot;&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt; {% csrf_token %} &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre &gt;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;input&lt;/span&gt; &lt;span &gt;name&lt;/span&gt;&lt;span &gt;=&amp;quot;next&amp;quot;&lt;/span&gt; &lt;span &gt;type&lt;/span&gt;&lt;span &gt;=&amp;quot;hidden&amp;quot;&lt;/span&gt; &lt;span &gt;value&lt;/span&gt;&lt;span &gt;=&amp;quot;/next/page/&amp;quot;&lt;/span&gt; &lt;span &gt;/&amp;gt;&lt;/span&gt; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre &gt;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;select&lt;/span&gt; &lt;span &gt;name&lt;/span&gt;&lt;span &gt;=&amp;quot;language&amp;quot;&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt; {% for lang in LANGUAGES %} &lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;option&lt;/span&gt; &lt;span &gt;value&lt;/span&gt;&lt;span &gt;=&amp;quot;{{ lang.0 }}&amp;quot;&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;{{ lang.1 }}&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;option&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt; {% endfor %} &lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;select&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt; &lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;input&lt;/span&gt; &lt;span &gt;type&lt;/span&gt;&lt;span &gt;=&amp;quot;submit&amp;quot;&lt;/span&gt; &lt;span &gt;value&lt;/span&gt;&lt;span &gt;=&amp;quot;Go&amp;quot;&lt;/span&gt; &lt;span &gt;/&amp;gt;&lt;/span&gt; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre &gt;&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;form&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&#xD;
    &lt;pre &gt;&lt;span &gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;这里涉及一个问题，用户如此选择的语言是否能被记住，下次访问时无需再选？首先需要了解django如何确定用户需要的语言，其判断流程如此：&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;1. 首先判断Session里是否有键值为django_language的数据，如有则使用。（在用户选择语言时，如果网站支持Session，django把用户的语言偏好记录在Session中，否则记录在cookie里）&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;2. 检查cookie里是否有键值为settings.LANGUAGE_COOKIE_NAME的设置，如有则使用。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;3. 检查浏览器提供的Accpet Language(各个浏览器都有的配置：语言首选项）是否被网站支持（是否有相应的翻译文件），如支持则使用&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;4. 以上方式都不能确定时，使用settings.LANGUAGE_CODE(网站缺省语言）&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;注意这样的方式能确保根据用户浏览器设置来为用户自动选定语言，也能保证用户选择语言后当次访问使用所选语言(用户的语言选择保存在Session和一次有效的cookie中）。如果用户浏览器的设置和其选择的语言不一致时，用户下次访问就无法使用本次选择的语言。要解决这个问题，可以接管&amp;quot;/i18n/setlang/&amp;quot;这个URL的处理，把用户选择直接保存在cookie里，而且其生命周期要搞得长一些。如例：&lt;/p&gt;&#xD;
&#xD;
&lt;div id="codeSnippetWrapper"&gt;&#xD;
  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;def set_language(request): &lt;br /&gt;    from django.utils.translation &lt;span style="color: #0000ff"&gt;import&lt;/span&gt; check_for_language &lt;br /&gt;&lt;br /&gt;    next = request.REQUEST.get(&lt;span style="color: #006080"&gt;'next'&lt;/span&gt;, None) &lt;br /&gt;    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; not next: &lt;br /&gt;        next = request.META.get(&lt;span style="color: #006080"&gt;'HTTP_REFERER'&lt;/span&gt;, None) &lt;br /&gt;    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; not next: &lt;br /&gt;        next = &lt;span style="color: #006080"&gt;'/'&lt;/span&gt; &lt;br /&gt;    response = http.HttpResponseRedirect(next) &lt;br /&gt;    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; request.method == &lt;span style="color: #006080"&gt;'POST'&lt;/span&gt;: &lt;br /&gt;        lang_code = request.POST.get(&lt;span style="color: #006080"&gt;'language'&lt;/span&gt;, None) &lt;br /&gt;        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; lang_code and check_for_language(lang_code): &lt;br /&gt;            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; hasattr(request, &lt;span style="color: #006080"&gt;'session'&lt;/span&gt;): &lt;br /&gt;                request.session[&lt;span style="color: #006080"&gt;'django_language'&lt;/span&gt;] = lang_code &lt;br /&gt;            max_age =  60*60*24*365 &lt;br /&gt;            expires = datetime.datetime.strftime(datetime.datetime.utcnow() + datetime.timedelta(seconds=max_age), &lt;span style="color: #006080"&gt;&amp;quot;%a, %d-%b-%Y %H:%M:%S GMT&amp;quot;&lt;/span&gt;) &lt;br /&gt;            response.set_cookie(settings.LANGUAGE_COOKIE_NAME, lang_code, max_age, expires) &lt;br /&gt;    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; response&lt;/pre&gt;&#xD;
&#xD;
  &lt;br /&gt;&lt;/div&gt;&#xD;
最后，上述url配置改成这样: ：(r'^i18n/setlang', 'yourproject.yourapp.views.set_language'), &#xD;
&#xD;
&lt;p&gt;&lt;span style="display: none"&gt;&lt;span style="display: none"&gt;&amp;#160;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/itrust/aggbug/1748358.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/itrust/archive/2010/05/31/1748358.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/itrust/archive/2010/05/27/1745342.html</id><title type="text">不愁男女比例不协调</title><summary type="text">我说：哦，还得的再取消一个 早表情很严肃的说：是啊，如果选婷婷，乐乐会不高兴；如果选乐乐，婷婷会不高兴，不好办啊 果和早在不“结婚”以后，去书店看到早喜欢的奥特曼以，执意要买一本送给早，她妈妈问：你不是现在和李腾结婚了么，为什么不送给李腾呢？ 果说：我还是送给早早吧，他爸爸可能会高兴 多可爱的小姑娘，可惜了，必须取消到只留一个。 补充一句妞妞的经典语录：早早是很男很难的男生，为为是个小男孩。 难以...</summary><published>2010-05-27T06:03:00Z</published><updated>2010-05-27T06:03:00Z</updated><author><name>251</name><uri>http://www.cnblogs.com/itrust/</uri></author><link rel="alternate" href="http://www.cnblogs.com/itrust/archive/2010/05/27/1745342.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/itrust/archive/2010/05/27/1745342.html"/><content type="html">&lt;pre&gt;据专家说，在世界的人口大国中，中国是男女比例最悬殊的一个。根据中国政府于2000年进行的第五次全国人口普查，&lt;/pre&gt;&lt;pre&gt;全国出生人口性别比为117，即在出生的婴儿中，男女比率达到117：100，比正常值102至107高出很多。这个情况让很多&lt;/pre&gt;&lt;pre&gt;小男孩的家长比较紧张，有的甚至把竞争发展到了幼儿园，比如说我就大力支持儿子的女同学到我们家玩，还厚着脸皮给&lt;/pre&gt;&lt;pre&gt;他女同学的家长打电话问能不能让儿子去她们家玩，最无耻的时候一天打三个电话。幸好我们家儿子属于比较帅的那种，&lt;/pre&gt;&lt;pre&gt;性格也较为成熟，有点领导风范，在幼儿园里比较受小朋友喜欢，特别是扎小辫子的小姑娘。这个情况让我放心不少，昨&lt;/pre&gt;&lt;pre&gt;日更是被震撼了一把。&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre&gt;儿子昨日参加幼儿园六一节目表演，一家人围观演出录像时孩儿他妈指着画面说“看，这几只蝴蝶加白雪公主加王&lt;/pre&gt;&lt;pre&gt;后，就是他们班的全部女生，七个”。七个！只有七个！不对不对，怎么会呢？且慢，让我扳着指头算算，婷婷、乐乐、&lt;/pre&gt;&lt;pre&gt;果果、妞妞，天啦，总共七个小姑娘就有四个和他有瓜葛，人才！&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre&gt;刚去幼儿园没多久这小子发生点故事。婷婷和乐乐都要挨着他坐，而且互不相让，老师难以协调，最后的结果是我家&lt;/pre&gt;&lt;pre&gt;小子一边一个可爱的小姑娘，左婷右乐。当然随着他们的成长，班里分了组，婷乐和我家早因为年龄大一点成熟一点就被&lt;/pre&gt;&lt;pre&gt;分到不同的组里去，左婷右乐成为往事。一年以后，常发生早儿伤及妞妞的情况，经老师解释才知道，妞特别喜欢早，常&lt;/pre&gt;&lt;pre&gt;禁不住用手摸他的脸（注：零零后就是先进啊），早不喜欢，回收一拨，带伤了妞妞的脸，为此两个还调了座，分开较为&lt;/pre&gt;&lt;pre&gt;安全。前一段他们班流行“结婚”，小子应是把果果从李腾手里抢了过来，他和果果结了婚。李腾同学暗自神伤，不过这&lt;/pre&gt;&lt;pre&gt;个同学很执着，一直心志不改，默默等待，在果受欺负（有时是被早欺负）的时候，大演英雄救美的好戏，最后终于修成&lt;/pre&gt;&lt;pre&gt;正果，重新成为果的王子。&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre&gt;四个姑娘，四个故事，这一切五彩缤纷发生后，小子们姑娘们还不到五岁。纯真的年代，青梅和竹马，小子们姑娘们&lt;/pre&gt;&lt;pre&gt;用他们最真实，最可爱的童年留下有趣的轨迹，还有有趣的话语。&lt;/pre&gt;&lt;pre&gt;早打了妞，妞被问及疼不疼时说：&lt;u&gt;不疼，他就是打死我，我还是喜欢他&lt;/u&gt;&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre&gt;昨晚刷牙，早中途停顿，带着满嘴泡泡说：&lt;u&gt;现在，除了婷婷和乐乐，别人都取消了。哎呀，我究竟选哪一个呢？&lt;/u&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;我说：哦，还得的再取消一个&lt;/p&gt;&#xD;
&lt;p&gt;早表情很严肃的说：&lt;u&gt;是啊，如果选婷婷，乐乐会不高兴；如果选乐乐，婷婷会不高兴，不好办啊&lt;/u&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;u&gt;&lt;/u&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;果和早在不“结婚”以后，去书店看到早喜欢的奥特曼以，执意要买一本送给早，她妈妈问：你不是现在和李腾结婚&lt;/p&gt;&#xD;
&lt;p&gt;了么，为什么不送给李腾呢？ 果说：&lt;u&gt;我还是送给早早吧，他爸爸可能会高兴&lt;/u&gt;&lt;/p&gt;&#xD;
&lt;p&gt;多可爱的小姑娘，可惜了，必须取消到只留一个。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;补充一句妞妞的经典语录：&lt;u&gt;早早是很男很难的男生，为为是个小男孩。&lt;/u&gt; 难以想象吧，这个4岁姑娘的总结是如此精辟。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/itrust/aggbug/1745342.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/itrust/archive/2010/05/27/1745342.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/itrust/archive/2010/05/24/1742599.html</id><title type="text">Word文件如源码一样也可比较和合并</title><summary type="text">昨日无意中发现，原来Word文件也可以像我们合并源码文件一样被比较和合并，这就意味着Word文件的编辑也支持多人同时编辑，形成多个分支，然后将各个分支的修改合并到一个文件中去。虽然，没有源码合并那么强大，但也有极大的应用价值。合并的效果如何，请看例子： 烦请下载我的例子： Merge Word.rar 其中有两个版本，第二版做了修改、删除和添加内容的工作 打开其中的 V1 ，然后在菜单上选 &amp;ld...</summary><published>2010-05-24T03:14:00Z</published><updated>2010-05-24T03:14:00Z</updated><author><name>251</name><uri>http://www.cnblogs.com/itrust/</uri></author><link rel="alternate" href="http://www.cnblogs.com/itrust/archive/2010/05/24/1742599.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/itrust/archive/2010/05/24/1742599.html"/><content type="html">&lt;p&gt;昨日无意中发现，原来Word文件也可以像我们合并源码文件一样被比较和合并，这就意味着Word文件的编辑也支持多人同时编辑，形成多个分支，然后将各个分支的修改合并到一个文件中去。虽然，没有源码合并那么强大，但也有极大的应用价值。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;合并的效果如何，请看例子： &lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;烦请下载我的例子： &lt;a href="http://files.cnblogs.com/itrust/MergeWord.rar"&gt;Merge Word.rar&lt;/a&gt; 其中有两个版本，第二版做了修改、删除和添加内容的工作 &lt;/li&gt;&#xD;
&lt;li&gt;打开其中的 V1 ，然后在菜单上选 &amp;ldquo;工具&amp;rdquo;- &amp;ldquo;比较并合并文档&amp;rdquo;， 选择 V2， 将产生一个新的 V2，如图： &lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/itrust/WindowsLiveWriter/Word_9E02/MergeWord_2.png"&gt;&lt;img style="display: inline; border-width: 0px;" title="MergeWord" alt="MergeWord" src="http://images.cnblogs.com/cnblogs_com/itrust/WindowsLiveWriter/Word_9E02/MergeWord_thumb.png" width="634" border="0" height="256" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;接下来就是针对每一处修订，由你自己决定是接受还是拒绝，一旦存盘，合并完成 &lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;该测试在2003上通过，2007应更没有问题， WPS貌似没学这个。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/itrust/aggbug/1742599.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/itrust/archive/2010/05/24/1742599.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/itrust/archive/2010/05/14/1735185.html</id><title type="text">python 的字符编码和中文处理</title><summary type="text">字符串 python有两种字符串 byteString = "hello world! (in my default locale)" unicodeString = u"hello Unicode world!" 相互转换 1 s = "hello normal string"  2 u = unicode( s, "utf-8" )  3 backToBytes = u.encode( "ut...</summary><published>2010-05-14T02:03:00Z</published><updated>2010-05-14T02:03:00Z</updated><author><name>251</name><uri>http://www.cnblogs.com/itrust/</uri></author><link rel="alternate" href="http://www.cnblogs.com/itrust/archive/2010/05/14/1735185.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/itrust/archive/2010/05/14/1735185.html"/><content type="html">&lt;p&gt;&lt;strong&gt;字符串&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;python有两种字符串&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;byteString = "hello world! (in my default locale)"&lt;/p&gt; &lt;p&gt;unicodeString = u"hello Unicode world!"&lt;/p&gt; &lt;p&gt;&lt;strong&gt;相互转换&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;1 s = "hello normal string" &lt;/p&gt; &lt;p&gt;2 u = unicode( s, "utf-8" ) &lt;/p&gt; &lt;p&gt;3 backToBytes = u.encode( "utf-8" )&lt;/p&gt; &lt;p&gt;3 backToUtf8 = backToBytes.decode(‘utf-8’) #与第二行效果相同&lt;/p&gt; &lt;p&gt;&lt;strong&gt;如何判断&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;if isinstance( s, str ): # 对Unicode strings，这个判断结果为False&lt;/p&gt; &lt;p&gt;if isinstance( s, unicode): # 对Unicode strings，这个判断结果为True&lt;/p&gt; &lt;p&gt;if isinstance( s, basestring ): # 对两种字符串，返回都为True&lt;/p&gt; &lt;p&gt;&lt;strong&gt;做个试验&lt;/strong&gt;&lt;/p&gt; &lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;&lt;img id="Code_Closed_Image_619832" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_619832').style.display='none'; document.getElementById('Code_Open_Image_619832').style.display='inline'; document.getElementById('Code_Open_Text_619832').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" height="16"&gt;&lt;img style="display: none" id="Code_Open_Image_619832" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_619832').style.display='none'; getElementById('Code_Closed_Image_619832').style.display='inline'; getElementById('Code_Closed_Text_619832').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" height="16"&gt;&lt;span id="Code_Closed_Text_619832" &gt;样例&lt;/span&gt;&lt;span style="display: none" id="Code_Open_Text_619832"&gt;&lt;span style="color: #0000ff"&gt;import&lt;/span&gt; &lt;span style="color: #0000ff"&gt;sys&lt;/span&gt; &#xD;
&#xD;
&lt;span style="color: #0000ff"&gt;print&lt;/span&gt; 'default encoding: ' , &lt;span style="color: #0000ff"&gt;sys&lt;/span&gt;.&lt;span style="color: #0000ff"&gt;getdefaultencoding&lt;/span&gt;()&#xD;
&lt;span style="color: #0000ff"&gt;print&lt;/span&gt; 'file system encoding: ' , &lt;span style="color: #0000ff"&gt;sys&lt;/span&gt;.getfilesystemencoding()&#xD;
&lt;span style="color: #0000ff"&gt;print&lt;/span&gt; '&lt;span style="color: #0000ff"&gt;stdout&lt;/span&gt; encoding: ' , &lt;span style="color: #0000ff"&gt;sys&lt;/span&gt;.&lt;span style="color: #0000ff"&gt;stdout&lt;/span&gt;.encoding&#xD;
&lt;span style="color: #0000ff"&gt;print&lt;/span&gt; u'u"&lt;span style="color: #8b0000"&gt;中文&lt;/span&gt;" is unicode: ', isinstance(u'中文',unicode)&#xD;
&lt;span style="color: #0000ff"&gt;print&lt;/span&gt; u'"&lt;span style="color: #8b0000"&gt;中文&lt;/span&gt;" is unicode: ', isinstance('中文',unicode) &lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&lt;/span&gt;&#xD;
&lt;p&gt;看输出结果，注意下列事实： &#xD;
&lt;p&gt;python系统缺省的编码格式为ASCII，这个缺省编码在Python转换字符串时用的到，这里给两个例子：&lt;/p&gt;&#xD;
&lt;p&gt;1. a = "abc" + u"bcd", Python会如此转换"abc".decode(sys.getdefaultencoding()) 然后将两个Unicode字符合并。&lt;/p&gt;&#xD;
&lt;p&gt;2. print unicode('中文') , 这句话执行会出错“UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 …”，是因为Python试图用缺省编码来编码，而这个字符串不是ASCII，因此需要显示的指出，如果你的文件源类型为utf-8，则应如此：print unicode('中文','utf-8’)&lt;/p&gt;&#xD;
&lt;p&gt;Windows下getfilesystemencoding输出mbcs（多字节编码，windows的mbcs，也就是ansi，它会在不同语言的windows中使用不同的编码，在中文的windows中就是gb系列的编码)&lt;/p&gt;&#xD;
&lt;p&gt;Windows下控制台编码为cp936, 当你打印东西到控制台时Python自动做了转换。这里会引发一个有趣的问题, 试一下这个简单的例子test.py：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;&lt;img id="Code_Closed_Image_744974" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_744974').style.display='none'; document.getElementById('Code_Open_Image_744974').style.display='inline'; document.getElementById('Code_Open_Text_744974').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" height="16"&gt;&lt;img style="display: none" id="Code_Open_Image_744974" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_744974').style.display='none'; getElementById('Code_Closed_Image_744974').style.display='inline'; getElementById('Code_Closed_Text_744974').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" height="16"&gt;&lt;span id="Code_Closed_Text_744974" &gt;样例&lt;/span&gt;&lt;span style="display: none" id="Code_Open_Text_744974"&gt;# -*- coding: utf-8 -*-&#xD;
s = u'中文'&#xD;
&lt;span style="color: #0000ff"&gt;print&lt;/span&gt; s&lt;/pre&gt;&lt;/div&gt;&lt;span style="display: none" id="Code_Open_Text_744974"&gt;&lt;/span&gt;&lt;p&gt;在控制台中分别运行 python test.py 和 python test.py &amp;gt; 1.txt&lt;/p&gt;&lt;p&gt;你会发现后者会报错，原因是打印控制台时Python会自动转换编码到sys.stdout.encoding, 而输出到文件时Python不会自动在write调用中进行内部字符转换。这个问题在&lt;a href="http://wiki.python.org/moin/PrintFails"&gt;PrintFails&lt;/a&gt;中有较详细的说明。&lt;/p&gt;&lt;/span&gt;&#xD;
&lt;p&gt;&lt;strong&gt;UTF-8编码格式&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;保存utf-8格式的文件 &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;import codecs &lt;/p&gt;&#xD;
&lt;p&gt;fileObj = codecs.open( "someFile", "r", "utf-8" ) &lt;/p&gt;&#xD;
&lt;p&gt;u = fileObj.read() # Returns a Unicode string from the UTF-8 bytes in the file&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;自己写BOM头&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;out = file( "someFile", "w" ) &lt;/p&gt;&#xD;
&lt;p&gt;out.write( codecs.BOM_UTF8 ) &lt;/p&gt;&#xD;
&lt;p&gt;out.write( unicodeString.encode( "utf-8" ) ) &lt;/p&gt;&#xD;
&lt;p&gt;out.close()&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;自己去掉BOM头&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;对UTF-16, Python将BOM解码为空字串。然而对UTF-8, BOM被解码为一个字符，如例：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;&lt;img id="Code_Closed_Image_186475" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_186475').style.display='none'; document.getElementById('Code_Open_Image_186475').style.display='inline'; document.getElementById('Code_Open_Text_186475').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" height="16"&gt;&lt;img style="display: none" id="Code_Open_Image_186475" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_186475').style.display='none'; getElementById('Code_Closed_Image_186475').style.display='inline'; getElementById('Code_Closed_Text_186475').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" height="16"&gt;&lt;span id="Code_Closed_Text_186475" &gt;样例&lt;/span&gt;&lt;span style="display: none" id="Code_Open_Text_186475"&gt;&#xD;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; codecs.BOM_UTF16.decode( "utf16" ) &lt;/p&gt;&#xD;
&lt;p&gt;u'' &lt;/p&gt;&#xD;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; codecs.BOM_UTF8.decode( "utf8" ) &lt;/p&gt;&#xD;
&lt;p&gt;u'\ufeff'&lt;/p&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&lt;/span&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;不知道为什么会这样不同，因此你需要在读文件时自己去掉BOM： &lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;&lt;img id="Code_Closed_Image_928961" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_928961').style.display='none'; document.getElementById('Code_Open_Image_928961').style.display='inline'; document.getElementById('Code_Open_Text_928961').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" height="16"&gt;&lt;img style="display: none" id="Code_Open_Image_928961" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_928961').style.display='none'; getElementById('Code_Closed_Image_928961').style.display='inline'; getElementById('Code_Closed_Text_928961').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" height="16"&gt;&lt;span id="Code_Closed_Text_928961" &gt;去掉BOM&lt;/span&gt;&lt;span style="display: none" id="Code_Open_Text_928961"&gt;&lt;span style="color: #0000ff"&gt;import&lt;/span&gt; codecs&#xD;
&lt;span style="color: #0000ff"&gt;if&lt;/span&gt; s.beginswith( codecs.BOM_UTF8 ):&#xD;
	# The byte &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; s begins with the BOM: Do something.&#xD;
	# For example, &lt;span style="color: #0000ff"&gt;decode&lt;/span&gt; the &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; as UTF-8&#xD;
	&#xD;
&lt;span style="color: #0000ff"&gt;if&lt;/span&gt; u[0] == unicode( codecs.BOM_UTF8, "&lt;span style="color: #8b0000"&gt;utf8&lt;/span&gt;" ):&#xD;
	# The unicode &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; begins with the BOM: Do something.&#xD;
	# For example, remove the character.&#xD;
&#xD;
# Strip the BOM from the beginning of the Unicode &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; it exists&#xD;
u.&lt;span style="color: #0000ff"&gt;lstrip&lt;/span&gt;( unicode( codecs.BOM_UTF8, "&lt;span style="color: #8b0000"&gt;utf8&lt;/span&gt;" ) )&lt;/span&gt; &lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;源码文件的编码&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;关于Python对代码文件的编码处理，&lt;a href="http://www.python.org/dev/peps/pep-0263/"&gt;PEP0263&lt;/a&gt; 讲的很清楚，现摘录如下&lt;/p&gt;&#xD;
&lt;p&gt;python缺省认为文件为ASCII编码。&lt;/p&gt;&#xD;
&lt;p&gt;可在代码头一行或二行加入声明文件编码申明，通知python该文件的编码格式，如 &lt;/p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # -*- coding: utf-8 –*-&amp;nbsp;&amp;nbsp; # 注意使用的编辑器，确保文件保存时使用了该编码格式 &#xD;
&lt;ol&gt;&#xD;
&lt;li&gt;对于Windows这样的平台，它使用了BOM（文件头三个字节 \xef\xbb\xbf）来申明文件为utf-8编码，这种情况下： &lt;/li&gt;&lt;/ol&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;如果文件中没有编码申明，python以utf8处理 &#xD;
&lt;li&gt;如果有编码申明但不是utf-8, python报错 &lt;/li&gt;&lt;/ul&gt;&lt;img src="http://www.cnblogs.com/itrust/aggbug/1735185.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/itrust/archive/2010/05/14/1735185.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/itrust/archive/2010/05/13/1734780.html</id><title type="text">djang 测试心得</title><summary type="text">突破test.py，弄个目录放测试案例 总所周知，django支持放在models.py中的doctest和tests.py，他们都要放在项目目录下。如果为了测试model, 使用doctest让测试挨着model的定义，而且也可方便得到文档，这可接受。但是tests.py放所有的测试案例严重不符合我的习惯，我喜欢把所有测试案例集中放在一个专门的目录中，而且一个文件一个TestCase。因此，考虑...</summary><published>2010-05-13T10:08:00Z</published><updated>2010-05-13T10:08:00Z</updated><author><name>251</name><uri>http://www.cnblogs.com/itrust/</uri></author><link rel="alternate" href="http://www.cnblogs.com/itrust/archive/2010/05/13/1734780.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/itrust/archive/2010/05/13/1734780.html"/><content type="html">&lt;p&gt;&lt;strong&gt;突破test.py，弄个目录放测试案例&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;总所周知，django支持放在models.py中的doctest和tests.py，他们都要放在项目目录下。如果为了测试model, 使用doctest让测试挨着model的定义，而且也可方便得到文档，这可接受。但是tests.py放所有的测试案例严重不符合我的习惯，我喜欢把所有测试案例集中放在一个专门的目录中，而且一个文件一个TestCase。因此，考虑用suite()做一点工作，写一个tests.py：&lt;/p&gt; &lt;div&gt;&lt;pre&gt;"&lt;span style="color: #8b0000"&gt;&amp;nbsp;&lt;/span&gt;""&#xD;
Build test suite with test cases under the folder mytests&#xD;
&#xD;
How to orgnize your tests cases:&#xD;
    * put them in the folder mytests&#xD;
    * &lt;span style="color: #0000ff"&gt;name&lt;/span&gt; py file as *test.py, case-sensitivity ignored, eg. clientTest.py &#xD;
"&lt;span style="color: #8b0000"&gt;&lt;/span&gt;""&#xD;
__author__ = 'zhangtao.it@gmail.com'&#xD;
&#xD;
&lt;span style="color: #0000ff"&gt;import&lt;/span&gt; unittest,&lt;span style="color: #0000ff"&gt;os&lt;/span&gt;,&lt;span style="color: #0000ff"&gt;re&lt;/span&gt;&#xD;
&#xD;
TESTS = 'mytests'&#xD;
&#xD;
&lt;span style="color: #0000ff"&gt;def&lt;/span&gt; suite():&#xD;
    app_path = __name__.&lt;span style="color: #0000ff"&gt;split&lt;/span&gt;('.')[:-1]&#xD;
    app_path.append(TESTS)&#xD;
&#xD;
    &lt;span style="color: #0000ff"&gt;path&lt;/span&gt; = &lt;span style="color: #0000ff"&gt;os&lt;/span&gt;.&lt;span style="color: #0000ff"&gt;path&lt;/span&gt;.abspath(&lt;span style="color: #0000ff"&gt;os&lt;/span&gt;.&lt;span style="color: #0000ff"&gt;path&lt;/span&gt;.dirname(__file__))   &#xD;
    &lt;span style="color: #0000ff"&gt;path&lt;/span&gt; = &lt;span style="color: #0000ff"&gt;os&lt;/span&gt;.&lt;span style="color: #0000ff"&gt;path&lt;/span&gt;.&lt;span style="color: #0000ff"&gt;join&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;path&lt;/span&gt;, TESTS)&#xD;
&#xD;
    files = &lt;span style="color: #0000ff"&gt;os&lt;/span&gt;.listdir(&lt;span style="color: #0000ff"&gt;path&lt;/span&gt;)                               &#xD;
    test = &lt;span style="color: #0000ff"&gt;re&lt;/span&gt;.compile("&lt;span style="color: #8b0000"&gt;test\.py$&lt;/span&gt;", &lt;span style="color: #0000ff"&gt;re&lt;/span&gt;.IGNORECASE)          &#xD;
    files = filter(test.&lt;span style="color: #0000ff"&gt;search&lt;/span&gt;, files)   &#xD;
&#xD;
    #note: for importing, &lt;span style="color: #0000ff"&gt;module&lt;/span&gt; &lt;span style="color: #0000ff"&gt;name&lt;/span&gt; must contain the full&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这就是我的tests.py, 把他放到app目录中，然后:&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;app目录中建一个目录mytests, 用来放你的测试案例。记得搞一个空的__init__.py &#xD;
&lt;li&gt;注意所有测试案例py文件命名为*test.py, 处理是忽略大小写。 &lt;/li&gt;&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;strong&gt;如何准备测试数据&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;django测试是会生成专门一个测试数据库， 但里面没有数据，django自定义的TestCase提供了方法&lt;strong&gt;fixtures&lt;/strong&gt;来加载测试数据到数据库。&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;使用manage.py dumpdata 把正式数据库的数据导出来，保存在json文件中（如user.json），放在APP下fixtures目录里，如例&lt;/li&gt;&lt;/ul&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;python manage.py&amp;nbsp; dumpdata auth.user --format json &amp;gt; yourappname/fixtures/user.json&lt;/p&gt;&lt;/blockquote&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;如此写测试案例，django会在setUp之后加载fixtures，把数据填充到数据库。当然，你也可自己编写json文件喂给它。&lt;/li&gt;&lt;/ul&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;&lt;img id="Code_Closed_Image_577819" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_577819').style.display='none'; document.getElementById('Code_Open_Image_577819').style.display='inline'; document.getElementById('Code_Open_Text_577819').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" height="16"&gt;&lt;img style="display: none" id="Code_Open_Image_577819" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_577819').style.display='none'; getElementById('Code_Closed_Image_577819').style.display='inline'; getElementById('Code_Closed_Text_577819').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" height="16"&gt;&lt;span id="Code_Closed_Text_577819" &gt;测试案例&lt;/span&gt;&lt;span style="display: none" id="Code_Open_Text_577819"&gt;from django.test &lt;span style="color: #0000ff"&gt;import&lt;/span&gt; TestCase,Client &#xD;
&#xD;
&lt;span style="color: #0000ff"&gt;class&lt;/span&gt; DjangoTestCase(TestCase):&#xD;
    fixtures = ['&lt;span style="color: #0000ff"&gt;user&lt;/span&gt;.json'] &#xD;
&#xD;
    &lt;span style="color: #0000ff"&gt;def&lt;/span&gt; setUp(self):&#xD;
        pass &#xD;
&#xD;
    &lt;span style="color: #0000ff"&gt;def&lt;/span&gt; test_Login(self):&#xD;
        c = Client()&#xD;
        self.assertTrue(c.login(username='root',password='root'))&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&lt;/span&gt;&lt;img src="http://www.cnblogs.com/itrust/aggbug/1734780.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/itrust/archive/2010/05/13/1734780.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/itrust/archive/2010/05/13/1734143.html</id><title type="text">my django development environment (virtualenv+pip+django)</title><summary type="text">Steps download and install Python download and install setuptool, please choose right setuptool version which matches python version make a virtualenv &amp;gt; virtualenv yourenvname install pip &amp;gt; easy...</summary><published>2010-05-12T16:11:00Z</published><updated>2010-05-12T16:11:00Z</updated><author><name>251</name><uri>http://www.cnblogs.com/itrust/</uri></author><link rel="alternate" href="http://www.cnblogs.com/itrust/archive/2010/05/13/1734143.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/itrust/archive/2010/05/13/1734143.html"/><content type="html">&lt;p&gt;&lt;strong&gt;Steps&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;download and install Python &lt;/li&gt;    &lt;li&gt;download and install &lt;a href="http://pypi.python.org/pypi/setuptools"&gt;setuptool&lt;/a&gt;, please choose right setuptool version which matches python version &lt;/li&gt;    &lt;li&gt;make a virtualenv      &lt;ul&gt;       &lt;li&gt;&amp;gt; virtualenv yourenvname &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;install pip      &lt;ul&gt;       &lt;li&gt;&amp;gt; easy_install pip &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;make a requirement file, a file indicates packages required by your virtual environment, save it to requirement.txt and put it in directory yourenvname &lt;/li&gt; &lt;/ul&gt;  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;   &lt;p&gt;django-pagination      &lt;br /&gt;django-registration       &lt;br /&gt;Django       &lt;br /&gt;&lt;a href="http://south.aeracode.org/docs/tutorial/part1.html#starting-off"&gt;South&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;flup&lt;/p&gt; &lt;/blockquote&gt;  &lt;ul&gt;   &lt;li&gt;install packages required      &lt;ul&gt;       &lt;li&gt;yourenvname&amp;gt; pip install –r requirement.txt &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;start your django project and django application      &lt;ul&gt;       &lt;li&gt;yourenvname&amp;gt; django-admin.py startproject yourprojectname &lt;/li&gt;        &lt;li&gt;yourprojectname&amp;gt; django-admin.py mange.py yourappname &lt;/li&gt;        &lt;li&gt;yourprojectname&amp;gt;python mange.py syncdb &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Trouble Shooting&lt;/strong&gt;&lt;/p&gt;  &lt;table style="width: 744px" border="0" cellspacing="0" cellpadding="2"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="192"&gt;&lt;strong&gt;Action&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="249"&gt;&lt;strong&gt;Error&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="301"&gt;&lt;strong&gt;Solution&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="192"&gt;run django-admin.py&lt;/td&gt;        &lt;td valign="top" width="249"&gt;Type 'django-admin.py help' for usage&lt;/td&gt;        &lt;td valign="top" width="301"&gt;Modify registry of file association:          &lt;br /&gt;&amp;quot;C:\Python25\python.exe&amp;quot; &amp;quot;%1&amp;quot; %*&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="192"&gt;&amp;#160;&lt;/td&gt;        &lt;td valign="top" width="249"&gt;&amp;#160;&lt;/td&gt;        &lt;td valign="top" width="301"&gt;&amp;#160;&lt;/td&gt;        &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;        &lt;p&gt;&amp;lt;&amp;gt;&amp;lt;/&amp;gt;&lt;/p&gt;     &lt;/tr&gt;      &lt;tr&gt;&lt;/tr&gt;   &lt;/tbody&gt;&lt;tbody&gt;&lt;/tbody&gt;&lt;/table&gt;  &lt;table&gt;&lt;tbody&gt;&lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Package List&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Previously, some packages I recommend are listed in requirement file. Forget about my recommendation, you can have any package you want in it. Here is description for some package.&lt;/p&gt;  &lt;table style="width: 877px" border="0" cellspacing="0" cellpadding="2"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="200"&gt;&lt;strong&gt;Name&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="675"&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;django-registration&lt;/td&gt;        &lt;td valign="top" width="675"&gt;         &lt;p&gt;This application enables a common user-registration workflow: registration with a email&lt;/p&gt;          &lt;p&gt;Various methods of extending and customizing the registration process are also provided.&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;django-pagination&lt;/td&gt;        &lt;td valign="top" width="675"&gt;A set of utilities for creating robust pagination tools throughout a django application.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;South&lt;/td&gt;        &lt;td valign="top" width="675"&gt;South, likes migration of Ruby on Rails, is a tool to provide consistent, easy-to-use and database-agnostic migrations for Django applications.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="200"&gt;flup&lt;/td&gt;        &lt;td valign="top" width="675"&gt;Make your django web site support FastCGI, SCGI and AJP and work with nginx, apache and lighttpd&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;  &lt;table style="width: 744px" border="0" cellspacing="0" cellpadding="2"&gt;&lt;tbody&gt;     &lt;tr&gt;&lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;&lt;img src="http://www.cnblogs.com/itrust/aggbug/1734143.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/itrust/archive/2010/05/13/1734143.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/itrust/archive/2010/05/12/1733797.html</id><title type="text">nginx+fastcgi+django实践笔记</title><summary type="text">先看配置： server {  listen 80;  server_name localhost;  access_log logs/access.log main;  error_log logs/error.log warn;  location / {  fastcgi_pass 127.0.0.1:3033;  include fastcgi_django.conf;  }  locat...</summary><published>2010-05-12T08:14:00Z</published><updated>2010-05-12T08:14:00Z</updated><author><name>251</name><uri>http://www.cnblogs.com/itrust/</uri></author><link rel="alternate" href="http://www.cnblogs.com/itrust/archive/2010/05/12/1733797.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/itrust/archive/2010/05/12/1733797.html"/><content type="html">&lt;p&gt;先看配置：&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;server { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; listen&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 80; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; server_name&amp;nbsp; localhost; &lt;/p&gt;&#xD;
&lt;p&gt;access_log&amp;nbsp; logs/access.log&amp;nbsp; main; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; error_log logs/error.log warn; &lt;/p&gt;&#xD;
&lt;p&gt;location / { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fastcgi_pass 127.0.0.1:3033; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; include fastcgi_django.conf; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/p&gt;&#xD;
&lt;p&gt;location ^~ /media { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alias D:/Studio/gtca/gtdevice/media; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; access_log&amp;nbsp;&amp;nbsp; off; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; location ^~ /media/admin { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alias D:\Studio\gtca\Lib\site-packages\django\contrib\admin\media; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; access_log&amp;nbsp;&amp;nbsp; off; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/p&gt;&#xD;
&lt;p&gt;location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|mov)&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root D:/Studio/gtca/gtdevice/media/; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; access_log&amp;nbsp;&amp;nbsp; off; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; expires&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 30d; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;其中fastcgi_django.conf为：&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;fastcgi_param&amp;nbsp; SCRIPT_FILENAME&amp;nbsp;&amp;nbsp;&amp;nbsp; $document_root$fastcgi_script_name; &lt;br /&gt;fastcgi_param&amp;nbsp; QUERY_STRING&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $query_string; &lt;br /&gt;fastcgi_param&amp;nbsp; REQUEST_METHOD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $request_method; &lt;br /&gt;fastcgi_param&amp;nbsp; CONTENT_TYPE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $content_type; &lt;br /&gt;fastcgi_param&amp;nbsp; CONTENT_LENGTH&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $content_length; &lt;/p&gt;&#xD;
&lt;p&gt;fastcgi_param&amp;nbsp; REQUEST_URI&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $request_uri; &lt;br /&gt;fastcgi_param&amp;nbsp; DOCUMENT_URI&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $document_uri; &lt;br /&gt;fastcgi_param&amp;nbsp; DOCUMENT_ROOT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $document_root; &lt;br /&gt;fastcgi_param&amp;nbsp; SERVER_PROTOCOL&amp;nbsp;&amp;nbsp;&amp;nbsp; $server_protocol; &lt;/p&gt;&#xD;
&lt;p&gt;fastcgi_param&amp;nbsp; GATEWAY_INTERFACE&amp;nbsp; CGI/1.1; &lt;br /&gt;fastcgi_param&amp;nbsp; SERVER_SOFTWARE&amp;nbsp;&amp;nbsp;&amp;nbsp; nginx/$nginx_version; &lt;/p&gt;&#xD;
&lt;p&gt;fastcgi_param&amp;nbsp; REMOTE_ADDR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $remote_addr; &lt;br /&gt;fastcgi_param&amp;nbsp; REMOTE_PORT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $remote_port; &lt;br /&gt;fastcgi_param&amp;nbsp; SERVER_ADDR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $server_addr; &lt;br /&gt;fastcgi_param&amp;nbsp; SERVER_PORT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $server_port; &lt;br /&gt;fastcgi_param&amp;nbsp; SERVER_NAME&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $server_name;&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;&lt;strong&gt;注意两个问题（经验教训）：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;关闭nginx一定要用 &lt;strong&gt;nginx&amp;nbsp; -s quit&lt;/strong&gt;，不要只关那个cmd shell，nginx还开了一个工作进程（如果使用缺省配置worker_processes&amp;nbsp; 1; 看进程有两个nginx在运行）。我开始没注意这个，配置又不熟，改了半天没成功，原来发现是工作进程没关导致的。&lt;/li&gt;&#xD;
&lt;li&gt;传给django的参数不要有fastcgi.conf里带的那个SCRIPT_NAME。django使用&lt;code&gt;PATH_INFO&lt;/code&gt;来匹配urlpatterns。如果&lt;code&gt;PATH_INFO&lt;/code&gt;和SCRIPT_NAME都被设置为&lt;code&gt;$fastcgi_script_name&lt;/code&gt;, django会给所有的请求都搞一个空字串。我的网站需要先认证再一个next跳转，一直不工作，就是因为这个原因。&lt;/li&gt;&#xD;
&lt;li&gt;注意上述的配置中，自己网站的media和django的media都配置了，让nginx来直接返回给客户端，是因为django不管静态文件。&lt;/li&gt;&#xD;
&lt;/ul&gt;&lt;img src="http://www.cnblogs.com/itrust/aggbug/1733797.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/itrust/archive/2010/05/12/1733797.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/itrust/archive/2010/05/12/1733760.html</id><title type="text">django 开发 - 小心模板文件的编码格式(utf-8)</title><summary type="text">遇到一个很神的问题，网站中有一页的样式总是不正确（整体内容偏下），历经千辛万苦才发现是由于模板文件的编码引起的。原来没注意这个问题，所有模板文件都保存为ANSI编码，这个单单鬼使神差的存成了UTF-8，而且其中有中文，因此导致这个问题。很具体的原因没想明白。吸取教训： django 缺省认为他处理的字符串和文件都是 utf-8, 因此如果你的模板文件不是utf-8, 你可设置FILE_CHARSE...</summary><published>2010-05-12T07:45:00Z</published><updated>2010-05-12T07:45:00Z</updated><author><name>251</name><uri>http://www.cnblogs.com/itrust/</uri></author><link rel="alternate" href="http://www.cnblogs.com/itrust/archive/2010/05/12/1733760.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/itrust/archive/2010/05/12/1733760.html"/><content type="html">&lt;p&gt;遇到一个很神的问题，网站中有一页的样式总是不正确（整体内容偏下），历经千辛万苦才发现是由于模板文件的编码引起的。&lt;/p&gt;&#xD;
&lt;p&gt;原来没注意这个问题，所有模板文件都保存为ANSI编码，这个单单鬼使神差的存成了UTF-8，而且其中有中文，因此导致这个问题。很具体的原因没想明白。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;&lt;strong&gt;吸取教训：&lt;/strong&gt;&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;django 缺省认为他处理的&lt;span style="font-family: Courier New;"&gt;字符串和文件都&lt;/span&gt;是 utf-8, 因此如果你的模板文件不是&lt;span style="font-family: Courier New;"&gt;utf-8, 你可设置&lt;a href="http://docs.djangoproject.com/en/dev/ref/settings/#setting-FILE_CHARSET"&gt;&lt;tt&gt;FILE_CHARSET&lt;/tt&gt;&lt;/a&gt;让django加载磁盘文件时先做转换。当然，这个方法用于东西太多尾大难掉的时候，否则用&lt;span style="font-family: Courier New;"&gt;utf-8&lt;/span&gt;保存你的模板吧，会少一些烦恼，也加快点django处理的速度。另外一个好习惯，源代码也用&lt;span style="font-family: Courier New;"&gt;utf-8保存。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/itrust/aggbug/1733760.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/itrust/archive/2010/05/12/1733760.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
