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是客户端与服务端进行通信的协议


django_第1张图片

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. 当你访问一个网站时,到底发生了什么

  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 '

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到处理函数的映射

你可能感兴趣的:(django)