[Django框架学习] URLconf的映射和模版继承

学习目标:实现一个web app, 可以识别人脸表情,识别算法在后台实现。
学习参考资料:The Django Book 2.0 – 中文版
后面会辅助:Django Documentation, 基础例子简单,但是不利于初学者理解框架的实现机制。

整理一下django框架开发web 应用的核心机制:
一、MVC模式:
Django很好地把分工不同的模块剥离开来,一个典型的框架包括这几个文件:models.py, views.py, urls.py, xxx.html. models.py: 模型,用一个python类来描述数据表,就是开发者想要定义的数据类型。 views.py: 视图,页面的业务逻辑,也就是返回给用户的网页效果的定义。 urls.py: 指定什么样的URL调用什么样的视图,也就是url和视图之间的映射关系的定义。 xxx.html: 描述页面的设计,可以在这里定义网页的模版和视图样式。 由Django驱动的web应用分工明确,各部分独立,理清了思路就可以进行高效地开发。
Django 紧紧地遵循这种 MVC 模式,可以称得上是一种 MVC 框架。 以下是 Django 中 M、V 和 C 各自的含义:
M ,数据存取部分,由django数据库层处理,本章要讲述的内容。
V ,选择显示哪些数据要显示以及怎样显示的部分,由视图和模板处理。
C ,根据用户输入委派视图的部分,由 Django 框架根据 URLconf 设置,对给定 URL 调用适当的 Python 函数。

由于 C 由框架自行处理,而 Django 里更关注的是模型(Model)、模板(Template)和视图(Views),Django 也被称为 MTV 框架 。在 MTV 开发模式中:
M 代表模型(Model),即数据存取层。 该层处理与数据相关的所有事务: 如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等。
T 代表模板(Template),即表现层。 该层处理与表现相关的决定: 如何在页面或其他类型文档中进行显示。
V 代表视图(View),即业务逻辑层。 该层包含存取模型及调取恰当模板的相关逻辑。 你可以把它看作模型与模板之间的桥梁。

二、 开发前的准备
安装、测试Django –> 安装数据库 –> 开始一个项目 (django-admin.py startproject mysite) –> 运行开发服务器(python manage.py runserver 或者 python manage.py runserver 0.0.0.0:8000,后者可以实现全网侦听)

三、视图和URL配置
1. 视图:views.py中定义
一个视图就是Python的一个函数,并且这个函数的第一个参数必须是HttpRequest类型返回一个HttpResponse实例。为了让一个Python函数成为Django可识别的视图,必须满足这两个条件。

from django.http import HttpResponse

def hello(request):
    return HttpResponse("Hello world")

2.URLconf :urls.py中定义
实现绑定的功能,将视图函数和URL绑定。
URLconf就想是Django所支撑网站的目录。本质是URL模式和要为这个URL模式调用的视图函数之间的映射表。告诉Django, 这个URL调用这段代码,那个URL调用那段代码。

from django.conf.urls.defaults import *
from mysite.views import hello

urlpatterns = patterns('',
    ('^hello/$', hello),
)

需要导入视图,import hello;
添加URLpattern, 一个python元组,元组第一个元素是模式匹配字符串(正则表达式),第二个元素是该模式对应的视图函数。

3.Django怎么处理请求?
访问 URL/hello/时,Django根据 ROOT_URLCONF的设置装载URLconf, 然后按顺序逐个匹配URLconf里的URLpatterns,直到找到第一个匹配的。当找到匹配的URLpatterns就调用相关联的view函数,并把HttpRequest对象作为第一个参数,我们已经知道视图返回一个HttpRequest实例,做完之后,Django就会完成从Python对象到一个合适的带有Http头和body的Web Response.

总结的步骤:
a. 进来的请求转入/hello/.
b. Django通过在ROOT_URLCONF配置来决定根URLconf.
c. Django在URLconf中的所有URL模式中,查找第一个匹配/hello/的条目。
d. 如果找到匹配,将调用相应的视图函数
e. 视图函数返回一个HttpResponse
f. Django转换HttpResponse为一个适合的HTTP response, 以Web page显示出来

URL的定义和视图函数之间是松耦合的,决定URL返回哪个视图函数和实现这个视图函数是在两个地方,我们可以单独的去修改。

四、模版
模版用于分离文档的表现形式和内容,有了模版,我们不需要将html硬编码到视图函数中(这样的代码很丑,而且不利于开发分工)。
1.一个典型的模版应用:

>>> from django import template
>>> t = template.Template('My name is {{ name }}.')
>>> c = template.Context({'name': 'Adrian'})
>>> print t.render(c)
My name is Adrian.
>>> c = template.Context({'name': 'Fred'})
>>> print t.render(c)
My name is Fred.

创建模版对象(t = template.Template…) –> 准备模版数据(c = Context({‘name’: ‘Stephane’})) –> 模版渲染 (t.render(c)) 用render方法来传递context来填充模版。
还有一些模版标签和过滤器的知识,可以去参考文档看看。

2.视图中使用模版
a. 在settings.py中指定模版文件夹的位置
为了减少模板加载调用过程及模板本身的冗余代码,Django 提供了一种使用方便且功能强大的 API ,用于从磁盘中加载模板,我们只需要指定位置。(别忘了逗号)Python 要求单元素元组中必须使用逗号,以此消除与圆括号表达式之间的歧义。

    TEMPLATES = [
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        #其他省略
     ]

b. 修改视图代码 views.py
code1:

from django.template.loader import get_template
from django.template import Context
from django.http import HttpResponse
import datetime

def current_datetime(request):
    now = datetime.datetime.now()
    t = get_template('current_datetime.html')
    html = t.render(Context({'current_date': now}))
    return HttpResponse(html)

get_template会根据配置的路径,去寻找current_datetime.html。要确定某个模板文件在你的系统里的位置, get_template()方法会自动为你连接已经设置的 TEMPLATE_DIRS目录和你传入该法的模板名称参数。比如,你的 TEMPLATE_DIRS目录设置为 ‘/home/django/mysite/templates’,上面的 get_template()调用就会为你找到 /home/django/mysite/templates/current_datetime.html 这样一个位置。

code2: short-cut render_to_response
Django为此提供了一个捷径,让你一次性地载入某个模板文件,渲染它,然后将此作为 HttpResponse返回。

from django.shortcuts import render_to_response
import datetime

def current_datetime(request):
    now = datetime.datetime.now()
    return render_to_response('current_datetime.html', {'current_date': now})

3.locals()技巧,include模版标签
Python 的内建函数 locals() 。它返回的字典对所有局部变量的名称与值进行映射。
内建模板标签: {% include %} 。该标签允许在(模板中)包含其它的模板的内容。

4.模版继承
在整个网站中,如何减少共用页面区域(比如站点导航)所引起的重复和冗余代码?
模板继承就是先构造一个基础框架模板,而后在其子模板中对它所包含站点公用部分和定义块进行重载。
a. 创建 base.html 模板,在其中定义站点的主要外观感受。 这些都是不常修改甚至从不修改的部分。
b. 为网站的每个区域创建 base_SECTION.html 模板(例如, base_photos.html 和 base_forum.html )。这些模板对 base.html 进行拓展,并包含区域特定的风格与设计。
c. 为每种类型的页面创建独立的模板,例如论坛页面或者图片库。 这些模板拓展相应的区域模板。
base.html:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html lang="en"> <head> <title>{% block title %}{% endblock %}</title> </head> <body> <h1>My helpful timestamp site</h1> {% block content %}{% endblock %} {% block footer %} <hr> <p>Thanks for visiting my site.</p> {% endblock %} </body> </html>

current_datetime.html

{% extends "base.html" %} {% block title %}The current time{% endblock %} {% block content %} <p>It is now {{ current_date }}.</p> {% endblock %}

模版继承工作方式:加载current_datetime.html时,模版引擎发现了{% extends %}标签(注意!必须是子模版的第一个标签,否则无法实现继承),注意到该模版是一个子模版,模版引擎会立即装载其父模版,即本例中base.html.
然后,模版引擎会注意到base.html中的三个{% block %}标签,并用子模版中的内容替换这些block, 如果子模版中并没有对应的block进行定义,模版系统就会使用在父模版中定义的值,父模版{%block%}标签中的内容被当做一条退路。

time line:

2015/4/18
目前学习了前四章的内容,对Django框架有一个基本的认识,知道其视图和URL之间的映射机制,知道模版的加载方式,还有其他一些django的一些语法知识。还有个很重要的事,就是在debug模式下,要学会分析页面的错误信息(django帮助我们做了很多),这对于调试非常有用,帮助我解决了很多问题。
还有就是补起linux下开发丫~啊啊啊~~不用鼠标的感觉确实蛮好,要一直用下去才不会把这么多快捷键抛到脑后。

你可能感兴趣的:(python,django)