django

在此处输入标题


1. Django简介

Django makes it easier to build better Web apps more quickly and with
less code.
from django官网

Django是用python开发的web framework,有如下特点:

  • 免费开源
  • 快速开发,避免重复造轮子
  • 偏重量
  • 使用M-V-C(T)结构

用Django开发的一些成功网站:

  • 豆瓣 果壳 知乎
  • Instagram

2. HTTP

Http是客户端与服务端进行通信的协议


HTTP 是基于 TCP/IP 协议的应用层协议。它不涉及数据包(packet)传输,主要规定了客户端和服务器之间的通信格式,默认使用80端口。

最早版本是1991年发布的0.9版,1996年5月,HTTP/1.0 版本发布,1997年1月,HTTP/1.1 版本发布,HTTP/1.1一直用到了近20年后的今天

2.1 请求格式

以下是一个HTTP/1.1的请求的例子:

GET / HTTP/1.1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5)

Get是请求命令,/表示请求的资源路径, HTTP/1.0是协议的版本,之后是一些客户端的信息

2.2 回应格式

服务器回应如下:

HTTP/1.1 200 OK 
Content-Type: text/html
Content-Length: 456456
Expires: Thu, 05 Dec 2016 16:00:00 GMT
Last-Modified: Wed, 5 August 2016 15:55:28 GMT
Server: Apache 2.1

<html>
  <body>Hello World</body>
</html>

回应的格式为 头信息 + 空行 + html数据,头信息第一行为 协议版本 + 状态码 + 状态说明(失败的响应有404 Not Found)
Content-Type告诉客户端回应的数据格式是什么

3. Html

超文本标记语言(英语:HyperText MarkupLanguage,简称:HTML)是一种用于创建网页的标准标记语言。HTML是一种基础技术,常与CSS、JavaScript一起被众多网站用于设计令人赏心悦目的网页、网页应用程序以及移动应用程序的用户界面。网页浏览器可以读取HTML文件,并将其渲染成可视化网页。HTML描述了一个网站的结构语义随着线索的呈现,使之成为一种标记语言而非编程语言。 from wiki

4. 当你访问一个网站时,到底发生了什么

  1. 浏览器向DNS服务器发送请求,获得站点的IP地址
  2. 浏览器向服务器发送一个Http请求,请求中有如下信息:
    方法:GET-请求资源 POST-提交数据
    路径:/movie/xxx.avi
    以及其他相关数据
  3. 服务器返回Http请求,请求中包括:
    响应状态 200-成功 400-失败
    响应类型
    响应的内容,即html
  4. 浏览器读取html并将其渲染成可视化页面


5. 当我们用python开发web时我们在开发什么

根据用户的点击,动态地生成html,显示不同的页面,不想关心http请求解析,不想关心http响应发送,也不想涉及到底层的TCP传输等。那么这些活就需要专业的软件去实现,python专注html的开发。那么就需要一个接口连接底层


6. WSGI

Web服务器网关接口(Python Web Server Gateway
Interface,缩写为WSGI)是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。自从WSGI被开发出来以后,许多其它语言中也出现了类似接口 from wiki

WSGI接口定义非常简单,它要求Web开发者实现一个函数,就可以响应HTTP请求。实例如下:

def application(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    return '<h1>Hello, web!</h1>'

appliaction函数就是符合WSGI规范的函数,接受两个参数:

  • environ 表示请求的环境变量
  • start_responce 回调函数 开发者传入回应的信息
  • 返回html文本

整个application函数没有涉及到http请求的解析,响应的发送,开发者只需生成想要的html即可
applaiction会有底层服务器来调用,只要底层服务器满足wsgi规范,python内置有一个简单wsgi
实现,我们可以用来测试

from wsgiref.simple_server import make_server
from hello import application

# 创建一个服务器,IP地址为空,端口是8000,处理函数是application:
httpd = make_server('', 8888, application)
print "Serving HTTP on port 8888..."
# 开始监听HTTP请求:
httpd.serve_forever()

可以发现,通过wsgi规范我们仅仅实现一个application即可完成web开发,但是这样效率太低,代码会越来越庞大,越来越难维护,web framework登场了!

7. web framework 与 web server

有很多不同web server,比如Apache,Nginx,也有很多Web框架,Django,Flask,Ruby。python WSGI的出现,让web server与web framework分隔开,互不影响,可以实现server与framework的任意搭配。接受Http请求,解析请求,然后将相关数据通过WSGI接口传给web framework,web framework根据路径找到相关的函数处理,函数会返回具体的html。可以看到web framework最重要的工作就是产生html,而像我们之前那样直接返回html的方式非常低效,所以web framework还提供模板功能,以对固定的html进行复用。

8. django中的M-V-C

8.1 django工程目录

django的项目工程如下:

djangoproject
├── blog
│           ├── __init__.py
│           ├── admin.py
│           ├── apps.py
│           ├── migrations
│           │           └── __init__.py
│           ├── models.py
│           ├── tests.py
│           └── views.py
├── db.sqlite3
├── manage.py
└── mysite
                ├── __init__.py
                ├── settings.py
                ├── urls.py
                └── wsgi.py

Django支持多种数据库,默认使用python内置的sqlite,对于django来说最重要的是urls.py和views.py文件。

8.2 django路由

'''urls.py'''
from django.conf.urls import url
import views
urlpatterns = [
    url(r'^$', views.index),
]

'''views.py'''
from django.http import HttpResponse
def index(request):
    return HttpResponse("our first view!")

可见,django是根据urls.py中的urlPatterns列表来查找处理url的函数,具体的方式是通过正则表达式,比如我们让所有根目录下数字的请求都到函数calNum。

'''urls.py'''
import views
urlpatterns = [
    url(r'[0-9]*$', views.CalNum),
]

'''views.py'''
def CalNum(request):
    return HttpResponse("you click num page!")

如何在views中拿到具体的访问数字

'''urls.py'''
import views
urlpatterns = [
    url(r'(?P<nNum>[0-9]*)$', views.CalNum),# (?P<name>rex)
]

'''views.py'''
def CalNum(request, nNum):
    return HttpResponse("you click num %d page!"%nNum)

拿到这个数字有什么用?我们可以从数据库中拿到相应的数据然后返回

8.3 django Model

'''views.py'''
import models
def CalNum(request, nNum):
    pData = models.NumModel.get(nNum)
    return HttpResponse("you click num %d page! and datas are %s"%(nNum, pData.getData()))
    
'''models.py'''
from django.db import models
class NumModel(models.Model):
    title = models.CharField()
    text = models.TextField()

8.4 django View

每次都返回一个html字符串非常糟糕,django使用内置的模板系统来解决这个问题,在项目路径下建立templates文件夹,新建num.html

'''num.html'''
you click num {{ Num }} page! and datas are:
{% for Data in Model %}
{{ Data }}
{% endfor %}

views中如何将变量传进来

'''views.py'''
from django.template import loader

def CalNum(request, nNum):
    pData = Models.NumModel.get(nNum)
    template = loader.get_template('num.html')
    return HttpResponse(template.render({"Num":nNum, "Model":pData}, request))

django提供了更简洁的api

‘’‘views.py’’‘
from django.shortcuts import render

def CalNum(request, nNum):
    pData = Models.NumModel.get(nNum)
    return render(request, 'num.html', {"Num":nNum, "Model":pData})

8.5 总结

可见,django中的Model是一个封装了底层数据库的连接,执行SQL语句,释放连接的模型(ORM),开发者仅需继承models即可通过非常简洁的api操控数据库

django中的View是django内置的模板系统,模板系统提供一些模板标签,可以非常方便的生成html

django中的control是路由决策,是从url到处理函数的映射

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容