1. 程式人生 > >python16_day15【Django入門】

python16_day15【Django入門】

response 最簡 ext tcp inf star -1 解析 為我

一、Django基本

1.什麽是框架

  框架,即framework,特指為解決一個開放性問題而設計的具有一定約束性的支撐結構,使用框架可以幫你快速開發特定的系統,簡單地說,就是你用別人搭建好的舞臺來做表演。對於所有的Web應用,本質上其實就是一個socket服務端,用戶的瀏覽器其實就是一個socket客戶端。

技術分享
 1 import socket
 2 
 3 def handle_request(client):
 4 
 5     buf = client.recv(1024)
 6     client.send("HTTP/1.1 200 OK\r\n\r\n".encode("utf8"
)) 7 client.send("<h1 style=‘color:red‘>Hello, yuan</h1>".encode("utf8")) 8 9 def main(): 10 11 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 12 sock.bind((localhost,8001)) 13 sock.listen(5) 14 15 while True: 16 connection, address = sock.accept()
17 handle_request(connection) 18 connection.close() 19 20 if __name__ == __main__: 21 22 main()
基本框架

  最簡單的Web應用就是先把HTML用文件保存好,用一個現成的HTTP服務器軟件,接收用戶請求,從文件中讀取HTML,返回。

如果要動態生成HTML,就需要把上述步驟自己來實現。不過,接受HTTP請求、解析HTTP請求、發送HTTP響應都是苦力活,如果我們自己來寫這些底層代碼,還沒開始寫動態HTML呢,就得花個把月去讀HTTP規範。

正確的做法是底層代碼由專門的服務器軟件實現,我們用Python專註於生成HTML文檔。因為我們不希望接觸到TCP連接、HTTP原始請求和響應格式,所以,需要一個統一的接口,讓我們專心用Python編寫Web業務。

這個接口就是WSGI:Web Server Gateway Interface。

2.WSGI是什麽鬼

  step1:

技術分享
 1 from wsgiref.simple_server import make_server
 2 
 3 
 4 def application(environ, start_response):
 5     start_response(200 OK, [(Content-Type, text/html)])
 6     return [b<h1>Hello, web!</h1>]
 7 
 8 
 9 httpd = make_server(‘‘, 8080, application)
10 
11 print(Serving HTTP on port 8000...)
12 # 開始監聽HTTP請求:
13 httpd.serve_forever()
View Code 技術分享
 1 整個application()函數本身沒有涉及到任何解析HTTP的部分,也就是說,底層代碼不需要我們自己編寫,
 2 我們只負責在更高層次上考慮如何響應請求就可以了。
 3 
 4 application()函數必須由WSGI服務器來調用。有很多符合WSGI規範的服務器,我們可以挑選一個來用。
 5 
 6 Python內置了一個WSGI服務器,這個模塊叫wsgiref    
 7     
 8     
 9 application()函數就是符合WSGI標準的一個HTTP處理函數,它接收兩個參數:
10 
11         //environ:一個包含所有HTTP請求信息的dict對象;
12         
13         //start_response:一個發送HTTP響應的函數。
14 
15 在application()函數中,調用:
16 
17 start_response(200 OK, [(Content-Type, text/html)])
18 
19 就發送了HTTP響應的Header,註意Header只能發送一次,也就是只能調用一次start_response()函數。
20 start_response()函數接收兩個參數,一個是HTTP響應碼,一個是一組list表示的HTTP Header,每
21 個Header用一個包含兩個str的tuple表示。
22 
23 通常情況下,都應該把Content-Type頭發送給瀏覽器。其他很多常用的HTTP Header也應該發送。
24 
25 然後,函數的返回值b<h1>Hello, web!</h1>將作為HTTP響應的Body發送給瀏覽器。
26 
27 有了WSGI,我們關心的就是如何從environ這個dict對象拿到HTTP請求信息,然後構造HTML,
28 通過start_response()發送Header,最後返回Body。
View Code

  step2:

技術分享
 1 print(environ[PATH_INFO])
 2     path=environ[PATH_INFO]
 3     start_response(200 OK, [(Content-Type, text/html)])
 4     f1=open("index1.html","rb")
 5     data1=f1.read()
 6     f2=open("index2.html","rb")
 7     data2=f2.read()
 8 
 9     if path=="/yuan":
10         return [data1]
11     elif path=="/alex":
12         return [data2]
13     else:
14         return ["<h1>404</h1>".encode(utf8)]
View Code

  step3:

技術分享
 1 from wsgiref.simple_server import make_server
 2 
 3 def f1():
 4     f1=open("index1.html","rb")
 5     data1=f1.read()
 6     return [data1]
 7 
 8 def f2():
 9     f2=open("index2.html","rb")
10     data2=f2.read()
11     return [data2]
12 
13 def application(environ, start_response):
14 
15     print(environ[PATH_INFO])
16     path=environ[PATH_INFO]
17     start_response(200 OK, [(Content-Type, text/html)])
18 
19 
20     if path=="/yuan":
21         return f1()
22 
23     elif path=="/alex":
24         return f2()
25 
26     else:
27         return ["<h1>404</h1>".encode("utf8")]
28 
29 
30 httpd = make_server(‘‘, 8502, application)
31 
32 print(Serving HTTP on port 8084...)
33 
34 # 開始監聽HTTP請求:
35 httpd.serve_forever()
View Code

  step4:

技術分享
 1 from wsgiref.simple_server import make_server
 2 
 3 
 4 def f1(req):
 5     print(req)
 6     print(req["QUERY_STRING"])
 7 
 8     f1=open("index1.html","rb")
 9     data1=f1.read()
10     return [data1]
11 
12 def f2(req):
13 
14     f2=open("index2.html","rb")
15     data2=f2.read()
16     return [data2]
17 
18 import time
19 
20 def f3(req):        #模版以及數據庫
21 
22     f3=open("index3.html","rb")
23     data3=f3.read()
24     times=time.strftime("%Y-%m-%d %X", time.localtime())
25     data3=str(data3,"utf8").replace("!time!",str(times))
26 
27 
28     return [data3.encode("utf8")]
29 
30 
31 def routers():
32 
33     urlpatterns = (
34         (/yuan,f1),
35         (/alex,f2),
36         ("/cur_time",f3)
37     )
38     return urlpatterns
39 
40 
41 def application(environ, start_response):
42 
43     print(environ[PATH_INFO])
44     path=environ[PATH_INFO]
45     start_response(200 OK, [(Content-Type, text/html)])
46 
47 
48     urlpatterns = routers()
49     func = None
50     for item in urlpatterns:
51         if item[0] == path:
52             func = item[1]
53             break
54     if func:
55         return func(environ)
56     else:
57         return ["<h1>404</h1>".encode("utf8")]
58 
59 httpd = make_server(‘‘, 8518, application)
60 
61 print(Serving HTTP on port 8084...)
62 
63 # 開始監聽HTTP請求:
64 
65 httpd.serve_forever()
View Code

夥計們,不知不覺我們自己已經寫出一個web框架啦!

3.MTV and MVC

   Django的MTV模式本質是各組件之間為了保持松耦合關系,Django的MTV分別代表:

Model(模型):負責業務對象與數據庫的對象(ORM)

Template(模版):負責如何把頁面展示給用戶

View(視圖):負責業務邏輯,並在適當的時候調用Model和Template

此外,Django還有一個url分發器,它的作用是將一個個URL的頁面請求分發給不同的view處理,view再調用相應的Model和Template

  (1).創建一個django project:

django-admin.py startproject mysite

  (2).mysite目錄下創建應用,比如blog:

python manage.py startapp blog

  (3).啟動django項目

python16_day15【Django入門】