一、瞭解Web應用程序的本質html
二、Django簡介及安裝使用java
Web應用程序指供瀏覽器訪問的程序,一般也簡稱爲Web應用。程序的最大好處是用戶很容易訪問應用程序,用戶只須要有瀏覽器便可,不須要再安裝其餘軟件。python
應用程序有兩種模式C/S、B/S:web
Web應用程序通常是B/S模式。Web應用程序首先是「應用程序」,和用什麼程序語言(如:java,python等)編寫出來的程序沒有什麼本質上的不一樣。在網絡編程的意義下,瀏覽器是一個socket客戶端,服務器是一個socket服務端。數據庫
如今咱們就基於socket實現一個最簡單的web應用程序。django
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()
HTTP協議是Hyper Text Transfer Protocol(超文本傳輸協議)的縮寫,是用於從萬維網(WWW:World Wide Web )服務器傳輸超文本到本地瀏覽器的傳送協議。編程
HTTP是一個屬於應用層的面向對象的協議,因爲其簡捷、快速的方式,適用於分佈式超媒體信息系統。它於1990年提出,通過幾年的使用與發展,獲得不斷地完善和擴展。HTTP協議工做於客戶端-服務端架構爲上。瀏覽器做爲HTTP客戶端經過URL向HTTP服務端即WEB服務器發送全部請求。Web服務器根據接收到的請求後,向客戶端發送響應信息。瀏覽器
一、基於TCP/IP協議服務器
http協議是基於TCP/IP協議之上的應用層協議。網絡
二、基於請求---響應模式
HTTP協議規定,請求從客戶端發出,最後服務器端響應 該請求並返回。換句話說,確定是先從客戶端開始創建通訊的,服務器端在沒有 接收到請求以前不會發送響應。
三、 無狀態保存
HTTP是一種不保存狀態,即無狀態(stateless)協議。HTTP協議 自身不對請求和響應之間的通訊狀態進行保存。也就是說在HTTP這個 級別,協議對於發送過的請求或響應都不作持久化處理。
使用HTTP協議,每當有新的請求發送時,就會有對應的新響應產 生。協議自己並不保留以前一切的請求或響應報文的信息。這是爲了更快地處理大量事務,確保協議的可伸縮性,而特地把HTTP協議設計成 如此簡單的。
但是,隨着Web的不斷髮展,因無狀態而致使業務處理變得棘手 的狀況增多了。好比,用戶登陸到一家購物網站,即便他跳轉到該站的 其餘頁面後,也須要能繼續保持登陸狀態。針對這個實例,網站爲了能 夠掌握是誰送出的請求,須要保存用戶的狀態。HTTP/1.1雖然是無狀態協議,但爲了實現指望的保持狀態功能, 因而引入了Cookie技術。有了Cookie再用HTTP協議通訊,就能夠管 理狀態了。有關Cookie的詳細內容後面會詳細講解。
四、無鏈接
無鏈接的含義是限制每次鏈接只處理一個請求。服務器處理完客戶的請求,並收到客戶的應答後,即斷開鏈接。採用這種方式能夠節省傳輸時間。
http協議包含由瀏覽器發送數據到服務器須要遵循的請求協議與服務器發送數據到瀏覽器須要遵循的響應協議。用於HTTP協議交互的信息被爲HTTP報文。請求端(客戶端)的HTTP報文 作請求報文,響應端(服務器端)的 作響應報文。HTTP報文自己是由多行數據構成的字文本。
一、請求協議
請求方式: get與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、參數部分:從「?」開始到「#」爲止之間的部分爲參數部分,又稱搜索部分、查詢部分。參數能夠容許有多個參數,參數與參數之間用「&」做爲分隔符。
二、響應協議
響應狀態碼:
狀態碼的職 是當客戶端向服務器端發送請求時, 返回的請求結果。藉助狀態碼,用戶能夠知道服務器端是正常理了請求,仍是出現了問題 。狀態碼如200 OK,以3位數字和緣由組成。響應狀態碼有如下5種(詳見下圖)。
最簡單的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()
Web框架(Web framework)是一種開發框架,用來支持動態網站、網絡應用和網絡服務的開發。這大多數的web框架提供了一套開發和部署網站的方式,也爲web行爲提供了一套通用的方法。web框架已經實現了不少功能,開發人員使用框架提供的方法而且完成本身的業務邏輯,就能快速開發web應用了。
瀏覽器和服務器之間是基於HTTP協議進行通訊的。也能夠說web框架就是在以上十幾行代碼基礎張擴展出來的,有不少簡單方便使用的方法,大大提升了開發的效率。
一、啓動文件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()
二、urls.py
from views import * urlpatterns = [ ("/login/", login), ]
三、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
四、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功能,好比查看時間。
哎呀,前戲總算結束了,下面終於能夠……
MVC模型
Web服務器開發領域裏著名的MVC模式,所謂MVC就是把Web應用分爲模型(M),控制器(C)和視圖(V)三層,他們之間以一種插件式的、鬆耦合的方式鏈接在一塊兒,模型負責業務對象與數據庫的映射(ORM),視圖負責與用戶的交互(頁面),控制器接受用戶的輸入調用模型和視圖完成用戶的請求,其示意圖以下所示:
MTV模型
Django的MTV模式本質上和MVC是同樣的,也是爲了各組件間保持鬆耦合關係,只是定義上有些許不一樣,Django的MTV分別是指:
除了以上三層以外,還須要一個URL分發器,它的做用是將一個個URL的頁面請求分發給不一樣的View處理,View再調用相應的Model和Template,MTV的響應模式以下所示:
通常是用戶經過瀏覽器向咱們的服務器發起一個請求(request),這個請求回去訪問視圖函數,(若是不涉及到數據調用,那麼這個時候視圖函數返回一個模板也就是一個網頁給用戶),視圖函數調用模型,模型去數據庫查找數據,而後逐級返回,視圖函數把返回的數據填充到模板中空格中,最後返回網頁給用戶。
有請進入Django官網下載頁面:猛戳一下
pip install django==2.1.7
下面的命令建立了一個名爲"mysite"的Django 項目:
django-admin startproject mysite
|---mysite # 項目的/目錄 |---mysite # 項目目錄 |---__init__.py |---settings.py # 配置文件 |---urls.py # 路由系統 ===> url與視圖的對應關係 |---wsgi.py # runserver命令就使用wsgiref模塊作簡單的web server |---manage.py # 管理文件
一、建立app:
python manage.py startapp app01
二、註冊app:
在settings.py裏的INSTALLED_APPS列表中,添加註冊app。
有兩種方法:
a、INSTALLED_APPS = [..., "app01', ...]
b、INSTALLED_APPS = [..., "app01.apps.App01Config', ...] # 推薦這種寫法
三、認識app目錄結構:
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同級目錄執行命令
from django.contrib import admin from django.urls import path from app01 import views urlpatterns = [ path('admin/', admin.site.urls), path('timer/', views.timer), ]
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})
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <h3>當前時間爲:{{ now_time }}</h3> </body> </html>
熟悉django框架,並根據示例,完成登陸頁面。