一步一步学Django第1页第一讲入门1开篇Django是新近出来的Rails方式的web开发框架。在接触Django之前我接触过其它几种Python下的webframework,但感觉Karrigell是最容易上手的。不过Django从我个人的感觉上来看,它的功能更强大,社区也很活跃,高手众多,发展也是极为迅速。3Django的入门体验但Django呢?如果说最简单的web体验Hello,Django!如何写呢?决不会象Karrigell那样简单,只从它提供的教程来看,你无法在安装后非常Easy地写出一个Hello,Django!的例子,因为有一系列的安装和准备工作要做。那么下面我把我所尝试写最简单的Hello,Django!的例子写出来。请注意,我测试时是在WindowsXP环境下进行的。3.1安装pythonsetup.pyinstall参考文档Djangoinstalled,一般地,Django安装前还需要先安装setuptools包。可以从PyPI上搜到。目前最新的版本是0.95版,可以从Django的主页上面下载。如果你想从老的0.91迁移到最新版本,可以参阅RemovingTheMagic文档。安装后,建议检查pythoninstalldir/Scripts目录是否在你的PATH环境中,如果不在,建议将这个目录设置到PATH中。因为如果你采用标准的Python安装方法,那么Django会自动在Scripts目录下安装django-admin.py程序。这样,一旦你设置了Scripts在PATH中,就可以在命令行下任何目录中执行django-admin.py了。3.2生成项目目录因为Karrigell可直接开发,因此放在哪里都可以。而Django是一个框架,它有特殊的配置要求,因此一般不需要手工创建目录之类的工作,Django提供了django-admin.py可以做这件事。为使用django-admin.py,建议将Python的Scripts目录加入到PATH环境变量中去。django-admin.pystartprojectnewtest这样就在当前目录下创建了一个newtest目录,进去入可以看到有四个文件:这个newtest将是我们以后工作的目录,许多讲解都是基于这个目录的。__init__.py表示这是一个Python的包manage.py提供简单化的django-admin.py命令,特别是可以自动进行DJANGO_SETTINGS_MODULES和PYTHONPATH的处理,而没有这个命令,处理上面环境变量是件麻烦的事情settings.py它是django的配置文件uls.pyurl映射处理文件,Django的url映射是url对某个模块方法的映射,目前不能自动完成在0.91版,django-admin.pystartproject会生成apps目录。但0.95版之后已经没有了。虽然django-admin.py为我们生成了许多东西,而且这些东西在以后的开发中你都需要熟悉,但现在我们的目标是最简单的体验,就认为我们不需要知道它们都有什么用吧。项目创建好了,那么我们可以启动服务器吗?Django为了开发方便,自带了一个用于开发的webserver。在0.91版,你需要至少修改一下settings.py中的DATABASE_ENGINE,如果你不改,那么Django会报错。在0.95版之后,不再需要设置了。3.3.1启动webserver:别急呀,还没看见Hello,Django!在哪里呢。是的,我只是想看一看,Django能否启动。manage.pyrunserver一步一步学Django第2页一旦出现:Validatingmodels...0errorsfound.Startingserveronport8000withsettingsmodule'newtest.settings'.Goto(Unix)orCTRL-BREAK(Windows).说明Django真的启来了。在浏览器中看一下,有一个祝贺页面,说明成功了。3.3.2更改主机或端口默认情况下,runserver命令在8000端口启动开发服务器,且只监听本机连接。要想要更改服务器端口的话,可将端口作为命令行参数传入:pythonmanage.pyrunserver8080还可以改变服务器监听的IP地址。要和其他开发人员共享同一开发站点的话,该功能特别有用。下面的命令:pythonmanage.pyrunserver0.0.0.0:8080会让Django监听所有网络接口,因此也就让其它电脑可连接到开发服务器了3.4增加一个helloworld的app吗?在Django中绝大多数应用都是以app形式存在的,但一定要加吗?其实并不一定。在Django中,每个app就是一个子包,真正调用时需要通过URLDispatch来实现url与模块方法的映射。这是Django的一大特色,但也是有些麻烦的地方。不用它,你无法发布一个功能,如果在Django中存在一种缺省的简单映射的方式,这样我想可以大大提高Django的入门体验度。不过在比较大的项目中,使用app还是一个非常好的方式,它可将项目功能进行分割,以便组织和代码的重用。因此根据URLDispatch的机制,我们只要保证Django可以在正确的地方找到方法进行调用即可。那么我们就根本不去创建一个app了。在newtest目录下建一个文件helloworld.py内容为:fromdjango.httpimportHttpResponsedefindex(request):returnHttpResponse(Hello,Django.)0.95版之后对许多Django模块都做了简化。具体可参考:NamespaceSimplification文档。3.5修改urls.pyfromdjango.conf.urls.defaultsimport*urlpatterns=patterns('',#Example:#(r'^newtest/',include('newtest.apps.foo.urls.foo')),(r'^$','newtest.helloworld.index'),一步一步学Django第3页#Uncommentthisforadmin:#(r'^admin/',include('django.contrib.admin.urls')),)上面的r'^$'是为了匹配空串,也就是形如:。如果这时webserver已经启动了,那么直接刷新页面就行了。现在觉得Django是不是简单多了,除了创建一个项目的操作,然后可能要修改两个配置文件。4结论Django本身的确是一种松散的框架组合,它既复杂又简单。复杂是因为如果你想使用它的自动化的、高级的功能你需要学习很多的东西,而且它的教程一上来就是以这种过于完整的例子进行展示,自然会让你觉得很麻烦。不过看了我的讲解之后,是不是觉得还是挺简单的。那么我们就先以无数据库的方式进行下去,一点点地发掘Django的功能特性吧。第二讲生成一个webform做加法的简单例子1引言随着学习,我们的例子也开始复杂了,下一步我想实现一个简单的web加法器。界面会是这样:如何处理页面表格提交的数据,并且会对URLDispatch作更进一步的解释。2创建add.py文件我们先创建一个add.py文件。(由于我们还没有涉及到Django的模型,因此象add.py这样的东西叫什么呢?还是称其为View吧。因为在django中,View是用来显示的,它代替了一般的MVC中的Control的作用,因为Django中不是MVC而是MTV(ModelTemplateView))fromdjango.httpimportHttpResponsetext=formmethod=postaction=/add/inputtype=textname=avalue=%d+inputtype=textname=bvalue=%dinputtype=submitvalue==inputtype=textvalue=%d/formdefindex(request):ifrequest.POST.has_key('a'):a=int(request.POST['a'])b=int(request.POST['b'])else:a=0b=0returnHttpResponse(text%(a,b,a+b))请注意action为/add/,在Django中链接后面一般都要有'/',不然有可能得不到POST数据。有关更详细的关于常见问题可以参阅NewbieMistakes文档。这里只有一个index方法。所有在view中的方法第一个参数都会由Django传入request对象,它就是请求数据对象,它是由Django自动生成。其中有GET和POST属性,分别保存两种不同的提交方式的数据,它们都可以象字典一样工作。更多关于request的内容参见Requestandresponseobjects文档。那么我的想法就是:进入页面后(就是上面的效果),页面上有两个输入文本框,一个是提交按钮,一个是显示结果的文本框。在两个输入文本框中输入整数,然后点击提交(=号按钮),将返回相同的页面,但结果文本框中将显示两数相加的和。两个输入文本框分别定义为a和b。这里的逻辑就是:先判断POST数据中是否有变量a,如果没有则表示是第一次进入,则a,b初始为0,然后返回页面。如果有变量a,则计算结果,返回页面。3修改urls.py,增加add的url映射。一步一步学Django第4页fromdjango.conf.urls.defaultsimport*urlpatterns=patterns('',#Example:#(r'^testit/',include('newtest.apps.foo.urls.foo')),(r'^$','newtest.helloworld.index'),(r'^add/$','newtest.add.index'),#Uncommentthisforadmin:#(r'^admin/',include('django.contrib.admin.urls')),)4启动server5在浏览器测试:你会看到和我相似的界面,然后输入整数试一试。6补充说明1.在form中的method=post。你当然可以使用get,但是在Django的设计风格中认为,使用POST表示要对数据进行修改,使用GET则只是获取。2.Django提供了URLDispatch文档,专门讲解有关url映射的东西。其中有一部分是关于url的正则表达式解析的。原本我认为象Karrigell中一样,定义在form中的变量会自动映射为方法的参数,但是我错了。方法中的参数是从url中通过正则表达式解析出来的,或者是在url_conf(即urls.py文件)中指定的。因此它与Karrigell一点也不一样。因此,如果你想从POST或GET数据中得到值,那么象我一样去做好了。使用request.POST或request.GET或还有一个可以“统吃”的方法request.REQUEST,它们是一个字典数据,使用起来也算方便。从这里我更想了解方法中参数的使用,当然这个例子并没有,有机会再使用吧。关于正则表达式解析参数在blog和rss中用得是非常多的。第三讲使用Template的简单例子1引言从上一例我们看到,表格的生成是直接在index()函数中返回的HTML代码,这种混合方式对于大型开发非常不好,下面我们就学习模板的使用。Django自带有模板系统,但你可以不使用它,只要在return前使用自已