一、今日概要
1、了解Web應用程序的本質
2、Django簡介及安裝使用
二、今日詳細
1、最簡單的web應用程序
Web應用程序指供瀏覽器訪問的程序,通常也簡稱為Web應用。程序的最大好處是用戶很容易訪問應用程序,用戶只需要有瀏覽器即可,不需要再安裝其他軟件。
應用程序有兩種模式C/S、B/S:
-
-
- C/S(Client/Server)是客戶端/服務器端程序,也就是說這類程序一般獨立運行。
- B/S(Browser/Server)就是瀏覽器端/服務器端應用程序,這類應用程序一般借助谷歌,火狐等瀏覽器來運行。
-
Web應用程序一般是B/S模式。Web應用程序首先是“應用程序”,和用什么程序語言(如:java,python等)編寫出來的程序沒有什么本質上的不同。在網絡編程的意義下,瀏覽器是一個socket客戶端,服務器是一個socket服務端。
現在我們就基於socket實現一個最簡單的web應用程序。
import socket # 創建socket對象 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 綁定IP和端口 sock.bind(("127.0.0.1", 8888)) # 監聽 sock.listen(5) while True: conn, addr = sock.accept() # 等待連接 data = conn.recv(1024) # 接收數據 print("請求信息====> %s" % data) # 發送數據 conn.send("HTTP/1.1 200 OK\r\nContent-Type: text/html;charset=utf-8\r\n\r\n".encode('utf-8')) conn.send("<h2>騎士計划</h2>".encode("utf-8")) conn.close()
2、HTTP協議簡介
HTTP協議是Hyper Text Transfer Protocol(超文本傳輸協議)的縮寫,是用於從萬維網(WWW:World Wide Web )服務器傳輸超文本到本地瀏覽器的傳送協議。
HTTP是一個屬於應用層的面向對象的協議,由於其簡捷、快速的方式,適用於分布式超媒體信息系統。它於1990年提出,經過幾年的使用與發展,得到不斷地完善和擴展。HTTP協議工作於客戶端-服務端架構為上。瀏覽器作為HTTP客戶端通過URL向HTTP服務端即WEB服務器發送所有請求。Web服務器根據接收到的請求后,向客戶端發送響應信息。
3、HTTP協議特性
1、基於TCP/IP協議
http協議是基於TCP/IP協議之上的應用層協議。
2、基於請求---響應模式
HTTP協議規定,請求從客戶端發出,最后服務器端響應 該請求並返回。換句話說,肯定是先從客戶端開始建立通信的,服務器端在沒有 接收到請求之前不會發送響應。
3、 無狀態保存
HTTP是一種不保存狀態,即無狀態(stateless)協議。HTTP協議 自身不對請求和響應之間的通信狀態進行保存。也就是說在HTTP這個 級別,協議對於發送過的請求或響應都不做持久化處理。
使用HTTP協議,每當有新的請求發送時,就會有對應的新響應產 生。協議本身並不保留之前一切的請求或響應報文的信息。這是為了更快地處理大量事務,確保協議的可伸縮性,而特意把HTTP協議設計成 如此簡單的。
可是,隨着Web的不斷發展,因無狀態而導致業務處理變得棘手 的情況增多了。比如,用戶登錄到一家購物網站,即使他跳轉到該站的 其他頁面后,也需要能繼續保持登錄狀態。針對這個實例,網站為了能 夠掌握是誰送出的請求,需要保存用戶的狀態。HTTP/1.1雖然是無狀態協議,但為了實現期望的保持狀態功能, 於是引入了Cookie技術。有了Cookie再用HTTP協議通信,就可以管 理狀態了。有關Cookie的詳細內容后面會詳細講解。
4、無連接
無連接的含義是限制每次連接只處理一個請求。服務器處理完客戶的請求,並收到客戶的應答后,即斷開連接。采用這種方式可以節省傳輸時間。
4、HTTP請求協議與響應協議
http協議包含由瀏覽器發送數據到服務器需要遵循的請求協議與服務器發送數據到瀏覽器需要遵循的響應協議。用於HTTP協議交互的信息被為HTTP報文。請求端(客戶端)的HTTP報文 做請求報文,響應端(服務器端)的 做響應報文。HTTP報文本身是由多行數據構成的字文本。
1、請求協議
請求方式: get與post請求
-
-
- GET提交的數據會放在URL之后,以?分割URL和傳輸數據,參數之間以&相連,如EditBook?name=test1&id=123456. POST方法是把提交的數據放在HTTP包的請求體中.
- GET提交的數據大小有限制(因為瀏覽器對URL的長度有限制),而POST方法提交的數據沒有限制。
-
補充內容:對URL的認識
URL是統一資源定位符,對可以從互聯網上得到的資源的位置和訪問方法的一種簡潔的表示,是互聯網上標准資源的地址。
URL的組成部分(如:http://www.luffycity.com/home):
a、協議部分:在Internet中可以使用多種協議,如HTTP,FTP等等。上面的例子中“http”就是在聲明協議,在"http"后面的“//”為分隔符。
b、域名部分:上面的例子URL的域名部分為“www.luffycity.com”。一個URL中,也可以使用IP地址作為域名使用(域名通過dns解析,最終訪問的還是IP地址)。
c、端口部分:緊跟域名后面的就是端口,域名和端口之間使用“:”作為分隔符。端口不是一個URL必須的部分,如果省略端口部分,將采用默認端口(80)。
d、路徑部分:以“/”字符區別路徑中的每一個目錄名稱(如:http://www.luffycity.com/home,中的home就是路徑名稱)。
e、文件名部分:從域名后的最后一個“/”開始到“?”為止,是文件名部分,如果沒有“?”,則是從域名后的最后一個“/”開始到“#”為止,是文件部分,如果沒有“?”和“#”,那么從域名后的最后一個“/”開始到結束,都是文件名部分(如:https://hcdn1.luffycity.com/static/frontend/index/Luffy-study-logo.png)。本例中的文件名是“Luffy-study-logo.png”。文件名部分也不是一個URL必須的部分,如果省略該部分,則使用默認的文件名。
f、錨部分:從“#”開始到最后,都是錨部分。錨部分也不是一個URL必須的部分。
g、參數部分:從“?”開始到“#”為止之間的部分為參數部分,又稱搜索部分、查詢部分。參數可以允許有多個參數,參數與參數之間用“&”作為分隔符。
2、響應協議
響應狀態碼:
狀態碼的職 是當客戶端向服務器端發送請求時, 返回的請求結果。借助狀態碼,用戶可以知道服務器端是正常理了請求,還是出現了問題 。狀態碼如200 OK,以3位數字和原因組成。響應狀態碼有以下5種(詳見下圖)。
5、wsgiref模塊
最簡單的Web應用就是先把HTML用文件保存好,用一個現成的HTTP服務器軟件,接收用戶請求,從文件中讀取HTML,返回。
如果要動態生成HTML,就需要把上述步驟自己來實現。不過,接受HTTP請求、解析HTTP請求、發送HTTP響應都是苦力活,如果我們自己來寫這些底層代碼,還沒開始寫動態HTML呢,就得花個把月去讀HTTP規范。
正確的做法是底層代碼由專門的服務器軟件實現,我們用Python專注於生成HTML文檔。因為我們不希望接觸到TCP連接、HTTP原始請求和響應格式,所以,需要一個統一的接口協議來實現這樣的服務器軟件,讓我們專心用Python編寫Web業務。這個接口就是WSGI:Web Server Gateway Interface。而wsgiref模塊就是python基於wsgi協議開發的服務模塊。
from wsgiref.simple_server import make_server def application(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html')]) return [b'<h1>Hello, web!</h1>'] if __name__ == '__main__': httpd = make_server('', 8080, application) print('Serving HTTP on port 8080...') # 開始監聽HTTP請求: httpd.serve_forever()
6、Web框架
Web框架(Web framework)是一種開發框架,用來支持動態網站、網絡應用和網絡服務的開發。這大多數的web框架提供了一套開發和部署網站的方式,也為web行為提供了一套通用的方法。web框架已經實現了很多功能,開發人員使用框架提供的方法並且完成自己的業務邏輯,就能快速開發web應用了。
瀏覽器和服務器之間是基於HTTP協議進行通信的。也可以說web框架就是在以上十幾行代碼基礎張擴展出來的,有很多簡單方便使用的方法,大大提高了開發的效率。
7、DIY一個Web框架
1、啟動文件manage.py
from wsgiref.simple_server import make_server from urls import * def application(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html;charset=utf-8')]) path = environ.get("PATH_INFO") func = None for item in urlpatterns: if path == item[0]: func = item[1] break if func: ret = func(environ) else: ret = not_found(environ) return [ret] if __name__ == '__main__': httpd = make_server('', 8080, application) print('Serving HTTP on port 8080...') # 開始監聽HTTP請求: httpd.serve_forever()
2、urls.py
from views import * urlpatterns = [ ("/login/", login), ]
3、views.py
def login(environ): with open("templates/login.html", "rb") as f: data = f.read() return data def not_found(environ): ret = b'<h1>404 not found.!!!</h1>' return ret
4、templates模板目錄(該目錄下的login.html)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <form action="http://127.0.0.1:8080/login/" method="post"> <p>用戶名:<input type="text" name="user"></p> <p>密碼:<input type="password" name="pwd"></p> <input type="submit"> </form> </body> </html>
DIYWEB這個package就是一個web框架,下載這個web框架就可以快速實現一些簡單的web功能,比如查看時間。
8、Django簡介
哎呀,前戲總算結束了,下面終於可以……
1、MVC與MTV模型
MVC模型
Web服務器開發領域里著名的MVC模式,所謂MVC就是把Web應用分為模型(M),控制器(C)和視圖(V)三層,他們之間以一種插件式的、松耦合的方式連接在一起,模型負責業務對象與數據庫的映射(ORM),視圖負責與用戶的交互(頁面),控制器接受用戶的輸入調用模型和視圖完成用戶的請求,其示意圖如下所示:
MTV模型
Django的MTV模式本質上和MVC是一樣的,也是為了各組件間保持松耦合關系,只是定義上有些許不同,Django的MTV分別是指:
-
-
-
- M 代表模型(Model): 負責業務對象和數據庫的關系映射(ORM)。
- T 代表模板 (Template):負責如何把頁面展示給用戶(html)。
- V 代表視圖(View): 負責業務邏輯,並在適當時候調用Model和Template。
-
-
除了以上三層之外,還需要一個URL分發器,它的作用是將一個個URL的頁面請求分發給不同的View處理,View再調用相應的Model和Template,MTV的響應模式如下所示:
一般是用戶通過瀏覽器向我們的服務器發起一個請求(request),這個請求回去訪問視圖函數,(如果不涉及到數據調用,那么這個時候視圖函數返回一個模板也就是一個網頁給用戶),視圖函數調用模型,模型去數據庫查找數據,然后逐級返回,視圖函數把返回的數據填充到模板中空格中,最后返回網頁給用戶。
9、Django下載與基本命令
1、Django下載
有請進入Django官網下載頁面:猛戳一下
pip install django==2.1.7
2、創建咱們第一個Django項目:
下面的命令創建了一個名為"mysite"的Django 項目:
django-admin startproject mysite
3、Django項目目錄介紹:
|---mysite # 項目的/目錄 |---mysite # 項目目錄 |---__init__.py |---settings.py # 配置文件 |---urls.py # 路由系統 ===> url與視圖的對應關系 |---wsgi.py # runserver命令就使用wsgiref模塊做簡單的web server |---manage.py # 管理文件
4、在mysite目錄下創建應用
1、創建app:
python manage.py startapp app01
2、注冊app:
在settings.py里的INSTALLED_APPS列表中,添加注冊app。
有兩種方法:
a、INSTALLED_APPS = [..., "app01', ...]
b、INSTALLED_APPS = [..., "app01.apps.App01Config', ...] # 推薦這種寫法
3、認識app目錄結構:
5、啟動運行Django項目:
python manage.py runserver # 127.0.0.1:8000 python manage.py runserver 80 # 127.0.0.1:80 python manage.py runserver 0.0.0.0:8888 # 0.0.0.0:8888# 注意:要在manage.py同級目錄執行命令
10、基於Django實現的一個簡單示例
1、url控制器
from django.contrib import admin from django.urls import path from app01 import views urlpatterns = [ path('admin/', admin.site.urls), path('timer/', views.timer), ]
2、視圖函數
from django.shortcuts import render # Create your views here. def timer(request): import datetime now_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") return render(request, "timer.html", {"now_time": now_time})
3、模板文件(timer.html)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <h3>當前時間為:{{ now_time }}</h3> </body> </html>
三、今日作業
熟悉django框架,並根據示例,完成登錄頁面。