简述
最近一段时间在使用python的Django的web框架在写web网站。Django作为python的一款比较流行的web框架,以其高效性、可扩展性为大家所熟悉。Django框架主要由URLConf、View视图文件、模板系统、表单模块、Model模型系统和站点管理Admin等几大部分组成。
搭建Django应用的典型流程是:先设计好模型,然后就尽快把admin 运行起来,以便你的员工、客户可以尽快开始填充数据。之后,你再考虑该如何把数据呈现给用户。
URLConf
urls.py是django的核心,它是连接url和系统资源之间的纽带。这种纽带不仅包括url和view中的方法的映射关系,而且包括相应的系统调用、css文件、图片资源等。当用户请求某个页面时,Django会按顺序遍历每个正则式,直到遇见第一个匹配的正则式(如果没有找到匹配的,Django就调用一个特殊的404视图)。正则表达式采用C语言编译,相对于XML解析,速度快很多,这是Django的优化。
视图
视图函数存在于view.py文件中,它是一个接受web请求并且返回一个web响应的函数。这个响应可以是一份网页的HTML内容、一次重定向、一条404错误、一份xml文档、一副图片,或者其他任何东西。每个视图都要负责做这两件事情之一:返回一个包含所请求页面内容的 HttpResponse 对象,或者抛出一个异常,比如 Http404。其余部分就由你发挥了。
视图本身包含返回该响应所需要的任意逻辑。urls和view视图是松耦合的关系,方便进行修改,互不影响。视图函数的第一个参数的类型是HttpRequest,它返回一个HttpResponse实例。
URL与视图文件的工作原理如下所示:首先进入的web请求转入/url中,然后通过在ROOT_URLCONF配置来决定根URLconf,django在URLConf中的所有URL模式中,查找第一个匹配相应的url的条目,如果找到匹配,将调用相应的视图函数,视频函数将会返回一个HttpResponse。Django转换HttpResponse为一个合适的HTTP response,以web page显示出来。
视图函数中的参数request是HttpRequest对象,并且所有的视图函数都是以request作为它的第一个参数;如果URL是类似/time/plus/3那么字符串“3”是offset参数,offset参数是从匹配的URL中提取出来的。提取的字符串总是字符类型,而不是整形,即使都是数字形式。
render_to_response() 函数的第一个参数是模板名,第二个参数是一个可选的字典。它的返回值是用给定的上下文渲染过的模板所组成的 HttpResponse 对象。
通用视图
模板系统
视图函数可以调用相应的网页的模板。我们将HTML写入一个模板的主要目的在于这样我们可以就将python代码编写和HTML设计作为两项不同的工作,从而将python代码和HTML代码分开编写,提高了开发的效率。模板定义了placeholder和表示多种逻辑的tags来规定文档如何展现。
在典型的网站中,很多网页的导航条、样式表和网站底部的声明等信息都是一样的,重新书写会造成大量的冗余代码。为了解决这些问题,django的模板系统提供了继承的功能。首先定义一个基础模板,然后在子模板中继承这个基础模板。基础模板中主要包括网页相同的元素,包括导航条、样式表和网站尾部等,将网页的主体部分用{% block %}模板标签进行声明;子模板使用{% extends xxx.html%}的标签重载这些部分。
表单
HttpResponse是我们进行表单操作的主要API,HttpResponse对象是view函数的第一个参数。其中对象的request.GET和request.POST属性包括了用户提交的信息。他们都是类字典对象,可以通过它们来访问GET和POST数据。当我们提交表单仅仅需要获取数据时就可以使用GET,而当我们提交表单时候需要更改服务器数据的状态,或者其他不仅仅是获取并显示数据的时候就使用POST。
由于我们创建了POST表单(它会修改数据),所以就可能有遭遇到跨站攻击的风险。不过值得庆幸的是,Django自带了一个很方便的系统来应对这种危险,所以你不必为此操心。其使用方式简单来说,就是所有向网站内部URL做POST请求的表单中,都应该加上 {% csrf_token %} 这个模板标签。
用户、注册和权限
Django用户认证系统处理用户账号,组,权限以及基于cookie的用户会话。这个系统一般称为auth/auth(认证与授权)系统。这个系统的名称同时也表明了用户常见的两步处理:验证用户是否是他所宣传的用户;验证用户是否拥有执行某种操作的授权。
Django的auth系统会包含以下的部分:
1. 用户:在网站注册的人。
2. 权限:用于标识用户是否可以执行某种操作的二进制(yes)标志。
3. 组:一种可以将标记和权限应用于多个用户的常用方法。
4. Messages:向用户显示队列式的系统消息的常用方法。
Model模型系统
模型是关于数据的唯一的、权威的信息来源。它包含了必要的字段,以及数据具有的行为。Django遵循 DRY(Don't Repeat Yourself) 原则,其目标是仅在一个地方定义数据模型,然后自动在其他地方引用这个模型,并派生出其他的东西。
数据存取层,该层处理与数据相关的所有事务:如何存取、如何确认有效性、包含哪些行为以及数据之间的关系等。模型系统可以通过python manage.py syncdb命令直接在数据库中生成相应的数据表。
model模型中的models.py文件主要包含实体类的主要属性,而views.py则主要包括实体类的主要视图函数,大部分都是和数据库有关的操作函数。每个数据模型都是django.db.models.Model的子类,它们的父类Model包含了所有必要的和数据库交互的方法。
Django的应用都是“可插拔”的:你可以在多个项目中使用一个应用;你也可以发布应用给别人用,因为应用并不受限于特定的Django环境。
更改数据库模型
syncdb命令仅仅创建数据库中没有的表,它并不对你数据模型的修改进行同步。如果新增、修改或者删除数据模型中的字段,需要手动完成相应的修改。首先,在数据库中将相应的操作完成,如新增字段,修改字段或者删除字段;其次,在model文件下找到相应的model.py文件,完成对模型的修改;并且运行manage.py sqlall测试模型新的create table语句。如果需要进行验证修改是否正确,在manage.py shell中导入模型和选中表单。
站点管理Admin
对于网站来说,管理界面是基础设施中非常重要的一部分。他可以帮助我们管理用户的信息和网站的主要内容。Django自动管理工具通过django.contrib功能包进行实现。其中django.contrib.admin是最基本的部分。django.contrib.auto是用户鉴别系统,django.contrib.sessions是支持匿名会话的模块,django.contrib.comments是用户评注系统。
Djang管理站点是完全可以进行选择的。当服务启动后,django从url.py引导URLConf,然后执行‘admin.autodiscover()’语句。这个函数遍历INSTALLED_APPS配置,寻找相关的admin.py。如果在指定的app目录下找到admin.py,它就执行其中的代码。调用admin.py中的admin.site.register()方法会将相应的模块注册到管理工具中。