python框架Django與WSGI


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

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

1.Django與WSGI

 

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

現一個WSGI應用,只需要滿足3個要求:

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

 

一種最簡單的滿足WSGI規約的應用程序需要實現一個指定形式的函數:

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應用對象之前,首先使用默認值初始化這個全局 配置對象

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM