1. 程式人生 > 其它 >Django設計模式、安裝、簡介

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%}