python框架Django與WSGI

今天學習了一下用簡單的Django框架與簡單的WSGI服務器配套運行一個簡單的Django項目;

Django不是完整的web後端框架,它須要和一個WSGI服務器配套,由WSGI服務器負責網絡通信部分。python

1.Django與WSGI

 

WSGI全稱:Web Server Gateway Interface,是Python定義的WSGI程序和WSGI服務器之間的一種接口web

現一個WSGI應用,只須要知足3個要求:正則表達式

  1. 是可調用的,好比是一個函數,或者是一個可調用類(具備__call__方法)的實例
  2. WSGI應用應當返回一個可迭代(iterable)的值,好比字符串列表
  3. WSGI應用在返回以前,應當調用WSGI服務器傳入的start_response函數發送狀態碼和HTTP報文頭

 

一種最簡單的知足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

 

3.編寫視圖函數

輸入 :第一個參數是一個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)

 

4.定義路由表

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

 

5.對接簡單WSGI服務器

使用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()

 

6.最後生成一個用Django實現WSGI應用程序

# -*- 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()
相關文章
相關標籤/搜索