在此处输入标题
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开发的一些成功网站:
- 豆瓣 果壳 知乎
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
Hello World
回应的格式为 头信息 + 空行 + html数据,头信息第一行为 协议版本 + 状态码 + 状态说明(失败的响应有404 Not Found)
Content-Type告诉客户端回应的数据格式是什么
3. Html
超文本标记语言(英语:HyperText MarkupLanguage,简称:HTML)是一种用于创建网页的标准标记语言。HTML是一种基础技术,常与CSS、JavaScript一起被众多网站用于设计令人赏心悦目的网页、网页应用程序以及移动应用程序的用户界面。网页浏览器可以读取HTML文件,并将其渲染成可视化网页。HTML描述了一个网站的结构语义随着线索的呈现,使之成为一种标记语言而非编程语言。 from wiki
4. 当你访问一个网站时,到底发生了什么
- 浏览器向DNS服务器发送请求,获得站点的IP地址
- 浏览器向服务器发送一个Http请求,请求中有如下信息:
方法:GET-请求资源 POST-提交数据
路径:/movie/xxx.avi
以及其他相关数据 - 服务器返回Http请求,请求中包括:
响应状态 200-成功 400-失败
响应类型
响应的内容,即html -
浏览器读取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 'Hello, web!
'
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[0-9]*)$', views.CalNum),# (?Prex)
]
'''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到处理函数的映射