今日份整理,終於開始整個階段學習的後期了,今日開始學習Django的框架,加油,你是最胖的!css
Web應用程序是一種能夠經過Web訪問的應用程序,程序的最大好處是用戶很容易訪問應用程序,用戶只須要有瀏覽器便可,不須要再安裝其餘軟件。html
應用程序有兩種模式C/S、B/S。前端
WEB應用程序通常是B/S模式。Web應用程序首先是「應用程序」,和用標準的程序語言,如java,python等編寫出來的程序沒有什麼本質上的不一樣。在網絡編程的意義下,瀏覽器是一個socket客戶端,服務器是一個socket服務端。java
以下就是基於socket實現的的一個最簡單的web應用程序。python
import socket def handle_request(client): request_data = client.recv(1024) print("request_data: ",request_data) client.send("HTTP/1.1 200 OK\r\n\r\n".encode("utf8")) client.send("<h1 style='color:red'>Hello, 路飛學城! </h1>".encode("utf8")) def main(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind(('localhost',8800)) sock.listen(5) while True: print("the server is waiting for client-connection....") connection, address = sock.accept() handle_request(connection) connection.close() if __name__ == '__main__': main()
HTTP協議是Hyper Text Transfer Protocol(超文本傳輸協議)的縮寫,是用於萬維網(WWW:World Wide Web )服務器與本地瀏覽器之間傳輸超文本的傳送協議。web
HTTP是一個屬於應用層的面向對象的協議,因爲其簡捷、快速的方式,適用於分佈式超媒體信息系統。它於1990年提出,通過幾年的使用與發展,獲得不斷地完善和擴展。數據庫
HTTP協議工做於客戶端-服務端架構爲上。瀏覽器做爲HTTP客戶端經過URL向HTTP服務端即WEB服務器發送全部請求。Web服務器根據接收到的請求後,向客戶端發送響應信息。django
計算機與網絡設備要相互通訊,雙方就必須基於相同的方法。好比,如何探測到通訊目標、由哪一邊先發起通訊、使用哪一種語言進行通 信、怎樣結束通訊等規則都須要事先肯定。不一樣的硬件、操做系統之間 的通訊,全部的這一切都須要一種規則。而咱們就把這種規則稱爲協議(protocol)。協議中存在各式各樣的內容。從電纜的規格到IP地址的選定方法、 尋找異地用戶的方法、雙方創建通訊的順序,以及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報文自己是由多行數據構成的文本。
1.2.3.1 請求協議
請求格式:
請求方式:get與post的不一樣
1.2.3.2 響應協議
響應格式:
響應狀態碼
狀態碼的是當客戶端向服務器端發送請求時, 返回的請求結果。藉助狀態碼,用戶能夠知道服務器端是正常處理了請求,仍是出現異常了 。
狀態碼如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框架就是在以上十幾行代碼基礎張擴展出來的,有不少簡單方便使用的方法,大大提升了開發的效率。
1.4.2 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>
上面
這個其實已經算一個簡單的框架了,只是沒人真正的這麼去用而已。。。
Web服務器開發領域裏著名的MVC模式,所謂MVC就是把Web應用分爲模型(M),控制器(C)和視圖(V)三層,他們之間以一種插件式的、鬆耦合的方式鏈接在一塊兒,模型負責業務對象與數據庫的映射(ORM),視圖負責與用戶的交互(頁面),控制器接受用戶的輸入調用模型和視圖完成用戶的請求,其示意圖以下所示:
Django的MTV模式本質上和MVC是同樣的,也是爲了各組件間保持鬆耦合關係,只是定義上有些許不一樣,Django的MTV分別是值:
通常是用戶經過瀏覽器向咱們的服務器發起一個請求(request),這個請求回去訪問視圖函數,(若是不涉及到數據調用,那麼這個時候視圖函數返回一個模板也就是一個網頁給用戶),視圖函數調用模型,模型去數據庫查找數據,而後逐級返回,視圖函數把返回的數據填充到模板中空格中,最後返回網頁給用戶。
命令行
pip install django==2.1.7 # 指定版本號 pip install django==1.11.20 –i https://pypi.doubanio.com/simple #指定豆瓣源下載
pycharm
1. 打開file 2. settings 3. project 4. 點擊+號 5. input輸入名稱 6. 不須要指定版本(直接install) 7. 在右側S開頭選擇對應版本,安裝便可。
命令行
django-admin startproject 項目名稱
pycharm
1. 打開file 2. new project 選擇django 3. 在頂部選擇項目路徑以及,項目名稱 4. 選擇解釋器 5. app應用名稱 6. create建立
命令行模式
python manage.py startapp app名稱
pycharm
tools---> Run manage.py Task ----直接輸入命令便可
app目錄的結構
命令行模式
python manage.py runserver # 127.0.0.1:8000(默認ip以及端口) python manage.py runserver 8888 # 127.0.0.1:8888(指定端口) python manage.py runserver 192.168.1.2:8001 # 192.168.1.2:8001(指定ip以及指定端口)
pycharm
1. 找到項目select 2. 點擊edit 3. host和port---->ok 4. 綠色右三角按鈕
在瀏覽器中輸入127.0.0.1:8000。能夠看到一個小火箭動來動去。嘿嘿嘿
對於一個html界面,若是有css以及js文件這類靜態文件,咱們須要放在statics文件夾下,這樣纔會被引用。同時因爲前端的問題,js文件須要放置在body html文件下,纔會被引用到。
在項目的公共文件夾在settings最後一行,加入
SATICFILES_DIRS =[os.path.join(BASE_DIR,’statics’)]
我的理解:客戶端訪問服務端的文件,對於html的文件只會存放在服務器中,若是仍是引用css、js等文件仍是按照服務器中的目錄,這個時候客戶端根本沒法拿到文件,只有告訴客戶端文件地址在服務器的位置,在訪問html的時候將文件從服務器中下載下來。這樣才能正確的顯示文件的正確內容
在服務端中,服務器在收到客戶端的請求後,服務端各個文件夾的使用順序,如圖
urls文件
from django.contrib import admin from django.urls import path from app01 import views urlpatterns = [ path('admin/', admin.site.urls), path('index/',views.index), ]
app01.viewes(視圖)
from django.shortcuts import render # Create your views here. def index(request): import datetime now=datetime.datetime.now() ctime=now.strftime("%Y-%m-%d %X") return render(request,"index.html",{"ctime":ctime})
templates.index.html(模板)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h4>當前時間:{{ ctime }}</h4> </body> </html>
最後啓動起來的頁面
裏面我加入一些css文件,因此文字顯示爲紅色