文档章节

Django: 路由与视图

笔阁
 笔阁
发布于 2015/11/10 09:34
字数 1841
阅读 2349
收藏 55

简介

Django框架是美国World Company(世界公司?NB)的工程师Adrian Holovaty和Simon Willison在开发其公司运行的新闻网站(LJWorld.com、Lawrence.com、KUsports.com ) 过程中,逐渐完善丰富而成,2005年开源,是迄今为止Python界名气最大的Web框架。

Django这个词来自吉普赛语,D不发音,中文通常翻为姜戈,不过也有人相当搞笑的称为强哥。 官方发音点这里:

Django框架取名于20世纪三十年代法国著名的爵士吉他手 Django Reinhardt —— 迄今为止最伟大的吉他手之一,尽管他的左手只有三个指头:

Django-Reinhardt

稳定性:Django框架相当抗造,已经被Disqus, Instagram, Pinterest, Mozilla等机构广泛采用,官方 说法是基于Django的站,可以支持每秒5万次点击访问。

产品定位:Django框架的定位是支持大中型动态网站的开发,提供了完备的扩展库和工具集。不过 整个框架分解的比较清晰,如果你愿意抛开Django的工具,深入到各个组件,会发现Django对各种 规模的应用,都能相当不错的支持。

Django与WSGI

根据Python的惯例,Django不是一个完整的Web后端框架,它只负责开发WSGI应用程序 ,在生产环境中Django应用应当与一个WSGI服务器配套,由WSGI服务器负责网络通讯部分。

WSGI,全称 Web Server Gateway Interface,或者 Python Web Server Gateway Interface ,是为 Python 语言定义的Web服务器和Web应用程序之间的一种简单而通用的接口。

wsgi2.jpg

WSGI将Web服务分成两个部分:服务器和应用程序。WGSI服务器只负责与网络相关的两件事:接收浏览器的 HTTP请求、向浏览器发送HTTP应答;而对HTTP请求的具体处理逻辑,则通过调用WSGI应用程序进行。

实现一个WSGI应用,只需要满足3个要求:

是可调用的,比如是一个函数,或者是一个可调用类(具有__call__方法)的实例 WSGI应用应当返回一个可迭代(iterable)的值,比如字符串列表 WSGI应用在返回之前,应当调用WSGI服务器传入的start_response函数发送状态码和HTTP报文头 最小WSGI应用

一种最简单的满足WSGI规约的应用程序需要实现一个指定形式的函数:

from wsgiref.simple_server import make_server
 
def wsgi_app(environ,start_response):
    start_response('200 OK',[('Context-Type','text/plain')])
    return 'such a tiny wsgi app!'
 
httpd = make_server('0.0.0.0',80,wsgi_app)    
httpd.serve_forever()  

environ是一个包含全部HTTP请求信息的字典/Dict,由WSGI服务器解包HTTP请求生成。

创建WSGI应用对象

Django框架对一个WSGI应用的结构进行了分解,有些部件由框架完成,有些部分需要 开发者实现。因此,开发一个基于Django框架的Web应用,事实上就是填充Django框架 所约定的需要由开发者完成的部件。

根据Django约定,一个WSGI应用里最核心的部件有两个:路由表和视图。Django框架 的核心功能就是路由:根据HTTP请求中的URL,查找路由表,将HTTP请求分发到 不同的视图去处理:

hello.jpg

需要指出的是,在Django框架中,由于应用(application)有特定的含义,后续我们 将使用Django项目来表示Django框架中的WSGI应用对象。

创建WSGI应用对象很简单,这通过调用get_wsgi_application()函数来完成。 这个对象用来与WSGI服务器对接:

from django.core.wsgi import get_wsgi_application
wsgi_app = get_wsgi_application()

全局配置对象

不过有一点需要指出,Django框架严重依赖于一个全局配置对象settings来定制 其行为,因此,我们需要在创建WSGI应用对象之前,首先使用默认值初始化这个全局 配置对象:

from django.conf import settings
settings.configure()

在示例代码中你看到,我们设置了其DEBUG 属性为True,这将使Django框架运行在调试状态,输出调试信息。

编写视图函数

DJango中的视图就是一个标准的Python函数,不过由于Django框架要调用 这个函数,因此,作为视图的函数有两个约定需要满足:

view.jpg

输入 :第一个参数是一个HttpRequest对象,这是Django框架对一个HTTP请求 的完整封装,视图函数从这个对象中提取请求中的信息

输出 :返回值应当是一个HttpResponse对象,Django框架将基于这个返回 的对象完成对WSGI服务器的响应

一个简单的视图函数看起来就是这样:

def v_index(req):
    return HttpResponse('Hello,World!')

视图函数通常是由框架发起调用的,我们不需要直接调用视图函数。不过这并不是被禁止 的,有时候(比如自动测试)还有用处。模仿框架构造一个HttpRequest对象,传给视图 函数就行了:

req = HttpRequest()
print v_index(req)

定义路由表

Django框架根据HTTP请求的URL来找到对应的视图函数,很自然的,路由表 使用一个列表对象,其中每一项记录一种URL模式与一个视图函数的对应关系:

urlpatterns = [
    url(r'^$',v_index),
    url(r'^about/$',v_about),
]

url()函数用来生成一个路由项,第一个参数是一个正则表达式,用来匹配 HTTP请求的URL,前缀r用来防止正则字符串被转义;第二个参数就是我们定义 的视图函数。

如果你对正则表达式很熟悉,可能会有一点疑问,为什么上面的正则表达式,都 不包含前面那个/?比如,如果用户请求的URL是/about/,那么我们的正则表达 式应当写成^/about/$才对?

嗯,是这样,简单地说,是Django框架在使用你定义的路由表之前,已经吃掉了 那个前缀的/...先这样吧,回头再细说这一点。

注册路由表

在一个有点规模的应用中,可能会存在多个开发组,每个开发组维护单独的一张路由表。 因此,在Django框架中,需要告诉Django框架使用那个路由表作为根路由表。

使用全局配置对象的ROOT_URLCONF属性来注册根路由表,应当为这个属性指定一个 具有urlpatterns变量的模块名,Django将动态导入这个模块并使用其urlpatterns 变量的值作为路由表。

因此,通常情况下,总应该将路由表变量命名为urlpatterns。

对接WSGI服务器

严格来讲,到上一节课为止,一个Django项目就开发完了,剩下的事情就是 部署到生产环境中去了。

deploy.jpg

在生产环境中,你可以对接生产级的WSGI服务器,比如:Apache + mod_wsgi, Gunicorn或者WSGI。不过我们还是先跳过这个环节,开发阶段,先找个简单 的WSGI服务器跑起来!

使用Python内置的简单WSGI服务器,引入、创建服务器、运行即可:

from wsgiref.simple_server import make_server
httpd = make_server('0.0.0.0',80,wsgi_app)
httpd.serve_forever()

更多内容如URL分发、URL反向解析、视图函数、请求与响应、中间件等以及本文练习请参考: http://www.hubwiz.com/course/562efe441bc20c980538e801/

© 著作权归作者所有

笔阁
粉丝 223
博文 218
码字总数 492488
作品 0
海淀
程序员
私信 提问
加载中

评论(4)

笔阁
笔阁 博主

引用来自“W_Lu”的评论

引用来自“笔阁”的评论

引用来自“W_Lu”的评论

博文最有一段,wWSGI???还是uWSGI??如果确实是wWSGI,那么uWSGI能否用到生产环境?

笔误,是WSGI。27
我的问题还是没回答!

没试过uwsgi,但是独立部署估计有问题。
W_Lu
W_Lu

引用来自“笔阁”的评论

引用来自“W_Lu”的评论

博文最有一段,wWSGI???还是uWSGI??如果确实是wWSGI,那么uWSGI能否用到生产环境?

笔误,是WSGI。27
我的问题还是没回答!
笔阁
笔阁 博主

引用来自“W_Lu”的评论

博文最有一段,wWSGI???还是uWSGI??如果确实是wWSGI,那么uWSGI能否用到生产环境?

笔误,是WSGI。27
W_Lu
W_Lu
博文最有一段,wWSGI???还是uWSGI??如果确实是wWSGI,那么uWSGI能否用到生产环境?
Django: 路由与视图

简介 Django框架是美国World Company(世界公司?NB)的工程师Adrian Holovaty和Simon Willison在开发其公司运行的新闻网站(LJWorld.com、Lawrence.com、KUsports.com ) 过程中,逐渐完善丰...

笔阁
2015/11/10
1K
1
详解Django的CSRF认证

1.csrf原理 2.Django中的CSRF中间件 首先,我们知道Django中间件作用于整个项目。 在一个项目中,如果想对全局所有视图函数或视图类起作用时,就可以在中间件中实现,比如想实现用户登录判断...

任平生78
2018/10/08
0
0
Django学习笔记----快速入门

上一篇>Django学习笔记----环境搭建基于Windows 开始第一个Django项目 进入Cmder, 进入想创建工程的文件夹, 键入 注意不能选择这样的项目名称, 会于Python已有的模块名称冲突 生成成功后, 可...

fesoncn
2017/12/27
0
0
针对 Rails 开发者的 Django 比较

Django 是 Python 最流行的 Web 应用开发框架,很多人认为 Django 就相当于 Python 的 Rails。如果你是一个有经验的 Rails 开发者,那么这篇文章将教会你如何使用 Django 来开发,并且帮助你...

oschina
2012/12/28
4.9K
4
简单了解Django应用app及分布式路由

前言 应用在Django的项目中是一个独立的业务模块,可以包含自己的路由,视图,模板,模型. 一 创建应用程序 创建步骤 用manage.py中的子命令startapp创建应用文件夹 在settings.py的INSTALL...

开元中国2015
07/25
18
0

没有更多内容

加载失败,请刷新页面

加载更多

uni app 零基础小白到项目实战

$emit 子组件传给父组件$ref 父组件操作子组件 公用模板 uni-app全局变量的几种实现方法 const websiteUrl = 'http'const now = Date.now || function() { return new Date().getTime......

达达前端小酒馆
33分钟前
7
0
Tomcat是如何实现异步Servlet的

前言 通过我之前的Tomcat系列文章,相信看我博客的同学对Tomcat应该有一个比较清晰的了解了,在前几篇博客我们讨论了Tomcat在SpringBoot框架中是如何启动的,讨论了Tomcat的内部组件是如何设...

木木匠
57分钟前
31
0
mysql中间件分享(Mysql-prxoy,Atlas,DBProxy,Amoeba,cobar,TDDL)

hello 各位小伙伴大家好,我是小栈君,这期我们分享关于mysql中间件的研究,也就是数据层的读写分离和负载均衡,希望能够在实际的应用中能够帮助到各位小伙伴。 下期我们将继续分享go语言的系...

IT干货栈
今天
15
0
OSChina 周一乱弹 —— 人生,还真是到处是意外

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @这次装个文艺青年吧 :#今日歌曲推荐# 分享lil peep的单曲《High School》 《High School》- lil peep 手机党少年们想听歌,请使劲儿戳(这里...

小小编辑
今天
1K
13
Spring使用ThreadPoolTaskExecutor自定义线程池及实现异步调用

多线程一直是工作或面试过程中的高频知识点,今天给大家分享一下使用 ThreadPoolTaskExecutor 来自定义线程池和实现异步调用多线程。 一、ThreadPoolTaskExecutor 本文采用 Executors 的工厂...

CREATE_17
今天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部