Django設計模式、安裝、簡介
一、介紹
Django 是用 Python 開發的一個免費開源的 Web 框架,幾乎囊括了 Web 應用的方方面面,可以用於快速搭建高效能、優雅的網站。Django 框架支援主流的作業系統平臺包括 Windows,Linux,MacOS 等。 Python Django 框架是一款全能型框架,Django 定義了服務釋出、路由對映、模板程式設計、資料處理的一整套功能。這也意味著 Django 模組之間緊密耦合。
二、設計模式之MVC和MTV
1、MVC設計模式
1、MVC 是 Model-View-Controller 的縮寫。
Model 代表資料儲存層,是對資料表的定義和資料的增刪改查;
View 代表檢視層,是系統前端顯示部分,它負責顯示什麼和如何進行顯示;
Controller 代表控制層,負責根據從 View 層輸入的指令來檢索 Model 層的資料,並在該層編寫程式碼產生結果並輸出。
2、請求與響應過程描述
使用者通過瀏覽器向伺服器發起 request 請求,Controller 層接受請求後,同時向 Model 層和 View 傳送指令;
Mole 層根據指令與資料庫互動並選擇相應業務資料,然後將資料傳送給 Controller 層;
View 層接收到 Controller 的指令後,載入使用者請求的頁面,並將此頁面傳送給 Controller 層;
Controller 層接收到 Model 層和 View 層的資料後,將它們組織成響應格式傳送給瀏覽器,瀏覽器通過解析後把頁面展示出來。
3、特點:
每一層都提供了各自獨立的介面供其它層呼叫,MVC 的設計模式降低了程式碼之間的耦合性(即關聯性),增加了模組的可重用性,這就是 MVC 的設計模式。
2、MTV設計模式
1、MVC介紹
Model:資料儲存層,處理所有資料相關的業務,和資料庫進行互動,並提供資料的增刪改查;
Template:模板層(也叫表現層)具體來處理頁面的顯示;
View:業務邏輯層,處理具體的業務邏輯,它的作用是連通Model 層和 Template 。
2、請求與響應流程
使用者通過瀏覽器對伺服器發起 request 請求,伺服器接收請求後,通過 View 的業務邏輯層進行分析,同時向 Model 層和 Template 層傳送指令;
Mole 層與資料庫進行互動,將資料返回給 View 層;
Template 層接收到指令後,呼叫相應的模板,並返回給 View 層;
View 層接收到模板與資料後,首先對模板進行渲染(即將相應的資料賦值給模板),然後組織成響應格式返回給瀏覽器,瀏覽器進行解析後並最終呈現給使用者。
注意:MTV 設計模式中,用 View 層取代了 Controller 層的位置,用 Template 層取代了原來 View 層的位置。MTV 是 MVC 的一種細化,將原來 MVC 中的 V 層拿出來進行分離,檢視的顯示與如何顯示交 給 Template 層,而 View 層更專注於實現業務邏輯。
三、Django的安裝
注意Django的專案裡不要有中文名的檔案,否則可能報錯
1、命令列安裝
django下載 命令列安裝:pip3 install diango ==1.11.11 如何確認是否安裝成功 命令列敲 django-admin
2、Django建立專案
1、命令列
按照下面步驟建立後,就可以去你建立的資料夾裡面檢視建立的檔案
#命令列式 #1.命令列建立django專案 django-admin startproject 專案名 #2.命令列建立django應用(一個應用對應一塊兒獨立的功能) django-admin startapp 應用名 python manage.py startapp 應用名 #3.命令列啟動django專案 python manage.py runserver (******) 注意 用命令列建立django專案 不會自動新建templates模板資料夾需要自己手動建立並且需要你自己去settings.py檔案中註冊該檔案路徑
2、pycharm建立
2、 pycharm快捷命令列建立應用和專案
如:django-admin startproject 專案名 只書寫:startproject + 專案名即可,再是startapp 應用名,在通過runserver啟動專案。可通過這個Django專案裡可建立多個app
3、注意建立的新的app必須要取seetings裡面註冊
四、Django基礎三件套
HttpResponse:返回字串
render:返回html頁面 並且能夠給該頁面傳值
redirect:重定向
使用匯入:
from django.shortcuts import HttpResponse, render, redirect
五、響應狀態碼
具體表現形式:
1xx:服務端已經成功接收到了你的資料正在處理,你可以繼續提交額外的資料
2xx:服務端成功響應,你想要的資料(請求成功 200)
3xx:重定向(當你在訪問一個需要登入之後才能訪問的頁面 你會發現視窗會自動調到登入頁面 301 302)
4xx:請求錯誤(請求資源不存在404,請求不合法不符合內部規定會許可權不夠403)
5xx:伺服器內部錯誤(500) 系統崩掉:洪水攻擊 系統癱瘓等
http狀態碼:
HTTP狀態碼
200 返回正常
304 服務端資源無變化,可使用快取資源
400 請求引數不合法
401 未認證
403 服務端禁止訪問該資源
404 服務端未找到該資源
500 服務端異常
六、手擼web框架
import socket server = socket.socket() #括號內不寫預設是tcp協議 server.bind(("127.0.0.1",8080)) server.listen(5) while True: conn,addr = server.accept() data = conn.recv(1024) conn.send(b"HTTP/1.1 200 OK\r\n\r\n hello world") # 必須遵循HTTP協議 print(data) data = data.decode("utf-8") # "b'GET /login HTTP/1.1\r\nHost:切割獲取客戶端頁面返回的型別login" current_path = data.split("\r\n")[0].splist(' ')[1] print(current_path) if current_path =="/index": with open(r":xxx.html",'rb') as f: conn.send(f.read()) elif current_path =='/login': conn.send(b'login') else: conn.send(b"hello world!") conn.close()
七、WSGI
WSGI(Web Server Gateway Interface)就是一種規範,它定義了使用Python編寫的web應用程式與web伺服器程式之間的介面格式,實現web應用程式與web伺服器程式間的解耦。常用的WSGI伺服器有uwsgi、Gunicorn。而Python標準庫提供的獨立WSGI伺服器叫wsgiref,Django開發環境用的就是這個模組來做伺服器。
1、基於wsgiref模組
基於wsgiref模組及拆分成不同的檔案之後,加一個功能只需要在兩個地方修改程式碼即可: 1.urls.py 路由與檢視函式的對應關係 2.views.py 檢視函式
程式碼演示:
from wsgiref.simple_server import make_server from urls import urls from views import * def run(env,response): """ env是請求相關的資料 response是響應相關的資料 """ # print(env) response('200 OK',[]) current_path = env.get('PATH_INFO') # print(current_path) # if current_path == '/index': # return [b'index'] # elif current_path == '/login': # return [b'login'] # 定義一個儲存函式名的標誌位 func = None for url in urls: # 判斷當前url在不在元組內 if url[0] == current_path: # 只要匹配上了 就把url字尾對應的函式名賦值給func func = url[1] # 一旦匹配上 應該立刻退出for迴圈 節省資源 break # 對變數func做判斷 if func: res = func(env) else: res = errors(env) return [res.encode('utf-8')] if __name__ == '__main__': server = make_server('127.0.0.1',8080,run) # 實時監測127.0.0.1:8080地址 一旦有客戶端來連線 會自動加括號呼叫run方法 server.serve_forever() # 啟動服務端 # 物件加括號呼叫 觸發--call--
urls.py:配置路由
from views import * urls = [ ('/index',index), ('/login',login), ('/reg',reg), ('/get_time',get_time), ('/get_user',get_user), ('/get_db',get_db), ]
views.py:利用jinja2渲染htlm頁面
def index(env): return 'index' def login(env): return 'login' def errors(env): return '404 error' def reg(env): return 'reg' from datetime import datetime def get_time(env): # 藉助於時間模組 現在後端獲取到時間資料 current_time = datetime.now().strftime('%Y-%m-%d %X') with open(r'templates/02 get_time.html','r',encoding='utf-8') as f: data = f.read() # data其實就是一串字串 僅此而已!!! data = data.replace('$$time$$',current_time) return data 頁面的渲染 from jinja2 import Template def get_user(env): user_dict = {'username':'jason','password':'123','hobby':['read','game','running']} with open(r'templates/03 get_user.html','r',encoding='utf-8') as f: data = f.read() temp = Template(data) res = temp.render(data = user_dict) # 將user_dict傳遞給前端頁面 前端頁面通過變數名data就能夠獲取到該字典 return res 動態展示資料到html import pymysql def get_db(env): conn = pymysql.connect( host = '127.0.0.1', port = 3306, user = 'root', password = '123', database = 'day1', charset = 'utf8', autocommit = True ) cursor = conn.cursor(pymysql.cursors.DictCursor) sql = "select * from userinfo" affect_rows = cursor.execute(sql) data = cursor.fetchall() # print(data) with open(r'templates/04 get_db.html','r',encoding='utf-8') as f: data1 = f.read() temp = Template(data1) res = temp.render(user_list= data) return res
jinja2模組:
由於flask框架是依賴於jinja2的 所以下載flask框架也會自帶jinja2模組,jinja2的作用:模板的渲染 包含了 模板語法
1、語法:
{{ }}:變數相關
<p>{{data}}</p> <p>{{data['username']}}</p> <p>{{data.password}}</p> <p>{{data.get('hobby')}}</p>
2、{% %}邏輯相關
{%for user_dict in user_list%} <tr> <td>{{user_dict.id}}</td> <td>{{user_dict.name}}</td> <td>{{user_dict.password}}</td> </tr> {%endfor%}