Django不是完整的web後端框架,它須要和一個WSGI服務器配套,由WSGI服務器負責網絡通信部分。python
WSGI全稱:Web Server Gateway Interface,是Python定義的WSGI程序和WSGI服務器之間的一種接口web
現一個WSGI應用,只須要知足3個要求:正則表達式
一種最簡單的知足WSGI規約的應用程序須要實現一個指定形式的函數:django
from wsgiref.simple_server import make_server def wsgi_app(environ,start_response): from pprint import pprint pprint(environ) start_response('200 OK',[('Context-Type','text/plain')]) return 'such a tiny wsgi app!' httpd = make_server('0.0.0.0',80,wsgi_app) print 'start server' httpd.serve_forever()
environ是一個包含所有HTTP請求信息的字典/Dict,由WSGI服務器解包HTTP請求生成。後端
2.建立WSGI應用對象:服務器
Django框架對一個WSGI應用的結構進行了分解,有些部件由框架完成,有些部分須要 開發者實現。所以,開發一個基於Django框架的Web應用,事實上就是填充Django框架 所約定的須要由開發者完成的部件。網絡
根據Django約定,一個WSGI應用裏最核心的部件有兩個:路由表和視圖。Django框架 的核心功能就是路由:根據HTTP請求中的URL,查找路由表,將HTTP請求分發到 不一樣的視圖去處理:架構
Django框架嚴重依賴於一個全局配置對象settings來定製 其行爲,所以,咱們須要在建立WSGI應用對象以前,首先使用默認值初始化這個全局 配置對象app
from django.conf import settings;#配置對象 from django.core.wsgi import get_wsgi_application; #建立WSGI應用對象 settings.configure() settings.DEBUG = True #配置對象 wsgi_app = get_wsgi_application(); #建立WSGI應用對象 print wsgi_app
輸入 :第一個參數是一個HttpRequest對象,這是Django框架對一個HTTP請求 的完整封裝,視圖函數從這個對象中提取請求中的信息框架
輸出 :返回值應當是一個HttpResponse對象,Django框架將基於這個返回 的對象完成對WSGI服務器的響應
from django.conf import settings from django.core.wsgi import get_wsgi_application from django.http import HttpRequest,HttpResponse settings.configure() settings.DEBUG = True wsgi_app = get_wsgi_application() #一個簡單的視圖函數 def v_index(request): return HttpResponse('Hello,Djando!') #模仿框架構造一個HttpRequest對象,傳給視圖函數 req = HttpRequest(); print v_index(req)
Django框架根據HTTP請求的URL來找到對應的視圖函數,很天然的,路由表 使用一個列表對象,其中每一項記錄一種URL模式與一個視圖函數的對應關係;
url()函數用來生成一個路由項,第一個參數是一個正則表達式,用來匹配 HTTP請求的URL,前綴r用來防止正則字符串被轉義;第二個參數就是咱們定義 的視圖函數。
註冊路由:
在一個有點規模的應用中,可能會存在多個開發組,每一個開發組維護單獨的一張路由表。 所以,在Django框架中,須要告訴Django框架使用那個路由表做爲根路由表。
使用全局配置對象的ROOT_URLCONF屬性來註冊根路由表,應當爲這個屬性指定一個 具備urlpatterns變量的模塊名,Django將動態導入這個模塊並使用其urlpatterns 變量的值做爲路由表。
所以,一般狀況下,總應該將路由表變量命名爲urlpatterns。
import sys from django.conf import settings from django.core.wsgi import get_wsgi_application from django.http import HttpRequest,HttpResponse from django.conf.urls import url settings.configure() settings.DEBUG = True wsgi_app = get_wsgi_application() def v_index(request): return HttpResponse('Hello,Djando!') urlpatterns = [ url(r'^$',v_index), ] settings.ROOT_URLCONF = sys.modules[__name__] print urlpatterns
使用python自帶的簡單WSGI服務器:
from wsgiref.simple_server import make_server httpd = make_server('0.0.0.0',80,wsgi_app)#全地址0.0.0.0;端口號80 httpd.serve_forever()
# -*- coding:utf-8 -*- import sys from django.conf import settings from django.core.wsgi import get_wsgi_application from django.http import HttpRequest,HttpResponse from django.conf.urls import url from wsgiref.simple_server import make_server settings.configure() settings.DEBUG = True wsgi_app = get_wsgi_application() def v_index(request): return HttpResponse('Hello,Djando!') urlpatterns = [ url(r'^$',v_index),#r爲防止正則字符串被轉義,'^$'中Django框架在使用定義的路由表以前,已經吃掉了$符前的那個前綴的/ ] settings.ROOT_URLCONF = sys.modules[__name__] httpd = make_server('0.0.0.0',80,wsgi_app) print 'starting server...' httpd.serve_forever()