<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>yimogod</title>
    <description></description>
    <link>http://yimogod.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>flex collection 的特征</title>
        <author>yimogod</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yimogod.javaeye.com">yimogod</a>&nbsp;
          链接：<a href="http://yimogod.javaeye.com/blog/198103" style="color:red;">http://yimogod.javaeye.com/blog/198103</a>&nbsp;
          发表时间: 2008年05月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <ol>
<li><span style="font-size: small;">
</span>
<span style="font-size: small;"><span style="font-size: 10pt; font-family: 宋体;">Collection</span>
<span style="font-size: 10pt; font-family: 宋体;">可以保证当它的数据（<span lang="EN-US">underlying data</span>
）更新时，这个<span lang="EN-US">collection</span>
作为<span lang="EN-US">dataprovider</span>
的<span lang="EN-US">control</span>
也会更新数据。而非<span lang="EN-US">collection</span>
作为<span lang="EN-US">dataprovider</span>
时，比如<span lang="EN-US">Array</span>
，<span lang="EN-US">control</span>
不会更新，除非他们被刷新才会显示新数据。
</span>
</span>
</li>
<li><span style="font-size: small;"><span style="font-size: 10pt; font-family: 宋体;">当<span lang="EN-US">remote
data </span>
作为<span lang="EN-US">control</span>
的<span lang="EN-US">dataprovider</span>
时，这些<span lang="EN-US">data</span>
可能会分在几个页面里，并且可能不能被立即使用或者是需要等上一段时间才能返回数据。<span lang="EN-US">Collection</span>
提供了一种机制来处理这种数据。
</span>
</span>
</li>
<li><span style="font-size: small;"><span style="font-size: 10pt; font-family: 宋体;">Collection</span>
<span style="font-size: 10pt; font-family: 宋体;">提供了一系列对数据的操作，这些操作是独立于原始数据（<span lang="EN-US">underlying
data</span>
）的
</span>
</span>
。</li>
<li><span style="font-size: small;"><span style="font-size: 10pt; font-family: 宋体;">Collection</span>
<span style="font-size: 10pt; font-family: 宋体;">实现的<span lang="EN-US">ICollection</span>
接口提供了一个<span lang="EN-US">view</span>
数据，可以用来<span lang="EN-US">sort</span>
或者<span lang="EN-US">filter(filter</span>
需要提供方法<span lang="EN-US">)</span>
，这些仅仅作用于<span lang="EN-US">view</span>
数据，而不对原始数据产生任何影响。
</span>
</span>
</li>
<li><span style="font-size: small;"><span style="font-size: 10pt; font-family: 宋体;">你可以使用一个<span lang="EN-US">collection</span>
去为多个<span lang="EN-US">component</span>
提供<span lang="EN-US">dataprovider</span>
</span>
</span>
。</li>
<li><span style="font-size: small;"><span style="font-size: 10pt; font-family: 宋体;">当<span lang="EN-US">collection</span>
作为<span lang="EN-US">component</span>
的<span lang="EN-US">dataprovider</span>
时，你可以在运行时更换它。也可以修改<span lang="EN-US">collection</span>
，让所有使用这个<span lang="EN-US">collection</span>
作为<span lang="EN-US">dataprovider</span>
的<span lang="EN-US">component</span>
都反映出这个修改。
</span>
</span>
</li>
<li><span style="font-size: small;"><span style="font-size: 10pt; font-family: 宋体;">你可以通过<span lang="EN-US">collection</span>
的方法去访问原始数据<span lang="EN-US">(underlying data)。</span>
</span>
</span>
</li>
</ol>
<p>&nbsp;</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://yimogod.javaeye.com/blog/198103#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 29 May 2008 08:57:45 +0800</pubDate>
        <link>http://yimogod.javaeye.com/blog/198103</link>
        <guid>http://yimogod.javaeye.com/blog/198103</guid>
      </item>
      <item>
        <title>Flex创建一个UI component的全过程</title>
        <author>yimogod</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yimogod.javaeye.com">yimogod</a>&nbsp;
          链接：<a href="http://yimogod.javaeye.com/blog/197200" style="color:red;">http://yimogod.javaeye.com/blog/197200</a>&nbsp;
          发表时间: 2008年05月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <ul>
<li>请求component的构造器</li>
<li>设置component的属性</li>
<li>
调用父容器的addChild方法，这包括：</li>
<li>
<blockquote><ol>
<li>
    a)	Flex设置component的parent属性并引用其父容器。</li>
<li>
    b)	设置component样式</li>
<li>
    c)	component发送add事件（其实是flex发送，component是源）</li>
<li>
    d)	父容器发送addChild事件</li>
<li>
    e)	Flex发送component的preinitialize时间</li>
<li>
    f)	Flex创建并初始化component的子UI&mdash;如button组件显示&ldquo;确定&rdquo;文本的text label</li>
<li>
    g)	Flex发送Initialize时间</li>
</ol>
</blockquote>
</li>
<li>
接下来，为了显示component，一个render事件被触发</li>
<li>
<blockquote><ol>
<li>
    a)	Flex完成显示component的所有必需过程，包括layout component</li>
<li>
    b)	Flex设置component的visible属性为true</li>
<li>
    c)	Flex发送creationComplete事件</li>
<li>
    d)	Flex发送组建的updateComplete事件</li>
</ol>
</blockquote>
</li>
</ul>
<p>
<br />
<br />
Flex创建component有四个事件</p>
<ol>
<li>&nbsp;
preinitialize 事件发生在component生命周期的最开始。</li>
<li>&nbsp;
捕获 initialize 事件去设置component的外观，因为这是flex还没有做这件事</li>
<li>&nbsp;
当component被绘制完毕并且被放置在布局中，flex派发这个事件</li>
<li>&nbsp;
updateComplete 会在每当component 更新时发生</li>
</ol>
<p>&nbsp;</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://yimogod.javaeye.com/blog/197200#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 26 May 2008 20:50:25 +0800</pubDate>
        <link>http://yimogod.javaeye.com/blog/197200</link>
        <guid>http://yimogod.javaeye.com/blog/197200</guid>
      </item>
      <item>
        <title>pyamf小实例</title>
        <author>yimogod</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yimogod.javaeye.com">yimogod</a>&nbsp;
          链接：<a href="http://yimogod.javaeye.com/blog/195532" style="color:red;">http://yimogod.javaeye.com/blog/195532</a>&nbsp;
          发表时间: 2008年05月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          这两天在学习Google AppEngine的时候， 需要写一个小程序，就是简单的从数据库里读出数据，然后显示出来。<br />界面使用flex的，所以数据通信是想到了用amf,搜索到了两个python的开源产品--pyAmf和Django Amf,后来看到Django Amf更新的并不频繁，所以最后选了pyAmf。<br /><br />pyAmf还有一个优点是官方网站推荐了几篇django与flex通信的文章里有一篇是中文的，哈哈。。。我喜欢中文。。。链接见<br /><a href="http://blog.eshangrao.com/index.php/2008/02/16/447-flexpyamfdjango" target="_blank">http://blog.eshangrao.com/index.php/2008/02/16/447-flexpyamfdjango</a><br /><br />我的程序参考的也就是这篇文章，但代码写完后，程序并没有通过，而是一直报找不到服务，折腾了两天终于搞出来了。<br /><br />Django 服务端，<br /><br />1. 新建立一个工程testAMF,然后建立一个app--dailystory.<br /><br />2. 修改settings.py<br />   将dailystory添加到INSTALLED_APPS中。<br />   配置数据库。<br /><br />3. 工程目录中( whatidisplay 文件夹里 )的urls.py 的相关代码如下:<br /><pre name="code" class="python">
from django.conf.urls.defaults import *
import settings

urlpatterns = patterns('',
    (r'^dailystory/', include('testAMF.dailystory.urls')),
    (r'^admin/', include('django.contrib.admin.urls')),
    )
</pre><br /><br />4. 在dailystory文件夹中添加一个urls.py文件<br /><pre name="code" class="python">
from django.conf.urls.defaults import *

urlpatterns = patterns('',
    (r'^gateway/$', 'testAMF.dailystory.amfgateway.storyGateway'),
    (r'^(.*)$', 'django.views.static.serve', {'document_root':'dailystory/flex'}),
    )
</pre><br /><br />5. 修改dailystory文件夹中的models.py 文件<br /><pre name="code" class="python">
from django.db import models

class DailyStory(models.Model):
    content = models.TextField()

    def __unicode__(self):
        return self.title

    class Admin:
        pass
</pre><br />6. 在dailystory文件夹中添加一个amfgateway.py文件<br /><pre name="code" class="python">
from pyamf.remoting.gateway.django import DjangoGateway
from dailystory.models import DailyStory

def getDailyStory(request):
    return DailyStory.objects.all()


storyGateway = DjangoGateway({
    'dailystory.getDailyStory': getDailyStory,
 })
</pre><br />Django的服务端就大功告成了<br /><br /><br />Flex端更简单<br /><pre name="code" class="java">
&lt;?xml version="1.0" encoding="utf-8"?>
&lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
	layout="absolute" creationComplete="initApp();">
	
	&lt;mx:Script>
		&lt;![CDATA[
			import flash.events.NetStatusEvent;
			
			import mx.collections.ArrayCollection;
			import mx.rpc.AsyncToken;
			import mx.rpc.AsyncResponder;
			import mx.rpc.events.FaultEvent;
			import mx.rpc.events.ResultEvent;			
			
			private function initApp():void
			{
    			
    			    var token:AsyncToken=djangoService.getDailyStory();
			    token.addResponder(new AsyncResponder(onGetDailyStory,faultHandler));
			}
			
			private function onGetDailyStory(re:ResultEvent, token:Object=null):void
			{
			    var stories:Array = re.result as Array;
			    var storyCollection:ArrayCollection = new ArrayCollection(stories);
			    yesterdayStory.text = storyCollection.getItemAt(0).content;
			}
			
			private function faultHandler(fe:FaultEvent, token:Object=null):void
			{
			    trace(fe.fault.faultDetail);
			}
		]]&gt;
	&lt;/mx:Script>
	
	&lt;mx:RemoteObject
		id="djangoService"
		destination="dailystory"
		showBusyCursor="true">
	&lt;/mx:RemoteObject>
	
	&lt;mx:TextArea id="yesterdayStory" x="582" y="130" height="118" width="242"/>
&lt;/mx:Application>
</pre><br /><br />然后需要在于与上述flex文件同目录中新建一个services-config.xml<br /><pre name="code" class="xml">
&lt;?xml version="1.0" encoding="UTF-8"?>
&lt;services-config>
    &lt;services>
        &lt;service id="dailyStoryService" class="flex.messaging.services.RemotingService" messageTypes="flex.messaging.messages.RemotingMessage">
            &lt;destination id="dailystory">
                &lt;channels>
                    &lt;channel ref="dailyStoryChannel"/>
                &lt;/channels>
                &lt;properties>
                    &lt;source>*&lt;/source>
                &lt;/properties>
            &lt;/destination>
        &lt;/service>
    &lt;/services>
    &lt;channels>
        &lt;channel-definition id="dailyStoryChannel" class="mx.messaging.channels.AMFChannel">
            &lt;endpoint uri="http://localhost:8080/dailystory/gateway/" class="flex.messaging.endpoints.AMFEndpoint"/>
        &lt;/channel-definition>
    &lt;/channels>
&lt;/services-config>
</pre><br /><br />在编译时注意添加编译参数-services services-config.xml<br /><br />然后将编译后生成的在bin-debug文件夹中的文件复制到whatidisplay\dailystory\flex文件夹里<br /><br />运行django服务器<br /><pre name="code" class="java">manage.py runserver 8080</pre><br />访问<a href="http://localhost:8080/dailystory/DailyStory.html" target="_blank">http://localhost:8080/dailystory/DailyStory.html</a><br /><br /><br /><br />这里与我参考的文章不同的有两点，估计是pyAMF的更新造成的。我用的pyamf版本是0.3.1.<br />第一个是在amfgateway.py文件中<br /><pre name="code" class="java">
storyGateway = DjangoGateway({
    'dailystory.getDailyStory': getDailyStory,
 })
</pre><br />我在给DjangoGateway赋值时使用了<span style="color: blue">appName.method</span>--即<span style="color: blue">dailystory.getDailyStory</span><br />据官方说这可能是个bug;)具体参看<a href="http://www.pyamf.org/wiki/DjangoHowto" target="_blank">http://www.pyamf.org/wiki/DjangoHowto</a>中的May be some problems here<br /><br />另外一处是 <span style="color: blue">services-config.xml</span> 文件中，我的<span style="color: blue">destination id</span> 给的就是django中App的名字。如果起其他名字的话，最后flex总是得不到服务。很奇怪。<br /><br />好了,大家有兴趣可以看下俺的google AppEngine <br /><a href="http://whatidisplay.appspot.com/dailystory/DailyStory.html" target="_blank">http://whatidisplay.appspot.com/dailystory/DailyStory.html</a>
          <br/>
          <span style="color:red;">
            <a href="http://yimogod.javaeye.com/blog/195532#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 22 May 2008 10:33:31 +0800</pubDate>
        <link>http://yimogod.javaeye.com/blog/195532</link>
        <guid>http://yimogod.javaeye.com/blog/195532</guid>
      </item>
      <item>
        <title>理解 flex actionscript</title>
        <author>yimogod</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yimogod.javaeye.com">yimogod</a>&nbsp;
          链接：<a href="http://yimogod.javaeye.com/blog/170900" style="color:red;">http://yimogod.javaeye.com/blog/170900</a>&nbsp;
          发表时间: 2008年03月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          as 不允许overload...即对于同一个函数名不能有不同的参数列表和返回值<br />类中的geter 和 setter 与其他的方法一样,除了<br />1.get函数没有参数,并且必须有返回值,并且必须有get关键字<br />2.set函数必须有参数并且没有返回值,并且必须有set关键字<br /><pre name="code" class="java">
public function get sampleProperty( ):String {
  return _sampleProperty;
}
public function set sampleProperty(value:String):void {
  _sampleProperty = value;
}
</pre><br /><br />Array对象可以放入不同类型的实例.<br /><br />Object class 是动态的,这意味着你可以在Object的实例中添加任意属性(不知道有没有方法).<br /><br />如果要对类中的方法override,那么函数名,参数列表,返回值,以及访问权限都必须与目标方法相同...<br /><br />Interface 没有属性,只定义方法原型,并且不需要权限修饰符(默认为publish,呵呵,如果有权限的话,根本就用不了他,还有啥用)<br /><pre name="code" class="java">
package com.example {
  public interface IExample {
    function a( ):String;
    function b(one:String, two:uint):void;
  }
}

package com.example {
  import com.example.IExample;
  public class Example implements IExample {
    public function Example( ) {
    }
    public function a( ):String {
      return "a";
    }
    public function b(one:String, two:uint):void {
      trace(one + " " + two);
    }
  }
}

</pre><br /><br />Error 分为同步和不同步两种...<br />sync error利用try..catch块来处理,他表示当你试图执行某段语句(当然这段语句可以产生error)时,立即抛出error...<br />async error经常发生在网络操作的过程中...比如说你请求的http://.....a.file 不存在,要经过程序请求过才知道a.file不存在,这时才会抛出error...<br />async error的处理方法与event类似...不如说,我定义了一个URLLoader对象去访问一个位于Flash Player安全沙箱外的数据,那么这个URLLoader对象就会抛出一个SecurityErrorEvent<br /><pre name="code" class="java">
      private function initializeHandler(event:Event):void {
        var loader:URLLoader = new URLLoader( );
         // In order to test this you'll need to specify a URL of a file that
         // exists outside of the security sandbox.
        loader.load(new URLRequest("data.xml"));
        loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR,
securityErrorHandler);
      }
      private function securityErrorHandler(event:SecurityErrorEvent):void {
        errors.text += event + "\n";
      }

</pre><br /><br />定义XML有两种方式:<br />1.<br /><pre name="code" class="java">
var xml:XML = &lt;books>
              &lt;book>
                &lt;title>Programming Flex 2&lt;/title>
                &lt;authors>
                  &lt;author first="Chafic" last="Kazoun" />
                  &lt;author first="Joey" last="Lott" />
                &lt;/authors>
              &lt;/book>
              ...
            &lt;/books>;
</pre><br /><br />2.<br /><pre name="code" class="java">
var xml:XML = new XML(loadedXMLData);
</pre><br />这里要注意loadedXMLData--为string,<br />默认情况下,Flash Player 会吧所有的String 解析为XML.并且将String中的空格解析为node,如果有必要,需要在定义xml实例前,调用如下语句<br /><pre name="code" class="java">
XML.ignoreWhitespace = true;
var xml:XML = new XML(loadedXMLData);
</pre><br /><br />有两种方式访问XML数据--遍历DOM和使用E4X.
          <br/>
          <span style="color:red;">
            <a href="http://yimogod.javaeye.com/blog/170900#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 13 Mar 2008 17:06:45 +0800</pubDate>
        <link>http://yimogod.javaeye.com/blog/170900</link>
        <guid>http://yimogod.javaeye.com/blog/170900</guid>
      </item>
      <item>
        <title>理解 flex component</title>
        <author>yimogod</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yimogod.javaeye.com">yimogod</a>&nbsp;
          链接：<a href="http://yimogod.javaeye.com/blog/170757" style="color:red;">http://yimogod.javaeye.com/blog/170757</a>&nbsp;
          发表时间: 2008年03月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          component就是一个AS class 或者是MXML component文件在manifest文件中映射的标签.分可视和不可视<br />可视化component包括Containers 和 UI controls<br />Containers(Appliction, Panel...)<br />UI controls(Button, Label)<br />可以通过3种方式设置component的属性<br />1.tag attributers<br /><pre name="code" class="java">
&lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
&lt;/mx:Application>
</pre>中的layout="absolute"<br />2.nested tags<br /><pre name="code" class="java">
&lt;mx:Button id="exampleButton">
  &lt;mx:label>Example Button&lt;/mx:label>
&lt;/mx:Button>
</pre><br />更典型的应用<br /><pre name="code" class="java">
&lt;mx:ComboBox id="exampleComboBox">
  &lt;mx:dataProvider>
    &lt;mx:ArrayCollection>
      &lt;mx:String>A&lt;/mx:String>
      &lt;mx:String>B&lt;/mx:String>
      &lt;mx:String>C&lt;/mx:String>
      &lt;mx:String>D&lt;/mx:String>
    &lt;/mx:ArrayCollection>
  &lt;/mx:dataProvider>
&lt;/mx:ComboBox>
</pre><br /><br />3.AS ;)<br /><br />几乎所有的component(所有的可视化component)都有id属性...(吗东东没有呢?),id 由数字,字母,下划线组成.可以由字母下划线开头,但不允许数字开头.<br />属性值都要用引号括住;)<br /><br />不可视component<br />1.Data component(arrays and collections)<br />2.utility component(data binding component, repeater component)
          <br/>
          <span style="color:red;">
            <a href="http://yimogod.javaeye.com/blog/170757#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 13 Mar 2008 10:56:11 +0800</pubDate>
        <link>http://yimogod.javaeye.com/blog/170757</link>
        <guid>http://yimogod.javaeye.com/blog/170757</guid>
      </item>
      <item>
        <title>Flex 的 namespace</title>
        <author>yimogod</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yimogod.javaeye.com">yimogod</a>&nbsp;
          链接：<a href="http://yimogod.javaeye.com/blog/170651" style="color:red;">http://yimogod.javaeye.com/blog/170651</a>&nbsp;
          发表时间: 2008年03月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          理解namespace<br /><pre name="code" class="java">
&lt;Application xmlns="http://www.adobe.com/2006/mxml">
</pre><br /><br />http://www.adobe.com/2006/mxml为 URI,在编译时期加入的。这样的话，我们就可以用http://www.adobe.com/2006/mxml中定义的class和component了。比如说<br /><pre name="code" class="java">
&lt;Button />
</pre><br />一般来讲，我们都会给namespace一个名字,你比如说mx-- xmlns:mx="http://www.adobe.com/2006/mxml,这样类似于上面的调用button就应该改为<br /><pre name="code" class="java">
&lt;mx:Button />
</pre><br /><br />当然，如果要实现在mxml里可以使用这些tag(Button..)就需要类文件或mxml组建映射为tag，而这些是通过manifest文件和 namespaces做到的。<br /><br />一个manifest文件：<br /><pre name="code" class="java">
&lt;?xml version="1.0"?>
&lt;componentPackage>
    &lt;component id="Button" class="mx.controls.Button"/>
    &lt;component id="ButtonBar" class="mx.controls.ButtonBar"/>
    &lt;component id="Canvas" class="mx.containers.Canvas"/>
    &lt;component id="CheckBox" class="mx.controls.CheckBox"/>
&lt;/componentPackage>
</pre><br />这样就能在mxml利用通过&lt;namespace_name:Button...调用mx.controls.Button了.<br />而URI(http://www.adobe.com/2006/mxml)又是通过编译库文件时的配置文件指定的<br /><pre name="code" class="java">
compc -load-config+=configuration.xml
</pre><br />configuration.xml如下:<br /><pre name="code" class="java">
      &lt;namespaces>
      &lt;!-- Specify a URI to associate with a manifest of components for use as MXML -->
      &lt;!-- elements.                                                                -->
         &lt;namespace>
            &lt;uri>http://www.adobe.com/2006/mxml&lt;/uri>
            &lt;manifest>mxml-manifest.xml&lt;/manifest>
         &lt;/namespace>
      &lt;/namespaces>
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://yimogod.javaeye.com/blog/170651#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 12 Mar 2008 22:07:14 +0800</pubDate>
        <link>http://yimogod.javaeye.com/blog/170651</link>
        <guid>http://yimogod.javaeye.com/blog/170651</guid>
      </item>
      <item>
        <title>留言本--bring django and flex together</title>
        <author>yimogod</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yimogod.javaeye.com">yimogod</a>&nbsp;
          链接：<a href="http://yimogod.javaeye.com/blog/156002" style="color:red;">http://yimogod.javaeye.com/blog/156002</a>&nbsp;
          发表时间: 2008年01月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Flex 是 Adobe主推的富客户端技术,与Ajax一样...<br /><br />Flex 有三种发送请求的方式<br />Http Service , Web server, Remoting...<br /><br />前两者传输的数据为文本数据，一般为XML。而Remoting则可以使Flex使用数据库.<br /><br />这里的留言板仅仅是为了学习，所以就用了Http Service...<br />呵呵，实现方法低效而且丑陋...学习中学习中...<br /><br />基本思路：<br />    首先由Django的view函数提供xml文件和接受Flex post过来的请求<br />具体来说：<br />    Django的view函数generate()负责产生localhost:8000/source/路径提供的xml数据,<br />    accept()函数负责接收Flex传过来的post请求,其路径为localhost:8000/accept/...<br />    <br />    Flex又分为显示留言界面和留言界面.<br />    显示界面的mxml定义了一个HTTPService，路径为localhost:8000/source/，即请求由Django产生的xml文件，并予以显示.<br />    留言界面的mxml定义了一个HTTPService,路径为localhost:8000/accept/，发送请求方法为POST,发送请求后，给显示界面发送事件，显示界面接收到事件后会重新发送对localhost:8000/source/ 的请求...<br /><br /><br /> Flexsource here<br />     http://mariowar.googlecode.com/svn/nb<br /> Django source here<br />     http://mariowar.googlecode.com/svn/notebook
          <br/>
          <span style="color:red;">
            <a href="http://yimogod.javaeye.com/blog/156002#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 16 Jan 2008 14:30:30 +0800</pubDate>
        <link>http://yimogod.javaeye.com/blog/156002</link>
        <guid>http://yimogod.javaeye.com/blog/156002</guid>
      </item>
      <item>
        <title>Django测试</title>
        <author>yimogod</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yimogod.javaeye.com">yimogod</a>&nbsp;
          链接：<a href="http://yimogod.javaeye.com/blog/153134" style="color:red;">http://yimogod.javaeye.com/blog/153134</a>&nbsp;
          发表时间: 2008年01月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &nbsp;&nbsp;&nbsp; 对于当今Web developer来说，自动化测试是一项非常有用的&rdquo;除虫&rdquo;工具。你可以使用测试集&mdash;&mdash;test suite&mdash;&mdash;去避免或者解决一系列的问题：<br />&nbsp;&nbsp; &nbsp;当你在写新代码的时候，测试可以验证你的代码是否按预期执行<br />&nbsp;&nbsp; &nbsp;当你重构或则修改旧代码时，你可以使用测试来确保你的修改不会对程序造成不良影响<br /><br />&nbsp;&nbsp; &nbsp;测试Web 程序是一项复杂的工作。因为一个Web程序由多种逻辑层组成&mdash;&mdash;从Http层的request 执行，到表单的确定和处理，到模板的渲染。利用Django测试框架以及齐全的配套工具，<br />&nbsp;&nbsp; &nbsp;你可以模request，插入测试数据，检查程序输出和一般情况下的测试。<br /><br />&nbsp;&nbsp; &nbsp;最重要的是，Django测试框架非常简单！<br /><br />&nbsp;&nbsp; &nbsp;Django中，测试由两种方式：doctests 和unit tests。<br /><br />&nbsp;&nbsp; &nbsp;doctests：<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;doctests使用的是python中标准的doctest测试模块。它是由系统在你的docstring（注释）中查找测试代码。<br /><br />&nbsp;&nbsp; &nbsp;Django 的test runner在你的models.py文件中查找并执行你的doctests。如果找到tests.py文件，它同样会去里面查找doctests。<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 你可以将doctest语句放入你工程中的任何models.py文件中。但一般情况下，会将app的doctests放在module docstring中，而model的doctests会放在各自的model中<br /><br />&nbsp;&nbsp; &nbsp;举例：<br /><br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;from django.db import model<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;class Animal(models.Model):<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &quot;&quot;&quot;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; An animal that knows how to make noise<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; # Create some animals<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt; lion = Animal.objects.create(name=&quot;lion&quot;, sound=&quot;roar&quot;)<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt; cat = Animal.objects.create(name=&quot;cat&quot;, sound=&quot;meow&quot;)<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; # Make 'em speak<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt; lion.speak()<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; 'The lion says &quot;roar&quot;'<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;&gt; cat.speak()<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; 'The cat says &quot;meow&quot;'<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &quot;&quot;&quot;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; name = models.CharField(maxlength=20)<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; sound = models.CharField(maxlength=20)<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; def speak(self):<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return 'The %s says &quot;%s&quot;' % (self.name, self.sound)<br /><br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;当你运行测试的时候，test utility会找到这个docstring。这里需要注意一下，上面的docstring有<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;部分类似于python的交互环境。好了，运行它吧。<br /><br />&nbsp;&nbsp; &nbsp;unittests：<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Django的unit tests使用的标准模块库是unittest。和doctests一样，Django的test runner 在<br /><br />&nbsp;&nbsp; &nbsp;models.py文件或者在app目录下存在的tests.py文件中查找定义了的unit test cases。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个与上例doctests等价的unittest test case如下：<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;import unittest<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;from myapp.models import Animal<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;class AnimalTestCase(unittest.TestCase):<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;def setUp(self):<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;self.lion = Animal.objects.create(name=&quot;lion&quot;, sound=&quot;roar&quot;)<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;self.cat = Animal.objects.create(name=&quot;cat&quot;, sound=&quot;meow&quot;)<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;def testSpeaking(self):<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;self.assertEquals(self.lion.speak(), 'The lion says &quot;roar&quot;')<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;self.assertEquals(self.cat.speak(), 'The cat says &quot;meow&quot;')<br /><br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;当你运行tests的时候，test utility会找到models.py 和tests.py文件中所有的test case,在这些<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;test case外自动构造一个test suite，并运行它。<br /><br />&nbsp;<br />&nbsp;&nbsp; &nbsp;我应该用哪种？<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 选择哪一个测试框架经常是有争议的，所以Django同时支持python的两种标注测试框架。选择哪一<br />&nbsp;&nbsp; &nbsp;个取决于程序员个人的爱好。Django对于两种测试框架给与相同的支持。因为每一种测试系统都有自身<br />&nbsp;&nbsp; &nbsp;的优点，所以最好的方法是将两者结合使用，使用对你测试最合适的测试系统。<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对于一个程序测试新手，这种选择可能会令人迷惑，所以这里给出了两种测试系统的一些诧异，以<br />&nbsp;&nbsp; &nbsp;帮助你选择一个适合你的。<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果你已经使用Python一段时间，doctest可能你会觉得doctest更Python一些。它让写测试尽<br />&nbsp;&nbsp; &nbsp;量简单，（so there&rsquo;s no overhead of writing classes or methods不知道咋翻译；（）你只是简单<br />&nbsp;&nbsp; &nbsp;的把测试代码放入了docstrings中。这样有一个附加的好处就是同时给modules提供了一份documentation<br />&nbsp;&nbsp; &nbsp;&mdash;&mdash;好的doctests可以兼顾test和documentation，一石二鸟。<br /><br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果你刚开始学习测试，那么doctests会让你快速入门。<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Unittest会让从java转过来的程序员觉得熟悉。因为unittest就是从Junit处获得灵感的。如果你<br />&nbsp;&nbsp; &nbsp;有使用过类似于Junit测试框架的经验，那unittest会让你更习惯些。<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Unittest是根据class和method组织的，如果你在为一些类似的代码写一系列测试，那么你可以使<br />&nbsp;&nbsp; &nbsp;用它的子集去抽象出它的共同任务。这样可以使你的代码小巧而整洁。它也提供直接的安装和卸载程序，<br />&nbsp;&nbsp; &nbsp;可以使你在一个更高的层面上控制你的test case 运行的环境。<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 重申，你可以并行的使用两种测试系统，甚至在同一个app中。大部分的项目都会用到这两种测试<br />&nbsp;&nbsp; &nbsp;系统。两个测试系统都能找到更适合自己的位置。<br /><br />运行tests<br />&nbsp;&nbsp; &nbsp;你可以使用下列语句运行你的测试<br />&nbsp;&nbsp; &nbsp;$ ./manage.py test<br />&nbsp;&nbsp; &nbsp;默认情况下,它会运行你项目里写在INSTALLED_APPS里所有app的测试. 如果你只想要测试其中某一个app,你比如说animals(假设你的INSTALLED_APPS里有两个app--myproject.polls和myproject.animals)&nbsp;&nbsp; &nbsp;,你可以运行以下<br />&nbsp;&nbsp; &nbsp;命令来达到目的<br />&nbsp;&nbsp; &nbsp;# ./manage.py test animals<br /><br />&nbsp;&nbsp; &nbsp;注意,我们使用了animals,而不是myproject.animals<br /><br />&nbsp;&nbsp; &nbsp;现在你可以(svn版本)针对更细力度的test class 或者 test method进行测试了.<br />&nbsp;&nbsp; &nbsp;比如你的animals app 的测试单元里有AnimalTestCase测试类,这个类拥有testFluffyAnimals这个测试方法.那么,你可以通过<br />&nbsp;&nbsp; &nbsp;$ ./manage.py test animals.AnimalTestCase<br />&nbsp;&nbsp; &nbsp;来只运行AnimalTestCase这个测试类,通过<br />&nbsp;&nbsp; &nbsp;$ ./manage.py test animals.AnimalTestCase.testFluffyAnimals<br />&nbsp;&nbsp; &nbsp;来运行testFluffyAnimals这个测试方法.<br /><br />测试数据库<br />&nbsp;&nbsp; &nbsp;测试运行需要的数据库并不需要你真实的数据库.一个单独的测试数据库会被创建.<br />&nbsp;&nbsp; &nbsp;不管你的测试是否通过,当你所有的测试都执行过后,这个测试数据库就会被销毁.<br />&nbsp;&nbsp; &nbsp;默认情况下,测试数据库的名字是test_DATABASE_NAME,DATABASE_NAME是你在settings.py里配置的数据库名.如果你需要给测试数据库一个其他的名字,在settings.py中指定TEST_DATABASE_NAME的值.<br />&nbsp;&nbsp; &nbsp;除了使用一个单独的数据库外,测试工具会使用相同的数据库配置--DATABASE_ENGINE, DATABASE_USER, DATABASE_HOST等等.创建测试数据库的用户由DATABASE_USER(settings中)指定,所以你需要确认DATABASE_USER<br />&nbsp;&nbsp; &nbsp;有足够的权限去创建数据库.<br /><br />理解test输出的内容<br />&nbsp;&nbsp; &nbsp;当你运行你的test后,你会看到一系列打印出来的信息.你可以在命令行中使用verbosity这个选项来控制输出信息的详细程度.<br /><br />&nbsp;&nbsp; &nbsp;Creating test database...<br />&nbsp;&nbsp; &nbsp;Creating table myapp_animal<br />&nbsp;&nbsp; &nbsp;Creating table myapp_mineral<br />&nbsp;&nbsp; &nbsp;Loading 'initial_data' fixtures...<br />&nbsp;&nbsp; &nbsp;No fixtures found.<br /><br />&nbsp;&nbsp; &nbsp;这段信息告诉你正在创建一个测试数据库.<br />&nbsp;&nbsp; &nbsp;当创建测试数据库后,Django就会运行你的test.如果你的所有测试都通过了,你会看到以下信息,<br />&nbsp;&nbsp; &nbsp;----------------------------------------------------------------------<br />&nbsp;&nbsp; &nbsp;Ran 22 tests in 0.221s<br /><br />&nbsp;&nbsp; &nbsp;OK<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;如果有test没有通过,你会看到没有通过的test的细节:<br />&nbsp;&nbsp; &nbsp;======================================================================<br />&nbsp;&nbsp; &nbsp;FAIL: Doctest: ellington.core.throttle.models<br />&nbsp;&nbsp; &nbsp;----------------------------------------------------------------------<br />&nbsp;&nbsp; &nbsp;Traceback (most recent call last):<br />&nbsp;&nbsp; &nbsp;&nbsp; File &quot;/dev/django/test/doctest.py&quot;, line 2153, in runTest<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; raise self.failureException(self.format_failure(new.getvalue()))<br />&nbsp;&nbsp; &nbsp;AssertionError: Failed doctest test for myapp.models<br />&nbsp;&nbsp; &nbsp;&nbsp; File &quot;/dev/myapp/models.py&quot;, line 0, in models<br /><br />&nbsp;&nbsp; &nbsp;----------------------------------------------------------------------<br />&nbsp;&nbsp; &nbsp;File &quot;/dev/myapp/models.py&quot;, line 14, in myapp.models<br />&nbsp;&nbsp; &nbsp;Failed example:<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; throttle.check(&quot;actor A&quot;, &quot;action one&quot;, limit=2, hours=1)<br />&nbsp;&nbsp; &nbsp;Expected:<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; True<br />&nbsp;&nbsp; &nbsp;Got:<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; False<br /><br />&nbsp;&nbsp; &nbsp;----------------------------------------------------------------------<br />&nbsp;&nbsp; &nbsp;Ran 2 tests in 0.048s<br /><br />&nbsp;&nbsp; &nbsp;FAILED (failures=1)<br /><br />&nbsp;&nbsp; &nbsp;一份完整的错误信息输出超出了本文档的范围,但这会让你更直观;)你可以去查看python的unittest库了解更多细节.<br /><br /><br />测试工具<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Django提供了一系列小工具用来写测试.<br />Test Client<br />&nbsp;&nbsp; &nbsp;test client是一个python类,来模拟一个简单的&ldquo;哑&rdquo;浏览器,允许你来测试你的view函数.<br />&nbsp;&nbsp; &nbsp;你可以使用test client完成下列事情.<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;模拟&quot;Get&quot;和&quot;Post&quot;请求,观察响应结果--从HTTP(headers,status codes)到页面内容.<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;测试url执行了正确的view函数.<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;测试一个request被Django模板渲染.<br /><br />&nbsp;&nbsp; &nbsp;Test Client无意于取代Twill,Selenium这些框架.Django有不同的专注点.<br /><br />概略<br />&nbsp;&nbsp; &nbsp;使用test client,需要引入django.test.client.Client<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&gt;&gt;&gt; from django.test.client import Client<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&gt;&gt;&gt; c = Client()<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&gt;&gt;&gt; response = c.post('/login/', {'username': 'john', 'password': 'smith'})<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&gt;&gt;&gt; response.status_code<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;200<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&gt;&gt;&gt; response = c.get('/customer/details/')<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&gt;&gt;&gt; response.content<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;'&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 ...'<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;如例所示,你需要实例化Client.<br /><br />&nbsp;&nbsp; &nbsp;test client运行机制<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;test client并不需要有Web server.这是因为test client避开了HTTP的额外开销,直接处理Django框架.这样就可以是unit test运行飞快.<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;当请求页面时需要指定url路径.不是整个域路径.<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;这是对的<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&gt;&gt;&gt; c.get('/login/')<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;这是错的<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&gt;&gt;&gt; c.get('http://www.example.com/login/')<br /><br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;test client不适合操作不是由Django建立的网站.如果,你非要如此,请使用python的标准库--urllib或者urllib2.<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;为了解析URl,test client使用由ROOT_URLCONF(settings.py)指定的URLconf<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;尽管上例可以在python内置环境里运行,一些test client的功能,尤其是模板相关的功能,只有在test运行时才可以使用.<br /><br /><br />Making requests<br /><br />&nbsp;&nbsp; &nbsp;可以使用django.test.client.Client类来构造request.它在构造时并不需要参数.<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&gt;&gt;&gt; c = Client()<br /><br />&nbsp;&nbsp; &nbsp;一个client实例可以调用下列方法：<br /><br />&nbsp;&nbsp; &nbsp;get(path, data={})：<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; 创建一个path的Get请求,并返回Response object.<br />&nbsp;&nbsp; &nbsp;Data字典的key-value值会被用来创建一个由Get得到的数据.如：<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;c = Client()<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;c.get('/customers/details/', {'name':'fred', 'age':7})<br />&nbsp;&nbsp; &nbsp;它与下述请求等价：<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;http://yoursite.com/customers/details/?name=fred&amp;age=7<br /><br />&nbsp;&nbsp; &nbsp;post(path, data={}, content_type=MULTIPART_CONTENT)<br />&nbsp;&nbsp; &nbsp;创建一个path的Get请求,并返回Response object.<br />&nbsp;&nbsp; &nbsp;Data字典的key-value值会被用来创建POST的数据.如：<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&gt;&gt;&gt; c = Client()<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&gt;&gt;&gt; c.post('/login/', {'name': 'fred', 'passwd': 'secret'})<br />&nbsp;&nbsp; &nbsp;它会请求'/login/'这个url,并发送数据name=fred&amp;passwd=secret&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;如果提供了content_type参数，data会被包含在POST请求里,以HTTP头Content-Type格式被发送.<br />&nbsp;&nbsp; &nbsp;如果没有提供,data会以multipart/form-data的content_type格式被发送.这样的话,Data字典的key-value值会作为multipart message进行编码，并创建一个post数据载体.<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;为一个参数提交多个多个值时--比如选住&lt;select multiple&gt;域的多个值--这些值可以是列表或者元组.举例来说,提交choice域的三个被选中的值:<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{'choices': ('a', 'b', 'd')}<br />&nbsp;&nbsp; &nbsp;提交文件是一个特殊情况.你需要提供你想要上传的文件的文件名和操作这个文件的File变量:<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&gt;&gt;&gt; c = Client()<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&gt;&gt;&gt; f = open('wishlist.doc')<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&gt;&gt;&gt; c.post('/customers/wishes/', {'name': 'fred', 'attachment': f})<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&gt;&gt;&gt; f.close()<br />&nbsp;&nbsp; &nbsp;注意:在你使用这个file后需要手动关闭它.<br /><br />&nbsp;&nbsp; &nbsp;login(**credentials)<br />&nbsp;&nbsp; &nbsp;如果你的网站使用了django的验证系统,你可以使用test client的login()方法去登录用户.<br />&nbsp;&nbsp; &nbsp;在你调用这个方法后,test client就会拥有登录用户所有的cookies 和 session.<br />&nbsp;&nbsp; &nbsp;credentials参数的格式取决于你是用的验证程序(authentication backend,有setting里的AUTHENTICATION_BACKENDS定义).如果你使用的是django默认提供的验证程序就应该是用户名和密码.<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&gt;&gt;&gt; c = Client()<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&gt;&gt;&gt; c.login(username='fred', password='secret')<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&gt;&gt;&gt; # Now you can access a view that's only available to logged-in users.<br />&nbsp;&nbsp; &nbsp;如果你使用了不同的验证程序,login就需要不同的credentials参数,它需要的值由你定义的authenticate()决定.<br />&nbsp;&nbsp; &nbsp;如果credentials通过验证,login()返回True,并登录成功.<br />&nbsp;&nbsp; &nbsp;<br /><br />&nbsp;&nbsp; &nbsp;最后,记住在使用login()方法前,你需要创建一个账户,因为我们创建的测试数据库默认是没有任何数据的.你可以使用Django model api去创建一个用户账号,或者使用test fixture.<br /><br />&nbsp;&nbsp; &nbsp;logout()<br />&nbsp;&nbsp; &nbsp;如果你的网站使用了django的验证系统,你可以使用test client的logout()方法注销用户.<br />&nbsp;&nbsp; &nbsp;在你调用这个方法后,test client就会清理所有的cookie和session数据.<br /><br />测试responses<br />&nbsp;&nbsp; &nbsp;get()和post()方法返回的都是Response object.这个Response object不同于view函数返回的HttpResponse.这个test Response object包含了更多的需要测试验证的数据.<br />&nbsp;&nbsp; &nbsp;具体说,一个Response拥有下列的属性.<br />&nbsp;&nbsp; &nbsp;属性 &nbsp;&nbsp; &nbsp;解释<br />&nbsp;&nbsp; &nbsp;client &nbsp;&nbsp; &nbsp;被用来生成request的TestClient<br />&nbsp;&nbsp; &nbsp;content &nbsp;&nbsp; &nbsp;response的主体,string类型,是view render后的页面的最终内容,或者是错误信息.<br />&nbsp;&nbsp; &nbsp;context &nbsp;&nbsp; &nbsp;用来渲染模板的template Context.如果页面使用了多个模板,那context就会是Context Object列表.它们的排序方式就是它们被渲染的顺序.<br />&nbsp;&nbsp; &nbsp;headers &nbsp;&nbsp; &nbsp;response的HTTP头,dict类型.<br />&nbsp;&nbsp; &nbsp;request &nbsp;&nbsp; &nbsp;作用于response的request数据<br />&nbsp;&nbsp; &nbsp;status_code response的状态码,integer数据.<br />&nbsp;&nbsp; &nbsp;template 被用来渲染最终的content的Template实例.template.name可以得到template的文件名,如果template是由文件载入的话(如 'admin/index.html').如果页面使用了多个模板,<br />&nbsp;&nbsp; &nbsp;那template就会是Template列表,它们的排序方式就是它们被渲染的顺序.<br />&nbsp;&nbsp; &nbsp;<br />Exceptions<br />&nbsp;&nbsp; &nbsp;如果你将TestClient指向了由view函数raise的异常,那这个异常在test case里是可见的.你可以使用标准的try...catch块或者unittest.TestCase.assertRaises()来测试它们.<br />&nbsp;&nbsp; &nbsp;对testclient唯一不可见的异常是Http404,PermissionDenied和SystemExit.django会在内部捕捉这些异常并返回合适的response.这种情况下,你可以查看下你的response.status_code.<br /><br />Persistent state<br />&nbsp;&nbsp; &nbsp;如果一个response返回了一个cookie,那么这个cookie就会被存储在test client里,并被其后的所有get()和post()传送.如果你想要终止这个cookie,你可以新建一个Client实例,或者手动删除它.(删除更有效)<br /><br />&nbsp;&nbsp; &nbsp;cookies python SimpleCookie object,包含了所有client cookies的当前值.<br />&nbsp;&nbsp; &nbsp;session 一个类似于dict的object,包含了sesion信息<br /><br />例子<br />&nbsp;&nbsp; &nbsp;import unittest<br />&nbsp;&nbsp; &nbsp;from django.test.client import Client<br /><br />&nbsp;&nbsp; &nbsp;class SimpleTest(unittest.TestCase):<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;def setUp(self):<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;# Every test needs a client.<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;self.client = Client()<br /><br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;def test_details(self):<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;# Issue a GET request.<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;response = self.client.get('/customer/details/')<br /><br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;# Check that the respose is 200 OK.<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;self.failUnlessEqual(response.status_code, 200)<br /><br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;# Check that the rendered context contains 5 customers.<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;self.failUnlessEqual(len(response.context['customers']), 5)<br /><br />TestCase<br />&nbsp;&nbsp; &nbsp;一般的python单元测试类要继承unittest.TestCase.django提供了一个子类--django.test.TestCase,提供了一些测试网站更有用的功能.<br />&nbsp;&nbsp; &nbsp;将一个普通的unittest.TestCase转换为django TestCase非常容易:仅仅需要将base class 由unittest.TestCase换成django.test.TestCase.所有的标准python单元测试会继续工作.<br /><br />默认的 test client<br />&nbsp;&nbsp; &nbsp;每一个test case都可以都可以访问test client.你也可以通过self.client访问它.<br /><br />&nbsp;&nbsp; &nbsp;这就意为着你不用在每个test方法中都实例化Client.<br />&nbsp;&nbsp; &nbsp;import unittest<br />&nbsp;&nbsp; &nbsp;from django.test.client import Client<br /><br />&nbsp;&nbsp; &nbsp;class SimpleTest(unittest.TestCase):<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; def test_details(self):<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client = Client()<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response = client.get('/customer/details/')<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.failUnlessEqual(response.status_code, 200)<br /><br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; def test_index(self):<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client = Client()<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response = client.get('/customer/index/')<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.failUnlessEqual(response.status_code, 200)<br /><br />&nbsp;&nbsp; &nbsp;用self.client来替换,就是<br />&nbsp;&nbsp; &nbsp;from django.test import TestCase<br /><br />&nbsp;&nbsp; &nbsp;class SimpleTest(TestCase):<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; def test_details(self):<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response = self.client.get('/customer/details/')<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.failUnlessEqual(response.status_code, 200)<br /><br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; def test_index(self):<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response = self.client.get('/customer/index/')<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.failUnlessEqual(response.status_code, 200)<br /><br />Fixture loading<br />&nbsp;&nbsp; &nbsp;如果数据库里没有数据,那么对于一个基于数据库的网站来说,test case并无多大的用处.为了给测试数据库加入测试数据更方便,django提供了载入fixtures的方法.<br />&nbsp;&nbsp; &nbsp;fixture是一系列的数据,django知道如何将它导入数据库.<br />&nbsp;&nbsp; &nbsp;创建fixture最直接的方法就是使用manage.py dumpdata.当然,这假设你的实际数据库里已经有数据了.<br /><br />&nbsp;&nbsp; &nbsp;注意:<br />&nbsp;&nbsp; &nbsp;如果你运行过manage.py syncdb命令,那么你已经使用过fixture了--只是你不知道而已:)当你使用syncdb去创建数据库时,Fixture--initial_data.<br />&nbsp;&nbsp; &nbsp;其他名字的Fixture可以通过manage.py loaddata命令手动安装.<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;一旦建立了一个fixture,并将它放在了django project文件内,你就可以在你的测试类里使用它了.]<br />&nbsp;&nbsp; &nbsp;from django.test import TestCase<br />&nbsp;&nbsp; &nbsp;from myapp.models import Animal<br /><br />&nbsp;&nbsp; &nbsp;class AnimalTestCase(TestCase):<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; fixtures = ['mammals.json', 'birds']<br /><br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; def setUp(self):<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Test definitions as before.<br /><br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; def testFluffyAnimals(self):<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # A test that uses the fixtures.<br /><br />&nbsp;&nbsp; &nbsp;这是具体发生的过程:<br />&nbsp;&nbsp; &nbsp;在setup()运行前,django会清空数据库,相当于你执行了syncdb.<br />&nbsp;&nbsp; &nbsp;然后,所有的fixture会被安装.在例子中,django会安装任何一个名字为mammals的JSON格式的fixture和名为birds的fixture数据.<br /><br />&nbsp;&nbsp; &nbsp;这种清空/载入行为对test case里的每一个test都会重复执行一次.<br /><br />Emptying the test outbox<br />
          <br/>
          <span style="color:red;">
            <a href="http://yimogod.javaeye.com/blog/153134#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 04 Jan 2008 17:05:03 +0800</pubDate>
        <link>http://yimogod.javaeye.com/blog/153134</link>
        <guid>http://yimogod.javaeye.com/blog/153134</guid>
      </item>
      <item>
        <title>ways on python</title>
        <author>yimogod</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yimogod.javaeye.com">yimogod</a>&nbsp;
          链接：<a href="http://yimogod.javaeye.com/blog/148305" style="color:red;">http://yimogod.javaeye.com/blog/148305</a>&nbsp;
          发表时间: 2007年12月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1.Windows 命令行采用cp936编码，因此urf8会乱码，可以这么解决<br />Str.decode(‘uft-8’).encode(‘cp936’)<br />2.数字转换成字符串—str(i)<br />字符串转换数字—string.atoi(s[, base]) base 代表进制. <br />3.声明一个可变长参数的函数，变量需以* 开始<br />4.lambda 是较特殊的声明函数方式.—fun = lambda 参数列表：表达式..不能在lambda中使用print 但可以在lambda中调用其它函数<br />5.文件目录常用函数:<br />得到当前路径os.getcwd()<br />获得目录内容os.listdir(path)<br />创建目录os.mkdir(path)—os.mkdir(‘e:\\book\\temp’)<br />	删除目录os.rmdir(path)<br />	判断是否有目录os.path.isdir(path)<br />	判断是否是文件os.path.isfile(path)<br />6.计算两端时间的秒数差<br />time_long = (time1-time2).days*SECONDS_ONE_DAY + (time1-time2).seconds
          <br/>
          <span style="color:red;">
            <a href="http://yimogod.javaeye.com/blog/148305#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 14 Dec 2007 12:23:25 +0800</pubDate>
        <link>http://yimogod.javaeye.com/blog/148305</link>
        <guid>http://yimogod.javaeye.com/blog/148305</guid>
      </item>
      <item>
        <title>django preview form 的一个问题</title>
        <author>yimogod</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yimogod.javaeye.com">yimogod</a>&nbsp;
          链接：<a href="http://yimogod.javaeye.com/blog/146143" style="color:red;">http://yimogod.javaeye.com/blog/146143</a>&nbsp;
          发表时间: 2007年12月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在用Django preview form 碰到一个问题...怀疑是Django 的bug<br /><br />当然也有可能是我的错误如果哪位同学也碰到，回下贴哈<br /><br />Django 在使用 preview form 处理BooleanField 时，如果BooleanField的值False，那么当你提交时，Django会把 BooleanField的值改为True，然后返回本页面...但如果BooleanField值为True的话,Django 会让你顺利执行...<br /><br /><span style="color: red"><strong>示例程序...<br />1. Is test 没有选中</strong></span><br /><br /><img src="http://farm3.static.flickr.com/2033/2083322110_f0e5c930f4_o.gif " /><br /><br /><span style="color: red"><strong>2. 我点击了Preview按钮</strong></span><br /><br /><img src="http://farm3.static.flickr.com/2105/2083322112_9846b84be4_o.gif " /><br /><strong><br /><span style="color: red">3.我点击了submit按钮,注意红笔...</strong></span><br /><br /><img src="http://farm3.static.flickr.com/2054/2083322114_36bb59601c_o.gif " /><br /><br /><span style="color: red"><strong>4.我点击了Preview按钮,显示仍与上图一样...<br />5.我再一次点击了submit按钮</strong></span><br /><img src="http://farm3.static.flickr.com/2406/2083322116_4925338827_o.gif " />
          <br/>
          <span style="color:red;">
            <a href="http://yimogod.javaeye.com/blog/146143#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 05 Dec 2007 12:04:50 +0800</pubDate>
        <link>http://yimogod.javaeye.com/blog/146143</link>
        <guid>http://yimogod.javaeye.com/blog/146143</guid>
      </item>
      <item>
        <title>点点滴滴pygame</title>
        <author>yimogod</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yimogod.javaeye.com">yimogod</a>&nbsp;
          链接：<a href="http://yimogod.javaeye.com/blog/126620" style="color:red;">http://yimogod.javaeye.com/blog/126620</a>&nbsp;
          发表时间: 2007年09月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div><font size="2" color="#000000" face="Arial">pygame 的一些方法：</font></div>
<div><font size="2" color="#000000" face="Arial"> <font color="#0000ff"> &nbsp;&nbsp;&nbsp; &nbsp; image＝ pygame.Surface((5, 5))&nbsp; －－surface 内的参数为元组，指的是创建的surface的矩形区域的大小。</font></font></div>
<div><font size="2" color="#000000" face="Arial"><font color="#0000ff"> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  </font></font></div>
<div><font size="2" color="#000000" face="Arial"><font color="#0000ff"> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  pygame.draw.circle(image, (R, G, B), (x, y),&nbsp; r) －－参如其名了;)</font></font></div>
<div><font size="2" color="#000000" face="Arial"><font color="#0000ff"> </font></font></div>
<div><font size="2" color="#000000" face="Arial"><font color="#0000ff"> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  <a name="Surface.get_rect">Surface.get_rect()－－得到surface 的矩形区域<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 返回值为Rect,一个覆盖整个surface的</a><a name="Surface.get_rect">rectangle.这个</a><a name="Surface.get_rect">rectangle在0,0的位置出现，它的宽高与这个&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; surface一样...</a><a name="Surface.get_rect"></a></font></font><font size="2" color="#000000" face="Arial"><a name="Surface.get_rect"></a></font></div>
<div><font size="2" color="#000000" face="Arial"> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  你可以给这个函数传参,让他出现在你需要的位置...</font></div>
<div><font size="2" color="#000000" face="Arial"> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  例如：<a name="Surface.get_rect">mysurf.get_rect(center=(100,100))<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp;&nbsp; 他就会出现在100，100的位置</a><a name="Surface.get_rect"><tt><br />
</tt></a>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp; </font></div>
<div><font size="3" color="#000000" face="Arial"><font size="2">&nbsp;&nbsp;&nbsp; &nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  x, y = pygame.mouse.get_pos() － － 返回鼠标的位置</font></font><font color="#000000" face="Arial"><a name="Surface.get_rect"><tt></tt></a><a name="Surface.get_rect"><tt></tt></a><br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  Rect.move_ip(x,y)－－将矩形移到(x,y)<em><a name="Rect.move_ip"></a></em></font> </div>
          <br/>
          <span style="color:red;">
            <a href="http://yimogod.javaeye.com/blog/126620#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 24 Sep 2007 15:07:08 +0800</pubDate>
        <link>http://yimogod.javaeye.com/blog/126620</link>
        <guid>http://yimogod.javaeye.com/blog/126620</guid>
      </item>
      <item>
        <title>generic views 新掌握的一个方法;)--extra_context</title>
        <author>yimogod</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yimogod.javaeye.com">yimogod</a>&nbsp;
          链接：<a href="http://yimogod.javaeye.com/blog/111718" style="color:red;">http://yimogod.javaeye.com/blog/111718</a>&nbsp;
          发表时间: 2007年08月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          今天要写一个程序的小模块---同一个网页里面,中间的内容区要显示所有的student,而在右侧边栏需要显示所有的class(班级;))<br />
<br />
起初已经写完了显示所有student的代码了，用的就是generic views----太爽了，仅用了很少很少的代码。<br />
<hr size="2" width="100%" />
<br />
newsList = {<br />
&nbsp;&nbsp;&nbsp; 'queryset': Student.objects.all(),<br />
}<br />
<br />
urlpatterns = patterns('',<br />
&nbsp;&nbsp;&nbsp; (r'^$', 'django.views.generic.list_detail.object_list',dict(paginate_by=20, **newsList)),<br />
)<br />
<hr size="2" width="100%" />
note<img src="/javascripts/fckeditor/editor/images/smiley/msn/omg_smile.gif" alt="" />: <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; paginate_by=20指每20个记录分页<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 默认的模版名字为&nbsp;&nbsp;&nbsp;&nbsp; (你的app名称)_list.html，如你的app为stu，那么默认模版就为stu_list.html<br />
<br />
接下来需求变更，要求我在同一页面显示class列表...<br />
<br />
呵呵,因为我比较懒,所以一来我不想修改现有代码，二来不愿意重新写views中关于查询数据库然后传递到模版等代码。我想generic views一定已经解决了同时传多个字典的情况了。呵呵，果然：你只需添加extra_context就可以了--还是非常少的代码<br />
<hr size="2" width="100%" />
newsList = {<br />
&nbsp;&nbsp;&nbsp; 'queryset': Student.objects.all(),<br />
&nbsp;&nbsp;&nbsp; 'extra_context': {<font color="#ff0000">'classes':</font> Class.objects.all()},<br />
}<br />
<br />
urlpatterns = patterns('',<br />
&nbsp;&nbsp;&nbsp; (r'^$', 'django.views.generic.list_detail.object_list',dict(paginate_by=20, **newsList)),<br />
)<br />
<hr size="2" width="100%" />
在模版里，你只需取classes的值就可以了，如：<br />
{% for item in <font color="#ff0000">classes</font>%}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<li>{{ item.<font color="#000000">classes_</font>name }}</li>
<br />
{% endfor %}
          <br/>
          <span style="color:red;">
            <a href="http://yimogod.javaeye.com/blog/111718#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 13 Aug 2007 14:28:04 +0800</pubDate>
        <link>http://yimogod.javaeye.com/blog/111718</link>
        <guid>http://yimogod.javaeye.com/blog/111718</guid>
      </item>
      <item>
        <title>测试驱动的一点疑问</title>
        <author>yimogod</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yimogod.javaeye.com">yimogod</a>&nbsp;
          链接：<a href="http://yimogod.javaeye.com/blog/106173" style="color:red;">http://yimogod.javaeye.com/blog/106173</a>&nbsp;
          发表时间: 2007年07月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left"><span style="FONT-SIZE: 10pt">测试驱动使用了也快一周了。总的感觉是，对于</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">web</span><span style="FONT-SIZE: 10pt"> 程序来说，</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">test</span><span style="FONT-SIZE: 10pt"> 时提示的错误并不能给开发者太多的信息，你必须时刻借助于网页的实<wbr></wbr>际提示在改正错误，并驱动程序产生。</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"></span></div>
<div style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left"><span style="FONT-SIZE: 10pt">你比如很简单的注册功能。我是从驱动产生</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">form</span><span style="FONT-SIZE: 10pt"> 开始的。</span></div>
<div style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left"><span style="FONT-SIZE: 10pt">首先通过断言</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">formerror</span><span style="FONT-SIZE: 10pt"> ，如果这个</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">form field</span><span style="FONT-SIZE: 10pt"> 为空，那么</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">response</span><span style="FONT-SIZE: 10pt"> 就会出现</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">This field is required</span><span style="FONT-SIZE: 10pt"> 的错误提示。</span><span style="FONT-SIZE: 10pt">而接下来的过程就会是非常难以掌控的。</span> </div>
<div style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left"><span style="FONT-SIZE: 10pt"></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"></span></div>
<div style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">Test</span><span style="FONT-SIZE: 10pt"> 一遍又一遍的提示我</span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">TemplateNotExist。</span></div>
<div style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"><font face="Arial">好吧，我配置urls.py，写了被映射的view 函数（只是简单的return HttpResponse（&lsquo;test&rsquo;） ）。</font></span></div>
<div style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">
<p><font face="Arial">可是，还是TemplateNotExist 。<br />
好的，继续（虽然我已经根据这个错误写了够多的代码了）-- 我又添加了form 文件，写了form 函数（当然是pass 了，我的目的是让This field </font><font face="Arial">is required 来驱动表单的实现），其他的文件作相应修改。</font></p>
<font face="Arial">
<p><br />
　　恩？怎么还是&ldquo;TemplateNotExist&rdquo;。<br />
　　如此继续的，到哪一步才将这个 TemplateNotExist错误给解决然后出现断言失败，我给忘了。但是就凭这一个断言我做的事也太多了。所以才会迷惑。 </p>
<p><br />
　　我直觉是我的测试驱动切入点（驱动产生form 开始）选择错误。可我想不出来更好的切入点。</p>
<p><br />
　　嘿嘿，给点建议呗。</p>
<p><br />
　　在后面写测试驱动&quot; 登录&quot; 的时候，我同样是从驱动产生form 开始的。但不同的是出现了test 错误，我不再根据test 错误的提示去走，而是启动服务器，其那里面看错误，直到test 里给的错误在我控制之内( 显示的是断言错误) ，可这样的话感觉不太是测试驱动了。</p>
<p><br />
　　嘿嘿，再给点建议呗。</p>
<p>&nbsp;</p>
</font></span></div>
          <br/>
          <span style="color:red;">
            <a href="http://yimogod.javaeye.com/blog/106173#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 27 Jul 2007 17:48:00 +0800</pubDate>
        <link>http://yimogod.javaeye.com/blog/106173</link>
        <guid>http://yimogod.javaeye.com/blog/106173</guid>
      </item>
      <item>
        <title>HTTP状态码</title>
        <author>yimogod</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yimogod.javaeye.com">yimogod</a>&nbsp;
          链接：<a href="http://yimogod.javaeye.com/blog/105770" style="color:red;">http://yimogod.javaeye.com/blog/105770</a>&nbsp;
          发表时间: 2007年07月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          　　号码 含义 <br />
----------------------------------------- <br />
&quot;100&quot; : Continue <br />
&quot;101&quot; : witching Protocols <br />
&quot;200&quot; : OK <br />
&quot;201&quot; : Created <br />
&quot;202&quot; : Accepted <br />
&quot;203&quot; : Non-Authoritative Information <br />
&quot;204&quot; : No Content <br />
&quot;205&quot; : Reset Content <br />
&quot;206&quot; : Partial Content <br />
&quot;300&quot; : Multiple Choices <br />
&quot;301&quot; : Moved Permanently <br />
&quot;302&quot; : Found <br />
&quot;303&quot; : See Other <br />
&quot;304&quot; : Not Modified <br />
&quot;305&quot; : Use Proxy <br />
&quot;307&quot; : Temporary Redirect <br />
&quot;400&quot; : Bad Request <br />
&quot;401&quot; : Unauthorized <br />
&quot;402&quot; : Payment Required <br />
&quot;403&quot; : Forbidden <br />
&quot;404&quot; : Not Found <br />
&quot;405&quot; : Method Not Allowed <br />
&quot;406&quot; : Not Acceptable <br />
&quot;407&quot; : Proxy Authentication Required <br />
&quot;408&quot; : Request Time-out <br />
&quot;409&quot; : Conflict <br />
&quot;410&quot; : Gone <br />
&quot;411&quot; : Length Required <br />
&quot;412&quot; : Precondition Failed <br />
&quot;413&quot; : Request Entity Too Large <br />
&quot;414&quot; : Request-URI Too Large <br />
&quot;415&quot; : Unsupported Media Type <br />
&quot;416&quot; : Requested range not satisfiable <br />
&quot;417&quot; : Expectation Failed <br />
&quot;500&quot; : Internal Server Error <br />
&quot;501&quot; : Not Implemented <br />
&quot;502&quot; : Bad Gateway <br />
&quot;503&quot; : Service Unavailable <br />
&quot;504&quot; : Gateway Time-out <br />
&quot;505&quot; : HTTP Version not supported
          <br/>
          <span style="color:red;">
            <a href="http://yimogod.javaeye.com/blog/105770#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 27 Jul 2007 17:27:00 +0800</pubDate>
        <link>http://yimogod.javaeye.com/blog/105770</link>
        <guid>http://yimogod.javaeye.com/blog/105770</guid>
      </item>
      <item>
        <title>一个django测试的例子----验证登录时id不存在的情况</title>
        <author>yimogod</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yimogod.javaeye.com">yimogod</a>&nbsp;
          链接：<a href="http://yimogod.javaeye.com/blog/104774" style="color:red;">http://yimogod.javaeye.com/blog/104774</a>&nbsp;
          发表时间: 2007年07月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 今天盯着代码看了一下午，通过django官方的测试源代码，解决了一个难我一天的问题。哈哈，生怕忘记，赶紧志之。</p>
<p>情形描述：</p>
<p>&nbsp;&nbsp;&nbsp; 我已经有了登录的代码：</p>
<p><font face="Arial">def login(request):<br />
&nbsp;&nbsp;&nbsp; if request.method=='POST':<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; form = LoginForm(request.POST)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if form.is_valid():<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m = User.objects.get(id=request.POST['id'])<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; except ObjectDoesNotExist:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return HttpResponse(&quot;<font color="#ff0000">There is no the id</font>&quot;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if m.password == request.POST['password']:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; request.session['id'] = m.id<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return HttpResponseRedirect('/accounts/loginok')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return HttpResponse(&quot;Your username and password didn't match.&quot;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; else:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; form = LoginForm()<br />
&nbsp;&nbsp;&nbsp; return render_to_response('accounts/login.html',{'form':form})</font></p>
<p>现在我想测试当我的id不存在时会否显示&nbsp; <font color="#ff6600">'There is no the i</font>d'</p>
<p>那么我的思路是：先client().post到这个登录地址，然后传入错误的字典数据迫使它返回<font color="#ff0000">There is no the id，<font color="#000000">在然后用</font><font face="Arial"><font color="#000000">self.assertContains去判断放回的response是否包含</font>&quot;<font color="#ff0000">There is no the id</font>&quot;.</font></font></p>
<p><font color="#ff0000"><font color="#000000">而让我为难的问题就是如何迫使网页返回</font><font color="#ff0000">There is no the id！</font></font></p>
<p>我起初先写了如下代码：</p>
<p><font face="Arial">class testLogin(TestCase):<br />
&nbsp;&nbsp;&nbsp; def setUp(self):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.client = Client()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; User.objects.create(id='test1',password='testtest',email='test1@test.com')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; User.objects.create(id='test2',password='testtest',email='test2@test.com')<br />
&nbsp;&nbsp;&nbsp; def testNoID(self):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; user = {'id':'test','password':'test'}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; form = LoginForm(user)&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response = self.client.post('/accounts/',{'form':form})</font><font face="Arial"></font></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#ff6600">.......................</font><br />
&nbsp;&nbsp;&nbsp;&nbsp; def tearDown(self):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pass</p>
<p><font color="#ff6600">.......................</font><font color="#000000">代表要添加代码的地方，而不是俺写了代码在此省略;)</font></p>
<p>上面代码的testNoID函数中模拟了错误的id并发送请求到了登录页面。如果你此时print response ,就会发现response里是你的&lt;form&gt;&lt;/form&gt;代码。那如何继续让程序提交这些数据进而得到包含&ldquo;<font color="#ff0000">There is no the id</font>&rdquo; 的response呢？</p>
<p>我刚开始以为这个form或response有手动提交数据的函数，可找了半天，form有--isvalid。可我form提交过并没有返回我想要的东西（当然，也可能因为俺英文次，官方文档的一些东西没看明白----事实上，这种情况时有发生）。</p>
<p>然后就开始漫长的试图在官方文档和django自带的源码中寻找蛛丝马迹的旅程。当我快要放弃的时候，一段代码引起了我的注意（当然，这段代码我已经看了好多遍了，只是之前没有引起足够的重视而起）：</p>
<p><font face="Arial">def test_valid_form_with_hints(self):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;GET a form, providing hints in the GET data&quot;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hints = {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'text': 'Hello World',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'multi': ('b','c','e')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response = self.client.get('/test_client/form_view/', data=hints)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.assertEqual(response.status_code, 200)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.assertTemplateUsed(response, &quot;Form GET Template&quot;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Check that the multi-value data has been rolled out ok<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.assertContains(response, 'Select a valid choice.', 0)</font></p>
<p>这段代码位于&quot;<font face="Arial">D:\django\tests\modeltests\test_client\models.py</font>&quot;中：然后我就有了如下代码----顺利达到目的：</p>
<p><font face="Arial">class testLogin(TestCase):<br />
&nbsp;&nbsp;&nbsp; def setUp(self):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.client = Client()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; User.objects.create(id='test1',password='testtest',email='test1@test.com')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; User.objects.create(id='test2',password='testtest',email='test2@test.com')<br />
&nbsp;&nbsp;&nbsp; def testNoID(self):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000"> user = {'id':'test','password':'test'}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response = self.client.post('/accounts/',user)<br />
</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print response<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.assertContains(response, 'There is no the id')<br />
&nbsp;&nbsp;&nbsp; def tearDown(self):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pass</font></p>
<p>注意加红部分!看来缺乏对django深入的认识真的让人进度缓慢啊</p>
          <br/>
          <span style="color:red;">
            <a href="http://yimogod.javaeye.com/blog/104774#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 24 Jul 2007 17:05:56 +0800</pubDate>
        <link>http://yimogod.javaeye.com/blog/104774</link>
        <guid>http://yimogod.javaeye.com/blog/104774</guid>
      </item>
      <item>
        <title>关于Django-newforms的一些学习</title>
        <author>yimogod</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yimogod.javaeye.com">yimogod</a>&nbsp;
          链接：<a href="http://yimogod.javaeye.com/blog/103114" style="color:red;">http://yimogod.javaeye.com/blog/103114</a>&nbsp;
          发表时间: 2007年07月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <ul>
    <li>模版只需要提供&lt;form&gt;&lt;/form&gt;框架即可，Django会根据forms数据自动进行填充</li>
    <li>forms数据提供表单中的具体控件，我一般都将forms数据放入新建的forms.py文件中</li>
    <li>models提供与forms数据对应的数据库构造，当然你也可以在models中什么都不写，在views需要的时候从别的app中导入model class即可</li>
    <li>views主要处理根据forms提供的数据渲染模版，同时处理得到的用户输入的数据，并重新定向网页流程。一般views中都有一个大的框架，如官方网站的 例子：
    <pre class="literal-block">def contact(request):
    if request.method == 'POST':
        form = ContactForm(request.POST)
        if form.is_valid():
            # Do form processing here...
            return <font color="#ff9900">HttpResponseRedirect('/url/on_success/')</font>
    else:
        form = ContactForm()
    return <font color="#ff6600">render_to_response('contact.html', {'form': form})</font>
注意到加色代码，它要返回不同的response,所以你的urls.py文件中需要相应的配合一下</pre>
    </li>
    <li>
    <pre class="literal-block">再就是俺在学习过程中遇到的一个问题：我的代码都运行正常，服务器也没有报错，可就是浏览器一片白。搞半天才突然</pre>
    </li>
</ul>
<pre class="literal-block">      想起来，改变了浏览器的编码就可起正常显示了</pre>
          <br/>
          <span style="color:red;">
            <a href="http://yimogod.javaeye.com/blog/103114#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 20 Jul 2007 09:10:51 +0800</pubDate>
        <link>http://yimogod.javaeye.com/blog/103114</link>
        <guid>http://yimogod.javaeye.com/blog/103114</guid>
      </item>
      <item>
        <title>呵呵，早知道就好了</title>
        <author>yimogod</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yimogod.javaeye.com">yimogod</a>&nbsp;
          链接：<a href="http://yimogod.javaeye.com/blog/102482" style="color:red;">http://yimogod.javaeye.com/blog/102482</a>&nbsp;
          发表时间: 2007年07月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>自己的英文水平非常有限，这段日子自学Django时看官方英文文档简直要把我愁死。好不容易在金山词霸的帮助下读了6成懂，昨天忽然发现啄木鸟上已经有中文翻译的了，呵呵。早知道就好了</p>
<p>网址<font face="Arial"><a href="http://www.woodpecker.org.cn/obp/django/django-faq/TableOfContents.html">http://www.woodpecker.org.cn/obp/django/django-faq/TableOfContents.html</a></font></p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://yimogod.javaeye.com/blog/102482#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 18 Jul 2007 17:42:42 +0800</pubDate>
        <link>http://yimogod.javaeye.com/blog/102482</link>
        <guid>http://yimogod.javaeye.com/blog/102482</guid>
      </item>
      <item>
        <title>关于Django测试框架的学习2</title>
        <author>yimogod</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yimogod.javaeye.com">yimogod</a>&nbsp;
          链接：<a href="http://yimogod.javaeye.com/blog/100695" style="color:red;">http://yimogod.javaeye.com/blog/100695</a>&nbsp;
          发表时间: 2007年07月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          testClient可以making request:<br />
<span class="anchor" id="line-21"></span>&nbsp;&nbsp; 就是创建一个client，其在构造时不需要参数。当其实例化后就可以调用get(path, data={}),post(path, data={},content_type=MULTIPART_CONTENT),<br />
<span class="anchor" id="line-22"></span>login(path, username, password)方法。<br />
<span class="anchor" id="line-23"></span>&nbsp;&nbsp;&nbsp; login方法是专为登录测试设计的。Django提示the test suite(不明白是否但对于login而言)要与数据库交互，如果数据库为空，则login不能正常工作，因此要求提供测试用的数据 。<br />
<span class="anchor" id="line-24"></span>testClient也可以Testing Response：<br />
<span class="anchor" id="line-25"></span>&nbsp;&nbsp;&nbsp; get()、post()和login()方法都可以返回一个Response对象。这个Response对象提供了4个属性已达到测试目的：context,template,status_code,content<br />
<span class="anchor" id="line-26"></span>testClient也可以处理Exceptions和持久化状态(Persistent state,指的是session and cookies):<br />
<span class="anchor" id="line-27"></span><br />
<span class="anchor" id="line-28"></span>&nbsp;&nbsp;&nbsp; 对于Persistent state，Test Client 表述为：如果返回的 response 中包含一个cookie,这个cookie就会被一个Client实例作为一个request的部分分发出去。如果你想终止这个cookie，你可以手动删除，也可以新建一个Client实例--但这样会删除你所有的cookies。<br />
<span class="anchor" id="line-29"></span>&nbsp;&nbsp;&nbsp; Fixtures：它应该在pyUnit中也有所体现，但好像是在pyUnit中没有专门提出来（估计也可能没有读懂pyUnit的帮助文档，回头温习下----补充如果按照Junit来说fixture就是测试运行的一组先决条件和假设。它是测试运行的上下文环境，其中包括TestCase中的实例变量、setUp()方法以及测试方法的局部变量和局部设置代码，而这似乎与Django的Fixtures不同）。<br />
<span class="anchor" id="line-30"></span>&nbsp;&nbsp;&nbsp; Fixtures的来源----如果一个数据库里没有任何数据的话，那么一个对于基于数据库的web程序的test case并无大用。为了使更易于向数据库中添加测试数据，Django提供了Fixtures框架.<br />
<span class="anchor" id="line-31"></span>&nbsp;&nbsp; Fixture是一个文件的集合，它包含了一个数据库的序列化的内容。每一个Fixture都要有一个独一无二的名字。同时一个Fixture所包含的文件可以来源于不同的程序或者不同的目录。
          <br/>
          <span style="color:red;">
            <a href="http://yimogod.javaeye.com/blog/100695#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 13 Jul 2007 12:13:00 +0800</pubDate>
        <link>http://yimogod.javaeye.com/blog/100695</link>
        <guid>http://yimogod.javaeye.com/blog/100695</guid>
      </item>
      <item>
        <title>关于Django测试框架的学习1</title>
        <author>yimogod</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yimogod.javaeye.com">yimogod</a>&nbsp;
          链接：<a href="http://yimogod.javaeye.com/blog/100689" style="color:red;">http://yimogod.javaeye.com/blog/100689</a>&nbsp;
          发表时间: 2007年07月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          关于django测试框架的学习<br />
<span class="anchor" id="line-52"></span>django内置两种测试框架：doctests and unit tests<br />
<span class="anchor" id="line-53"></span>doctests 是把测试代码写入models.py或者tests.py的docstring(注释)中，更适合用python多时的人使用，<br />
<span class="anchor" id="line-54"></span>unit tests与Junit相似，适合初学者和从junit等相关方面转过来的开发者使用<br />
<span class="anchor" id="line-55"></span><br />
<span class="anchor" id="line-56"></span>其测试工具同样有两种：Test Client and Fixtures(预设环境？)<br />
<span class="anchor" id="line-57"></span><br />
<span class="anchor" id="line-58"></span>The Test Client is a simple dummy browser，它就是模拟request，观察reponse。django建议将之与一些Browser Automation框架一起使用(俺还不知道啥意思)
          <br/>
          <span style="color:red;">
            <a href="http://yimogod.javaeye.com/blog/100689#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 13 Jul 2007 12:01:00 +0800</pubDate>
        <link>http://yimogod.javaeye.com/blog/100689</link>
        <guid>http://yimogod.javaeye.com/blog/100689</guid>
      </item>
      <item>
        <title>关于Django的学习</title>
        <author>yimogod</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yimogod.javaeye.com">yimogod</a>&nbsp;
          链接：<a href="http://yimogod.javaeye.com/blog/100688" style="color:red;">http://yimogod.javaeye.com/blog/100688</a>&nbsp;
          发表时间: 2007年07月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Django开发web application的一般流程（自己的理解，会随时修改）<br />
<span class="anchor" id="line-39"></span>1。startproject ,startapp<br />
<span class="anchor" id="line-40"></span>2。为app和database配置setting.py<br />
<span class="anchor" id="line-41"></span>3。写models.py(构建model类)<br />
<span class="anchor" id="line-42"></span>4。测试下数据库(最好)<br />
<span class="anchor" id="line-43"></span>5。在python命令行中给django建立好的数据库添加数据(可选)<br />
<span class="anchor" id="line-44"></span>6。写views.py以便可以调要template(controller)<br />
<span class="anchor" id="line-45"></span>7。templates为配置setting.py(工作习惯，可以与2合并)<br />
<span class="anchor" id="line-46"></span>8。在templates中添加模版.html<br />
<span class="anchor" id="line-47"></span>9。配置urls.py<br />
<span class="anchor" id="line-48"></span>10。运行<br />
          <br/>
          <span style="color:red;">
            <a href="http://yimogod.javaeye.com/blog/100688#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 13 Jul 2007 11:58:34 +0800</pubDate>
        <link>http://yimogod.javaeye.com/blog/100688</link>
        <guid>http://yimogod.javaeye.com/blog/100688</guid>
      </item>
  </channel>
</rss>