主要内容
1. Django框架发展
2. Django架构,MTV模式
3. 开发流程
4. 开发实例——Poll
python下各种框架
一个完整的Web应用框架包括下面功能的支持
服务发布
URL分发
模板支持
数据库处理
Python框架一般都支持前3个方面,按对4个功能的支持情况分类如下:
平台性框架:不依赖数据库,更关注服务的高校构建和运行平台的稳定。代表性框架:Zope和Twisted
轻小型框架:认为数据库不是应用的必要因素,更关注友好快速的简单任务的开发。代表性框架:Cherry,Quixote和web.py,没有内置的数据库支持模块。
一站式框架:认为数据库是应用的重要因素,关注如何仅基于本身快速实现一个功能性网站。代表性框架:Django,TurboGears
Django简介
Django(*) Django是一个开放源代码的Web应用框架,由Python写成。采用了MVC的软件设计模式,即模型M,视图V和控制器C。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的。并于2005年7月在BSD许可证下发布。这套框架是以比利时的吉普赛爵士吉他手Django Reinhardt来命名的。
Django的主要目标是使得开发复杂的、数据库驱动的网站变得简单。Django注重组件的重用性和“可插拔性”,敏捷开发和DRY法则(Don't Repeat Yourself)。在Django中Python被普遍使用,甚至包括配置文件和数据模型。
Django 于 2008年6月17日正式成立基金会。
Django吸引人的特点
在Python各种web框架中,Django的文档最完善、市场占有率最高、招聘职位最多!
优点
l 完美的文档,Django的成功,我觉得很大一部分原因要归功于Django近乎完美的官方文档(包括Djangobook)。
l 全套的解决方案,Django象Rails一样,提供全套的解决方案(full-stackframework + batteries included),基本要什么有什么(比如:cache、session、feed、orm、geo、auth),而且全部Django自己造,开发网站应手的工具Django基本都给你做好了,因此开发效率是不用说的,出了问题也算好找,不在你的代码里就在Django的源码里。
l 强大的URL路由配置,Django让你可以设计出非常优雅的URL,在Django里你基本可以跟丑陋的GET参数说拜拜。
l 自助管理后台,admin interface是Django里比较吸引眼球的一项contrib,让你几乎不用写一行代码就拥有一个完整的后台管理界面。
缺点(源自Django坚持自己造所有的*,整个系统相对封闭)
l 系统紧耦合,如果你觉得Django内置的某项功能不是很好,想用喜欢的第三方库来代替是很难的,比如下面将要说的ORM、Template。要在Django里用SQLAlchemy或Mako几乎是不可能,即使打了一些补丁用上了也会让你觉得非常非常别扭。
l Django自带的ORM远不如SQLAlchemy强大,除了在Django这一亩三分地,SQLAlchemy是Python世界里事实上的ORM标准,其它框架都支持SQLAlchemy了,唯独Django仍然坚持自己的那一套。Django的开发人员对SQLAlchemy的支持也是有过讨论和尝试的,不过最终还是放弃了,估计是代价太高且跟Django其它的模块很难合到一块。
l Template功能比较弱,不能插入Python代码,要写复杂一点的逻辑需要另外用Python实现Tag或Filter。
l URL配置虽然强大,但全部要手写,这一点跟Rails的Conventionover configuration的理念完全相左,高手和初识Django的人配出来的URL会有很大差异。
l 让人纠结的auth模块,Django的auth跟其它模块结合紧密,功能也挺强的,就是做的有点过了,用户的数据库schema都给你定好了,这样问题就来了,比如很多网站要求email地址唯一,可schema里这个字段的值不是唯一的,纠结是必须的了。
l Python文件做配置文件,而不是更常见的ini、xml或yaml等形式。这本身不是什么问题,可是因为理论上来说settings的值是能够动态的改变的(虽然大家不会这么干),但这不是最佳实践的体现。
Django大包大揽,用它来快速开发一些Web运用是很不错的。如果你顺着Django的设计哲学来,你会觉得Django很好用,越用越爽;相反,你如果不能融入或接受Django的设计哲学,你用Django一定会很痛苦,趁早放弃的好。
组件
Django框架的核心包括:一个 面向对象 的映射器,用作数据模型(以Python类的形式定义)和关联性数据库间的媒介;一个基于正则表达式的URL分发器;一个视图系统,用于处理请求;以及一个模板系统。
核心框架中还包括:
l 一个轻量级的、独立的Web服务器,用于开发和测试。
l 一个表单序列化及验证系统,用于HTML表单和适于数据库存储的数据之间的转换。
l 一个缓存框架,并有几种缓存方式可供选择。
l 中间件支持,允许对请求处理的各个阶段进行干涉。
l 内置的分发系统允许应用程序中的组件采用预定义的信号进行相互间的通信。
l 一个序列化系统,能够生成或读取采用XML或JSON表示的Django模型实例。
l 一个用于扩展模板引擎的能力的系统。
内置应用
Django 包含了很多应用在它的"contrib"包中,这些包括:
- 一个可扩展的认证系统
- 动态站点管理页面
- 一组产生 RSS 和 Atom 的工具
- 一个灵活的评论系统
- 产生Google 站点地图 (Google Sitemaps)的工具
- 防止跨站请求伪造(cross-site request forgery)的工具
- 一套支持轻量级标记语言(Textile和Markdown)的模板库
- 一套协助创建地理信息系统(GIS)的基础框架
服务的部署
Django 可以运行在启用了 mod python 的 Apache 2上,或是任何WSGI兼容的Web服务器。Django也有启动FastCGI服务的能力,因此能够应用于任何支持FastCGI的机器上。
下列数据库引擎被Django官方支持:
MicrosoftSQL Server的适配器正在开发中,处于试验阶段。(注:SQL Server的支持在1.0版本中已经被完全去除)
Django1.0已经可以利用Jython运行在任何J2EE服务器。
开发简单应用的步骤
1. 进入目标文件夹,建立项目django-admin.pystartproject mysite。Django框架自动为我们建立所需要的项目文件夹和一些配置文件
2. 进入项目文件夹,建立应用django-admin.py startapppolls。Django框架会自动生成所需要的models.py和views.py等文件
3. 编辑settings.py,将新建的应用Polls,加入到项目中,INSTALLEN_APPS加入一行,‘mysite.polls’,
4. 配置urls.py,加入期望的url规则,访问mysite.polls.views中的方法
5. 编辑views.py,编写2个方法
6. 启动内置开发服务器,django python manage.pyrunserver
7. 在浏览器中输入http://localhost:8000/访问测试页面
1. 另注:数据库连接中。python 2.5及以后的版本内涵sqlite数据库,不需要另外安装。name是一定要是包含完整路径的文件名称。若文件原本不存在,在使用同步数据库后,系统会为每个应用自动创建所需要的table,其他数据库都必须填写用户名和密码,并且需要事先创建好数据库。
2. app可以放在任何python路径上。放在与manage.py同级目录中,将作为该工程的*模块,而不是mysite的子模块。
3. 如果写view时采用硬编码方式,要改变页面显示方式,就要改变python代码。解决方案:利用template系统从python中分离出设计。解决方案:利用template系统从python中分离出设计
应用部署
详见Django book
Django框架开发效率
用django构建的网站
http://www.djangosites.org/官方展示
在该网站上可以获得一个应用网站的源码,以供学习参考。
l 欧洲一个日化网上商店
l http://www.chinesehour.com/中文学习网站
l 焦点网站http://www.focus.com/ 焦点观察,与专家对话。框架非常适合
l 国际象棋俱乐部https://secure.chess.com/chesspark.html在线国际象棋
l 代码管理网站 http://dpaste.com/
参考资料
http://www.360doc.com/content/09/1206/13/50698_10483406.shtml#Django MVC模式,Django发展
http://simple-is-better.com/news/385#digRuby 跟 Python 本质上不同,Python是非常简约的语言
http://www.360doc.com/content/12/0229/11/2902158_190487111.shtml浅谈五大Python Web框架
http://djangobook.py3k.cn/2.0/DjangoBook2.0中文翻译(很好)
Django官网https://www.djangoproject.com/
http://codinn.com/projects/django-best-practices/view/Django最佳实践