今天好像巴黎有点乱,希望明天太阳还会照常升起。

简介

Django 是一个由 Python 编写、开源并采用经典的 MVC 设计模式的 Web Full Stack 应用框架。

在 Django 中,控制器接受用户输入的部分由框架自行处理,所以 Django 里关注更多在模型( Model )、模板( Template )和视图( Views ),称为 MTV 模式。他们各自的职责如下:

  • 模型( Model ),数据存取层:处理与数据相关的所有事务,即如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等。
  • 模板( Template ),表现层:处理与表现相关的决定,即如何在页面或其他类型文档中进行显示。
  • 视图( View ),业务逻辑层:存取模型及调取恰当模板的相关逻辑。模型与模板之间的桥梁。

而 Django 的编译方式比较特别,他的 MVC 控制器部分由 URLconf 来实现。

URLconf

当我在 Django 中编写完视图要想将其路由要页面上时,我发现了 Django 的 URLconf 路由机制,他实现了为相应的视图函数路由到相应界面的映射功能,也就是说,当用户访问了

时, Django 调用了视图 views.py 中的 hello () 函数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
``` python
from django.conf.urls import include, url
from mysite.views import hello,current_datetime,hours_ahead,letter
urlpatterns = [
url(r'^hello/$', hello),
url(r' 大专栏  Django 学习笔记1-- URLconf^time/$', current_datetime),
url(r'^time/plus/(d{1,2})/ $',hours_ahead),
]
```
可以看出, URLconf 的路由是通过正则表达式来匹配一个完整的 hello 的 URL ,这样的话就可以保证 诸如 /hello/foo/ 等 URL 不会被匹配到。
为了更深入了解 URLconf 路由的机制,我找到了类似的 [tornado](https://github.com/tornadoweb/tornado) 框架来对比。
注意到在其中 web.py 文件中的第2964行开始的如下代码:
``` python
application = tornado.web.Application([
(r"/", MainHandler),
])
http_server = tornado.httpserver.HTTPServer(application)
http_server.listen(options.port)
tornado.ioloop.IOLoop.current( ).start( )
```
可以看出 torando 现把一个路由表作为一个参数,传给 Application 类的构造函数,接着创建了一个实例,然后再把这个实例传递给 http_server 。那么当客户端发起``` get / ```请求的时候, http server 接收到这个请求,在路由表中匹配 url pattern ,最后交给 MainHandler 去处理。
这个机制跟 Django 的 URLconf 是类似的,都是通过在 pattern 中匹配好对应的 url 接着传给处理器来负责从路由表中检索并路由。
这种方法**松耦合**了 http server 层和 web application 层,从而让开发者可以专注于 web 应用的逻辑层,很好! :D
## Django 如何处理请求
所以了解过了 Django 的 URLconf 机制后,我开始思考他是如何处理请求的。
我开启服务器后在地址栏中输入 ``` http://127.0.0.1:8000/time/plus/20/

然后花现处理路线如下:

  1. 进来的请求转入 /time/plus/20/ .

  2. Django 通过在 ROOT_URLCONF 配置来决定根 URLconf .

  3. Django 在 URLconf 中的所有 URL 模式中,查找第一个匹配 /time/plus/20/ 的条目。

  4. 如果找到匹配,将调用相应的视图函数

  5. 如果没找到匹配,则返回相应的 Http 状态码 (如图)

  6. 视图函数返回一个HttpResponse

  7. Django 转换 HttpResponse 为一个适合的 HTTP response ,以 Web page 显示出来

Django 学习笔记1-- URLconf的更多相关文章

  1. Django学习笔记(11)——开发图书管理页面

    一,项目题目: 开发图书管理页面 该项目主要练习Django对多个数据库进行增删改查的操作. 二,项目需求: 基础需求:75% 1. 列出图书列表.出版社列表.作者列表 2. 点击作者,会列出其出版的 ...

  2. Django 学习笔记之四 QuerySet常用方法

    QuerySet是一个可遍历结构,它本质上是一个给定的模型的对象列表,是有序的. 1.建立模型: 2.数据文件(test.txt) 3.文件数据入库(默认的sqlite3) 入库之前执行 数据库同步命 ...

  3. Django 学习笔记之三 数据库输入数据

    假设建立了django_blog项目,建立blog的app ,在models.py里面增加了Blog类,同步数据库,并且建立了对应的表.具体的参照Django 学习笔记之二的相关命令. 那么这篇主要介 ...

  4. Django学习笔记(五)—— 表单

    疯狂的暑假学习之  Django学习笔记(五)-- 表单 參考:<The Django Book> 第7章 1. HttpRequest对象的信息 request.path         ...

  5. Django学习笔记(三)—— 型号 model

    疯狂暑期学习 Django学习笔记(三)-- 型号 model 參考:<The Django Book> 第5章 1.setting.py 配置 DATABASES = { 'defaul ...

  6. Django 学习笔记(二)

    Django 第一个 Hello World 项目 经过上一篇的安装,我们已经拥有了Django 框架 1.选择项目默认存放的地址 默认地址是C:\Users\Lee,也就是进入cmd控制台的地址,创 ...

  7. Django 学习笔记(五)模板标签

    关于Django模板标签官方网址https://docs.djangoproject.com/en/1.11/ref/templates/builtins/ 1.IF标签 Hello World/vi ...

  8. Django 学习笔记(四)模板变量

    关于Django模板变量官方网址:https://docs.djangoproject.com/en/1.11/ref/templates/builtins/ 1.传入普通变量 在hello/Hell ...

  9. Django 学习笔记(三)模板导入

    本章内容是将一个html网页放进模板中,并运行服务器将其展现出来. 平台:windows平台下Liunx子系统 目前的目录: hello ├── manage.py ├── hello │ ├── _ ...

随机推荐

  1. MySQL--MySQL 日志

    在 MySQL中,有 4 种不同的日志,分别是错误日志.二进制日志(BINLOG 日志).查询日志和慢查询日志. 1.错误日志 错误日志是 MySQL 中最重要的日志之一,它记录了当 mysqld 启 ...

  2. AddressUtils

    package com.ruoyi.common.utils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com. ...

  3. linux 线程间发送信号

    线程间通过 pthread_kill(thid,signo)给指定的thid线程发送signo信号. 创建线程与线程屏蔽字顺序 1. pthread_create();    pthread_sigm ...

  4. Perl:正则中问号的四周用途:1.字面意义的问号 2. 量词 3. 表示非贪心的修饰符 4.用以表示不具有记忆功能的圆括号

    Perl:正则中问号的四周用途:1.字面意义的问号  2. 量词   3. 表示非贪心的修饰符  4.用以表示不具有记忆功能的圆括号 非贪心:在量词后面加?即可

  5. 正则表达式中 /s 可以帮助“.”匹配所有的字符,包括换行,从而实现【\d\D】的功能

    正则表达式中 /s 可以帮助“.”匹配所有的字符,包括换行,从而实现[\d\D]的功能

  6. 替换String中的\r\n\t

    String json = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\r\n " ...

  7. 回归分析|r^2|Se|变差|多重相关系数|决定系数|多重共线性|容忍度|VIF|forward selection|backward elimination|stepwise regression procedure|best-subset approach|回归方程的置信区间|预测区间|残差分析|虚拟变量

    应用统计学-回归分析 拟合度使用r^2和Se来检验. 显著性检验中,对于线性model使用ANOVA,对于单独的回归系数使用t检验. 最小二乘法.贝叶斯和最大似然都可用于求回归参数,最小二乘法是最小化 ...

  8. git实用手册

    git.exe clone --progress -v "git@code.sohuno.com:huimingtao/focus-wap.git" "D:\worksp ...

  9. android应用市场、社区客户端、漫画App、TensorFlow Demo、歌词显示、动画效果等源码

    Android精选源码 MVP架构Android应用市场项目 android刻度盘控件源码 Android实现一个社区客户端 android商品详情页上拉查看详情 基于RxJava+Retrofit2 ...

  10. Learn Git Lesson06 - 分离头指针

    ============== 知识点 分离头指针 HEAD 含义 git diff 分离头指针 (Detached HEAD) 有时候想尝试性修改某些内容(实验),也许并不会真的提交到分支,这时候可以 ...