<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Behind the Code &#187; python</title>
	<atom:link href="http://yinwm.com/tag/python/feed/" rel="self" type="application/rss+xml" />
	<link>http://yinwm.com</link>
	<description>Just Do It</description>
	<lastBuildDate>Wed, 04 Jan 2012 03:54:33 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>JazzMeme，一个新的新浪微薄客户端，开篇</title>
		<link>http://yinwm.com/2010/11/jazzmeme-0/</link>
		<comments>http://yinwm.com/2010/11/jazzmeme-0/#comments</comments>
		<pubDate>Mon, 01 Nov 2010 15:14:24 +0000</pubDate>
		<dc:creator>yinwm</dc:creator>
				<category><![CDATA[JazzMeme]]></category>
		<category><![CDATA[程序设计]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://yinwm.com/?p=229</guid>
		<description><![CDATA[因为公司工作的原因，需要研究一下新浪微薄的开放平台。与其做一个孤没芳还自赏的闷葫芦，不如把整个的过程记录下来分享给大家。 小弟自以为还会写点程序，故恬不知耻的把整个的思考过程、代码、遇到的一些问题及解决过程一一记录下来，希望能够对广大在IT这个道上混的朋友有些许的作用，我也就算没祸害人类。 在项目什么都还没有的时候，我先感谢一下我亲爱的女朋友萌萌，是她一直支持我，才让我在程序这条倒了霉的不归路上继续傻了吧唧的走下去。 从现在开始，我会记录下这个的整个过程，当然今天当我有这个想法的时候，我并没有一行代码，也没有明确的产品想法。所以这个过程不但各位读者不知道会怎么样，就连我也不知道。而产品的形态，则很可能是根据各位用户（也许悲催的一个用户也咩有）的需求、要求不断的变化和进化。就让我们在程序开发上也体验一次美剧编导的感觉吧。 me@yinwm.com:~$ 如何开始？ 一切的一切都需要从一个新注册的新浪微薄应用开始，你可以去 http://open.t.sina.com.cn 转一圈，不管是文档什么的，还是怎么注册，那有比较清楚的介绍，我就不费口舌了。 me@yinwm.com:~$ 选择一门开发语言 我们在开发一个东西的时候，很现实的问题就是选择（一门）开发语言。 相信有一类程序员是不会为此犯难的，那就是锤子党（我编的这个词）。锤子党的一个特点就是会了一种语言，然后看到任何需要开发的应用都是钉子，然后这个语言就可以大而全的搞定它。比如认为Java无所不能（虽然我身为一个Javaer，但是这样的Java程序员我见过不少）；或者觉得什么都要用先进的RoR来开发。 在这里我不想勾起无畏的超过我智商的语言论战，我只是想说一下我的看法。语言，只是一个工具，目的应该是满足我们的需求，而不是为了某种莫名的原因去选择什么。那么我选择语言的准则是两个字：合适。尺有所短寸有所长，不同的需求和场景需要不同的语言。 我从这几个方面考虑为什么选用一门语言： 开发者对语言掌握的熟练程度 现有的开发者 如果是团队作战则也需要考虑可招聘的人才市场的供给，比如相对PHP程序员，Python程序员的可选择范围会小很多。 产品需求的侧重点 是要求大规模计算的还是尽快的产品迭代的，等 需要运行的平台 是Web应用还是桌面应用 操作系统，Windows/Linux/Mac 一个还是多个 设备，比如 Android 或者 iPhone 就别想了，直接用 Java 跟 Object-C 就好了 已有的资源 是否有现成的（开源）库，如做搜索类的东西，那么 Lucene 就是天然的选择 是否有活跃的社区 当然在这里我可能无法全部的罗列出我思考的元素，但是总而言之，我认为语言应该是工具。技术应该为需求服务。当然，如果你只会一种语言，那么可能就没有办法了，但是我对你的建议就是再去学习一门语言吧，不同语言的不同思考方式，会让你对编程有更多的理解。 好了，该说我选择的语言了。我选择的是 Python 。原因是Python便于快速迭代；社区提供的资源足够多；国内Python社区发展良好；暂时定位在桌面应用，但是如果迁移到Web应用Python也可以应付的来。暂时妥协的是，Python很难迁移到 Android/iPhone 平台（也许我并不知道），但是暂时就不管了（会有一些其他的考虑，后续的篇章会提到）。 me@yinwm.com:~$ 给自己的应用起一个名字 一个好的名字是非常重要的，不过有时候信手捏来的也是不错的。在晚上回家坐公交车的时候，我想到其实这个项目就是某种意义上的 Twitter 客户端。 Twitter表示的就是小鸟的 JiZha （叽叽喳喳）-&#62; JiZa 会不会更好 -&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>因为公司工作的原因，需要研究一下新浪微薄的开放平台。与其做一个孤没芳还自赏的闷葫芦，不如把整个的过程记录下来分享给大家。<br />
小弟自以为还会写点程序，故恬不知耻的把整个的思考过程、代码、遇到的一些问题及解决过程一一记录下来，希望能够对广大在IT这个道上混的朋友有些许的作用，我也就算没祸害人类。</p>
<p>在项目什么都还没有的时候，我先感谢一下我亲爱的女朋友萌萌，是她一直支持我，才让我在程序这条倒了霉的不归路上继续傻了吧唧的走下去。</p>
<p>从现在开始，我会记录下这个的整个过程，当然今天当我有这个想法的时候，我并没有一行代码，也没有明确的产品想法。所以这个过程不但各位读者不知道会怎么样，就连我也不知道。而产品的形态，则很可能是根据各位用户（也许悲催的一个用户也咩有）的需求、要求不断的变化和进化。就让我们在程序开发上也体验一次美剧编导的感觉吧。</p>
<h3>me@yinwm.com:~$ 如何开始？</h3>
<p>一切的一切都需要从一个新注册的新浪微薄应用开始，你可以去 <a href="http://open.t.sina.com.cn" target="_blank">http://open.t.sina.com.cn</a> 转一圈，不管是文档什么的，还是怎么注册，那有比较清楚的介绍，我就不费口舌了。</p>
<h3>me@yinwm.com:~$ 选择一门开发语言</h3>
<p>我们在开发一个东西的时候，很现实的问题就是选择（一门）开发语言。</p>
<p>相信有一类程序员是不会为此犯难的，那就是锤子党（我编的这个词）。锤子党的一个特点就是会了一种语言，然后看到任何需要开发的应用都是钉子，然后这个语言就可以大而全的搞定它。比如认为Java无所不能（虽然我身为一个Javaer，但是这样的Java程序员我见过不少）；或者觉得什么都要用先进的RoR来开发。</p>
<p>在这里我不想勾起无畏的超过我智商的语言论战，我只是想说一下我的看法。语言，只是一个工具，目的应该是满足我们的需求，而不是为了某种莫名的原因去选择什么。那么我选择语言的准则是两个字：<span style="color: #0000ff;"><strong>合适</strong></span>。尺有所短寸有所长，不同的需求和场景需要不同的语言。</p>
<p>我从这几个方面考虑为什么选用一门语言：</p>
<ul>
<li>开发者对语言掌握的熟练程度
<ul>
<li>现有的开发者</li>
<li>如果是团队作战则也需要考虑可招聘的人才市场的供给，比如相对PHP程序员，Python程序员的可选择范围会小很多。</li>
</ul>
</li>
<li>产品需求的侧重点
<ul>
<li>是要求大规模计算的还是尽快的产品迭代的，等</li>
</ul>
</li>
<li>需要运行的平台
<ul>
<li>是Web应用还是桌面应用</li>
<li>操作系统，Windows/Linux/Mac 一个还是多个</li>
<li>设备，比如 Android 或者 iPhone 就别想了，直接用 Java 跟 Object-C 就好了</li>
</ul>
</li>
<li>已有的资源
<ul>
<li>是否有现成的（开源）库，如做搜索类的东西，那么 Lucene 就是天然的选择</li>
<li>是否有活跃的社区</li>
</ul>
</li>
</ul>
<p>当然在这里我可能无法全部的罗列出我思考的元素，但是总而言之，我认为语言应该是工具。技术应该为需求服务。当然，如果你只会一种语言，那么可能就没有办法了，但是我对你的建议就是再去学习一门语言吧，不同语言的不同思考方式，会让你对编程有更多的理解。</p>
<p>好了，该说我选择的语言了。我选择的是 Python 。原因是Python便于快速迭代；社区提供的资源足够多；国内Python社区发展良好；暂时定位在桌面应用，但是如果迁移到Web应用Python也可以应付的来。暂时妥协的是，Python很难迁移到 Android/iPhone 平台（也许我并不知道），但是暂时就不管了（会有一些其他的考虑，后续的篇章会提到）。</p>
<h3>me@yinwm.com:~$ 给自己的应用起一个名字</h3>
<p>一个好的名字是非常重要的，不过有时候信手捏来的也是不错的。在晚上回家坐公交车的时候，我想到其实这个项目就是某种意义上的 Twitter 客户端。</p>
<p>Twitter表示的就是小鸟的 JiZha （叽叽喳喳）-&gt; JiZa 会不会更好 -&gt; Jiz 呢 -&gt; Jiz 什么意思？会不会读起来在英语里面并不好？ -&gt; Jazz 爵士随心的演绎很能表示这种随波的讯息 -&gt; Jazz太短，就 JazzNews 吧，随意的讯息和信息 -&gt; Google 一下 JazzNews 有 1.4m 个结果，很容易重复 -&gt; JazzMeme，嗯这个不错，随意的小信息块，Google 只有 8k 个结果，就他了。</p>
<p>就这样项目定名  <strong><span style="color: #0000ff;">JazzMeme</span></strong></p>
<h3>me@yinwm.com:~$ 找一个地方托管自己的代码、License</h3>
<p>这是一个开源的项目，那么肯定是找一个地方托管自己的代码，这样大家也可以第一时间看到各种进展。我考虑的地方有 github/bitbucket/google-code。因为我一直在使用hg，并且想熟练的使用下去，那么首先排除github（虽然我很不舍）。然后考虑到 google-code 的 Wiki/Download/Issues 等周边服务比 bitbucket 好，所以选择 google-code，代码使用 hg 管理。</p>
<p>License，我并没有选择GPL，感觉太粗暴，花两秒钟在 MIT 和 BSD 中间犹豫了一下，鉴于更熟悉BSD，那么选择BSD。</p>
<p>其实在考虑从托管的时候，我还想到了 SourceForge ，但是无奈，这个老牌的东西已经没有以前那么有影响力了，所以在我都搞定之后才想起来。</p>
<p>项目的地址是 <a href="http://code.google.com/p/jazzmeme/" target="_blank">http://code.google.com/p/jazzmeme/</a> 。还没有半毛钱的东西，希望我不会让这个坑一直荒废着。</p>
]]></content:encoded>
			<wfw:commentRss>http://yinwm.com/2010/11/jazzmeme-0/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>网络安全通讯（5）&#8212;-支持客户端验证的python web server</title>
		<link>http://yinwm.com/2008/04/%e7%bd%91%e7%bb%9c%e5%ae%89%e5%85%a8%e9%80%9a%e8%ae%af%ef%bc%885%ef%bc%89-%e6%94%af%e6%8c%81%e5%ae%a2%e6%88%b7%e7%ab%af%e9%aa%8c%e8%af%81%e7%9a%84python-web-server/</link>
		<comments>http://yinwm.com/2008/04/%e7%bd%91%e7%bb%9c%e5%ae%89%e5%85%a8%e9%80%9a%e8%ae%af%ef%bc%885%ef%bc%89-%e6%94%af%e6%8c%81%e5%ae%a2%e6%88%b7%e7%ab%af%e9%aa%8c%e8%af%81%e7%9a%84python-web-server/#comments</comments>
		<pubDate>Wed, 02 Apr 2008 12:49:39 +0000</pubDate>
		<dc:creator>yinwm</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[安全]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[twisted]]></category>

		<guid isPermaLink="false">http://yinwm.cn/wordpress/?p=45</guid>
		<description><![CDATA[前面我们说道很多的场景是需要客户端验证（Client Certificate）的，而python的web server如何支持呢？大多数的python web server都是符合WSGI标准的，也就是他们提供WSGI标准支持的功能，也就是他们几乎都不支持WSGI不支持的功能。很遗憾，客户端验证不在此列。换句话说，Cherrypy，webpy等常用的python web server都无法支持客户端验证。 我终于找到了Twisted（他怎么一下从2.5就蹦到了8.0.1）的web模块可以作为一个单独的web server。而这个web模块是包装的很底层的，使用pyopenssl，并且不是WSGI的一个实现。也就是说，他很可能是支持客户端验证的。经过一番google，发现了支持的办法。如下：首先我们看一下如何让Twisted支持HTTPS，他需要执行reactor.listenSSL方法， class Hello(Resource) :&#160;&#160;&#160; isLeaf = True&#160;&#160;&#160; def render(self, request) :&#160;&#160;&#160;&#160;&#160;&#160;&#160; return &#8216;Hello, SSL&#8217;root = server.Site(Hello())ctxFactory = ssl.DefaultOpenSSLContextFactory(&#160;&#160;&#160; &#8216;/path/to/server.key&#8217;,&#160;&#160;&#160; &#8216;/path/to/server.crt&#8217;&#160;&#160;&#160; )reactor.listenSSL(443, root, contextFactory = ctxFactory)reactor.run() 这是最基本的支持HTTPS的方法，我们看，他需要一个contextFactory，深入到Twisted里面发现这个contextFactory是SSL进行设置。我们想要他支持客户端验证，就要从这里下手了。DefaultOpenSSLContextFactory的cacheContext方法是对context进行的操作。我们重写这个方法。 class SSLClientCertificateFactory(ssl.DefaultOpenSSLContextFactory) : &#160;&#160;&#160; def __init__(self, privateKeyFileName, certificateFileName, sslmethod=SSL.SSLv23_METHOD) :&#160;&#160;&#160;&#160;&#160;&#160;&#160; ssl.DefaultOpenSSLContextFactory.__init__(self, privateKeyFileName, certificateFileName, sslmethod) &#160;&#160;&#160; def _verify(self, connection, x509, errnum, errdepth, [...]]]></description>
			<content:encoded><![CDATA[<p>前面我们说道很多的场景是需要客户端验证（Client Certificate）的，而python的web server如何支持呢？<br />大多数的python web server都是符合WSGI标准的，也就是他们提供WSGI标准支持的功能，也就是他们几乎都不支持WSGI不支持的功能。很遗憾，客户端验证不在此列。换句话说，Cherrypy，webpy等常用的python web server都无法支持客户端验证。</p>
<p>我终于找到了<a href="http://twistedmatrix.com/" target="blank">Twisted</a>（他怎么一下从2.5就蹦到了8.0.1）的web模块可以作为一个单独的web server。而这个web模块是包装的很底层的，使用pyopenssl，并且不是WSGI的一个实现。也就是说，他很可能是支持客户端验证的。<br />经过一番google，发现了支持的办法。如下：<br />首先我们看一下如何让Twisted支持HTTPS，他需要执行reactor.listenSSL方法，</p>
<p>class Hello(Resource) :<br />&nbsp;&nbsp;&nbsp; isLeaf = True<br />&nbsp;&nbsp;&nbsp; def render(self, request) :<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return &#8216;Hello, SSL&#8217;<br />root = server.Site(Hello())<br />ctxFactory = ssl.DefaultOpenSSLContextFactory(<br />&nbsp;&nbsp;&nbsp; &#8216;/path/to/server.key&#8217;,<br />&nbsp;&nbsp;&nbsp; &#8216;/path/to/server.crt&#8217;<br />&nbsp;&nbsp;&nbsp; )<br />reactor.listenSSL(443, root, contextFactory = ctxFactory)<br />reactor.run()</p>
<p>这是最基本的支持HTTPS的方法，我们看，他需要一个contextFactory，深入到Twisted里面发现这个contextFactory是SSL进行设置。我们想要他支持客户端验证，就要从这里下手了。<br />DefaultOpenSSLContextFactory的cacheContext方法是对context进行的操作。我们重写这个方法。</p>
<p>class SSLClientCertificateFactory(ssl.DefaultOpenSSLContextFactory) :</p>
<p>&nbsp;&nbsp;&nbsp; def __init__(self, privateKeyFileName, certificateFileName, sslmethod=SSL.SSLv23_METHOD) :<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ssl.DefaultOpenSSLContextFactory.__init__(self, privateKeyFileName, certificateFileName, sslmethod)</p>
<p>&nbsp;&nbsp;&nbsp; def _verify(self, connection, x509, errnum, errdepth, ok):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8220;&#8221;"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print &#8216;_verify (ok=%d):&#8217; % ok<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print &#8216;&nbsp; subject:&#8217;, x509.get_subject()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print &#8216;&nbsp; issuer:&#8217;, x509.get_issuer()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print &#8216;&nbsp; errnum %s, errdepth %d&#8217; % (errnum, errdepth)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8220;&#8221;"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ok<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; def cacheContext(self) :<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ssl.DefaultOpenSSLContextFactory.cacheContext(self)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ctx = self._context<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ctx.load_verify_locations(&#8216;/path/to/ca.crt&#8217;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ctx.set_verify(SSL.VERIFY_PEER|SSL.VERIFY_FAIL_IF_NO_PEER_CERT, self._verify)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._context = ctx</p>
<p>我们在通过默认的contextFactory生成context之后，执行ctx.set_verify(SSL.VERIFY_PEER|SSL.VERIFY_FAIL_IF_NO_PEER_CERT, self._verify)，这样就加入和客户端验证，并且在self._verify函数里面我们还可以具体的验证证书的情况。<br />改写最上面的程序，<br />class Hello(Resource) :<br />
&nbsp;&nbsp;&nbsp; isLeaf = True<br />
&nbsp;&nbsp;&nbsp; def render(self, request) :<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return &#8216;Hello, SSL&#8217;<br />
root = server.Site(Hello())<br />
ctxFactory = SSLClientCertificateFactory(<br />
&nbsp;&nbsp;&nbsp; &#8216;/path/to/server.key&#8217;,<br />
&nbsp;&nbsp;&nbsp; &#8216;/path/to/server.crt&#8217;<br />
&nbsp;&nbsp;&nbsp; )<br />
reactor.listenSSL(443, root, contextFactory = ctxFactory)<br />reactor.run()</p>
<p>好了，此时我们的python web server已经支持客户端验证了</p>
<p>后记：这里我有一个思考，就是为什么WSGI（暂时）不支持客户端验证？我想应该不是设计者忽视了这个问题。一般的，需要客户端验证这样的应用场景，很难只是假设一个python的web server，前面应该都有一个Apache等纯粹的服务器，那么这些验证之类的工作完全交付给Apache就足够好了，python没必要自己来处理。也许这就是原因吧。<br />那么，从这里我们也能看出，作为一个纯粹的网络应用组件，Twisted至少从功能上还是非常强大的。</p>
]]></content:encoded>
			<wfw:commentRss>http://yinwm.com/2008/04/%e7%bd%91%e7%bb%9c%e5%ae%89%e5%85%a8%e9%80%9a%e8%ae%af%ef%bc%885%ef%bc%89-%e6%94%af%e6%8c%81%e5%ae%a2%e6%88%b7%e7%ab%af%e9%aa%8c%e8%af%81%e7%9a%84python-web-server/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>网络安全通讯（4）&#8212;-为Python Webserver添加HTTPS支持</title>
		<link>http://yinwm.com/2008/03/%e7%bd%91%e7%bb%9c%e5%ae%89%e5%85%a8%e9%80%9a%e8%ae%af%ef%bc%884%ef%bc%89-%e4%b8%bapython-webserver%e6%b7%bb%e5%8a%a0https%e6%94%af%e6%8c%81/</link>
		<comments>http://yinwm.com/2008/03/%e7%bd%91%e7%bb%9c%e5%ae%89%e5%85%a8%e9%80%9a%e8%ae%af%ef%bc%884%ef%bc%89-%e4%b8%bapython-webserver%e6%b7%bb%e5%8a%a0https%e6%94%af%e6%8c%81/#comments</comments>
		<pubDate>Fri, 14 Mar 2008 10:22:00 +0000</pubDate>
		<dc:creator>yinwm</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[安全]]></category>
		<category><![CDATA[cherrypy]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://yinwm.cn/wordpress/?p=44</guid>
		<description><![CDATA[前面我们说的都是为Apache服务器添加HTTPS的支持，今天我们讨论一下为Python的Webserver添加HTTPS的支持。 Python的Webserver基本上都是遵循Python的WSGI标准，包括我使用的CherryPy和webpy。在这两个Webserver的源代码中都有一个package叫做wsgiserver，里面只有__init__.py。这两个Webserver的wsgiserver内容几乎一样，而且明显有CherryPy的痕迹，看来CherryPy可能是WSGI标准的一个（半）官方实现，就好像Tomcat至于Servlet。 WSGI标准写的很是笼统，他只是说可以支持SSL，无他。只好阅读源代码，代码里面写的倒不是很差。需要同时给出ssl需要的服务器端的私钥和证书，分别使用如下两个变量存放。ssl_certificate: the filename of the server SSL certificate.&#160;&#160;&#160;&#160;&#160; 服务器端的SSL证书ssl_privatekey: the filename of the server&#8217;s private key file.&#160;&#160;&#160; 服务器端的私钥我们只要遵循每个服务器的文档设置上就可以了。我们以CherryPy为例。（好吧，我说实话，我只会这个。） 在CherryPy的配置文件里面，可以设置这两个变量，分别指向文件系统的文件。[global]server.socket_port : 8081server.socket_host : &#8220;0.0.0.0&#8243;server.ssl_certificate : &#8220;conf/cert/server.crt&#8221;server.ssl_private_key : &#8220;conf/cert/server.key&#8221;这样，当我们重新启动的时候，我们的webserver就已经开始支持HTTPS了。如果这两个变量有一个没有设置的话，HTTPS就不会起作用。 这里我不得不说一下，CherryPy的文档已经算是不错的了，但是还是不行，只有在ServerAPI里面稍微提及了一下这两个变量而已。想要完整的搞明白，就只能祭出hack源代码大发，还得有连蒙带唬的功能。 至于webpy，就最好看看他的文档了。]]></description>
			<content:encoded><![CDATA[<p>前面我们说的都是为Apache服务器添加HTTPS的支持，今天我们讨论一下为Python的Webserver添加HTTPS的支持。</p>
<p>Python的Webserver基本上都是遵循Python的<a href="http://www.python.org/dev/peps/pep-0333/" target="_blank">WSGI标准</a>，包括我使用的CherryPy和webpy。在这两个Webserver的源代码中都有一个package叫做wsgiserver，里面只有__init__.py。这两个Webserver的wsgiserver内容几乎一样，而且明显有CherryPy的痕迹，看来CherryPy可能是WSGI标准的一个（半）官方实现，就好像Tomcat至于Servlet。</p>
<p>WSGI标准写的很是笼统，他只是说可以支持SSL，无他。只好阅读源代码，代码里面写的倒不是很差。需要同时给出ssl需要的服务器端的私钥和证书，分别使用如下两个变量存放。<br />ssl_certificate: the filename of the server SSL certificate.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 服务器端的SSL证书<br />ssl_privatekey: the filename of the server&#8217;s private key file.&nbsp;&nbsp;&nbsp; 服务器端的私钥<br />我们只要遵循每个服务器的文档设置上就可以了。我们以CherryPy为例。（好吧，我说实话，我只会这个。）</p>
<p>在CherryPy的配置文件里面，可以设置这两个变量，分别指向文件系统的文件。<br />[global]<br />server.socket_port : 8081<br />server.socket_host : &#8220;0.0.0.0&#8243;<br />server.ssl_certificate : &#8220;conf/cert/server.crt&#8221;<br />server.ssl_private_key : &#8220;conf/cert/server.key&#8221;<br />这样，当我们重新启动的时候，我们的webserver就已经开始支持HTTPS了。如果这两个变量有一个没有设置的话，HTTPS就不会起作用。</p>
<p>这里我不得不说一下，CherryPy的文档已经算是不错的了，但是还是不行，只有在ServerAPI里面稍微提及了一下这两个变量而已。想要完整的搞明白，就只能祭出hack源代码大发，还得有连蒙带唬的功能。</p>
<p>至于webpy，就最好看看他的文档了。</p>
<p></p>
]]></content:encoded>
			<wfw:commentRss>http://yinwm.com/2008/03/%e7%bd%91%e7%bb%9c%e5%ae%89%e5%85%a8%e9%80%9a%e8%ae%af%ef%bc%884%ef%bc%89-%e4%b8%bapython-webserver%e6%b7%bb%e5%8a%a0https%e6%94%af%e6%8c%81/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Cherrypy]配置设置，静态内容支持</title>
		<link>http://yinwm.com/2008/03/cherrypy%e9%85%8d%e7%bd%ae%e8%ae%be%e7%bd%ae%ef%bc%8c%e9%9d%99%e6%80%81%e5%86%85%e5%ae%b9%e6%94%af%e6%8c%81/</link>
		<comments>http://yinwm.com/2008/03/cherrypy%e9%85%8d%e7%bd%ae%e8%ae%be%e7%bd%ae%ef%bc%8c%e9%9d%99%e6%80%81%e5%86%85%e5%ae%b9%e6%94%af%e6%8c%81/#comments</comments>
		<pubDate>Fri, 14 Mar 2008 08:48:35 +0000</pubDate>
		<dc:creator>yinwm</dc:creator>
				<category><![CDATA[cherrypy]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://yinwm.cn/wordpress/?p=43</guid>
		<description><![CDATA[Cherrypy是一个很不错的python webserver，不过好东西也会让人抓狂的。Cherrypy的配置可以放在一个配置文件中，然后在启动的时候提供出文件名就可以。cherrypy.quickstart(handler, config=&#8217;/path/to/conf_file&#8217;) 我需要用到的一个功能就是要增加一个静态内容的支持，也就是当用户访问http://localhost/static的时候指向的是我的一个存放静态内容（js，css等）的目录。这个可以使用配置文件的tools.staticfile和tools.staticdir参数设置（相见Cherrypy的StaticContent章节）。但是你写在配置文件中的都需要是一个绝对路径，而我的程序是不一定安装到哪里的，所以只能后期配置。此时的配置信息是分两部分的，一部分是通用的，一部分是静态内容，需要根据当前所在目录组合起来的。 正确的写法是cherrypy.config.update(global_config)然后是cherrypy的quickstart里面的config是static的配置cherrypy.quickstart(handler, config=static_conf) 首先是把全局的配置设置在cherrypy的config中，然后在quickstart里面给出静态内容的配置。 我走了一个弯路，无法正确的使用静态内容 把所有的内容都放在一个配置信息中，使用cherrypy.config.update，在quickstart的时候不给config参数 就原因来说，我查看了一下cherrypy的源代码，他会在quickstart的时候，把config参数应用在tree的mount上，而static content的配置在此时才会起作用的。所以这样做是不行的。]]></description>
			<content:encoded><![CDATA[<p>Cherrypy是一个很不错的python webserver，不过好东西也会让人抓狂的。<br />Cherrypy的配置可以放在一个配置文件中，然后在启动的时候提供出文件名就可以。<br />cherrypy.quickstart(handler, config=&#8217;/path/to/conf_file&#8217;)</p>
<p>我需要用到的一个功能就是要增加一个静态内容的支持，也就是当用户访问http://localhost/static的时候指向的是我的一个存放静态内容（js，css等）的目录。这个可以使用配置文件的tools.staticfile和tools.staticdir参数设置（相见Cherrypy的<a href="http://cherrypy.org/wiki/StaticContent" target="_blank">StaticContent</a>章节）。但是你写在配置文件中的都需要是一个绝对路径，而我的程序是不一定安装到哪里的，所以只能后期配置。<br />此时的配置信息是分两部分的，一部分是通用的，一部分是静态内容，需要根据当前所在目录组合起来的。</p>
<p>正确的写法是<br />cherrypy.config.update(global_config)<br />然后是cherrypy的quickstart里面的config是static的配置<br />cherrypy.quickstart(handler, config=static_conf)</p>
<p>首先是把全局的配置设置在cherrypy的config中，然后在quickstart里面给出静态内容的配置。</p>
<p>我走了一个弯路，无法正确的使用静态内容
<ol>
<li>把所有的内容都放在一个配置信息中，使用cherrypy.config.update，在quickstart的时候不给config参数</li>
</ol>
<p>就原因来说，我查看了一下cherrypy的源代码，他会在quickstart的时候，把config参数应用在tree的mount上，而static content的配置在此时才会起作用的。所以这样做是不行的。</p>
]]></content:encoded>
			<wfw:commentRss>http://yinwm.com/2008/03/cherrypy%e9%85%8d%e7%bd%ae%e8%ae%be%e7%bd%ae%ef%bc%8c%e9%9d%99%e6%80%81%e5%86%85%e5%ae%b9%e6%94%af%e6%8c%81/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

