Python 後端第二彈

(一)閉包和 lamda 表達式前端

  1. 一切變量的保存都須要佔用內存。當一個內存空間再也不可能被內存訪問時,就會被 Python 虛擬機回收,將從新分配給其餘變量。
  2. 不能被訪問:
    • 變量被 del 語句刪除
    • 通常狀況下函數中定義的變量在函數運行時被分配給內存空間,在函數運行結束後再也不可能被訪問
    • 對象再也不被任何變量引用時,它不可能被訪問
  3. 關於函數運行分配內存的說明
    • 每一個函數運行時都要分配給它必定的內存空間
    • 同一個函數屢次執行,不必定每次都分配了一樣的內存 空間
    • 若是函數執行過一次後,其內存空間沒有徹底被回收。則再次運行時分配的內存應當避開這些沒有被回收的空間,另外開闢一塊
    • 在併發(或並行)執行多個函數時,不管他們是不是同一個函數名,不管他們是否來自於同一段代碼定義,每一個函數都分配有獨立的一塊內存空間
  4.  閉包機制
    • 對於「閉包」能夠從三個方面理解
      • 語法上:閉包是指利用函數定義嵌套,外層函數限制內層函數定義的自由變量
      • 實現上:閉包是經過利用函數能夠做爲返回值(或函數的參數)的特性以及內存管理機制,保持對一個已經執行完畢的函數的變量進行訪問。(因爲訪問被保持,因此這些變量的內存並不會被回收)
      • 意義上:閉包函數所「包」的變量能且僅能被這個函數訪問,這樣就保持了數據的純淨,防止數據被污染(被其餘代碼訪問或修改)
    • 簡單來講:設有一對有嵌套關係的函數定義。內層函數中有能夠訪問外層函數變量的代碼。經過保持對內存函數的訪問已經執行完的外層函數的變量不被刪除

 

   5. 在上古編程時代尚未內的說法,咱們經過閉的方式向裏面傳遞參數。這樣就實現了一個和類差很少的功能python

(二)瀏覽器傳來的 Query算法

  瀏覽器客戶端傳來 Query 的方法能夠有兩種,一種是用 GET 方法,另一種是用 POST 方法數據庫

  GET 方法沒有body,依靠的是路由傳參,咱們直接解析出 path query 就能夠編程

  GET後端

    • 請注意,查詢字符串(名稱/值對)是在 GET 請求的 URL 中發送的: 
    • GET 請求可被緩存
    • GET 請求保留在瀏覽器歷史記錄中
    • GET 請求可被收藏爲書籤
    • GET 請求不該在處理敏感數據時使用
    • GET 請求有長度限制
    • GET 請求只應當用於取回數據
    • /test/demo_form.asp?name1=value1&name2=value2

  POST瀏覽器

    • POST 請求不會被緩存
    • POST 請求不會保留在瀏覽器歷史記錄中
    • POST 不能被收藏爲書籤
    • POST 請求對數據長度沒有要求
    • POST /test/demo_form.asp HTTP/1.1
      Host: w3schools.com
      name1=value1&name2=value2

 

 

(三)類方法存在的意義緩存

  1. 類方法是類名直接能夠調用的方法,在函數的前面用 @classmethod 來修飾。類方法必須傳入 def fun(cls): ,它的主要使用目的是在實例存在之前操做模板,還能夠用類方法產生實例。好比說咱們經常使用的 all() fund_by(slef.id = user.id) 函數
  2. 實例對象能夠調用類方法實例方法
  3. 靜態方法是共享的,放在哪兒都無所謂,講道理的話一般把靜態方法放在 class 的外面

 

 

(四)包和模塊安全

  • 包就就是一個文件夾,裏面必須有__init__.py 文件,這樣纔是一個包。包其實理解爲一種抽象和封裝。好比我把一些列的基本操做封裝成函數,而後對函數進一步抽象封裝成了類,咱們還把不一樣功能的 .py 文件封裝成一個模塊
  • .py 文件咱們叫作一個模塊
  • 如何導入呢?   
  • # import math
    # from math import sin 這是模塊的導入方法
    
    # 如何在模塊中導入呢? 這個時候咱們可使用點語法
    
    # from routes.routes_simpleto import routes_dict as ^^^^
    

      

     

     

(五)摘要算法服務器

  

  1. 摘要算法/用處/常見套路
    • 摘要算法是一種能產生特殊輸出格式的算法
    • 給定任意長度的數據生成定長的密文
    • 摘要結果是不可逆的, 不能被還原爲原數據
    • 理論上沒法經過反向運算取得原數據內容
    • 一般只被用來作數據完整性驗證
    • 或者是用來加密用戶密碼
    • 經常使用的摘要算法主要有 md5 和 sha1

  2.  md5 的輸出結果爲 32 字符

     sha1 的輸出結果爲 40 字符

  咱們儲存在數據庫中的密碼最好不要是明文,若是被別人偷到數據庫就麻煩了。咱們經過摘要算法把密碼映射成一個定長的字符串。可是若是被別人偷到了字符串,仍是能夠在短期內揹包裏破解。或者經過彩虹表等東西直接查詢。

import hashlib # 要加密的是 'gua' # 用 ascii 編碼轉換成 bytes 對象
pwd = 'gua'.encode('ascii') # 建立 md5 對象
m = hashlib.md5(pwd) # 返回摘要字符串, 這裏是 c9c1ebed56b2efee7844b4158905d845
print(m.hexdigest()) # # 建立 sha1 對象
s = hashlib.sha1(pwd) # 返回摘要字符串, 這裏是 4843c628d74aa10769eb21b832f00a778db8b17e
print(s.hexdigest())

咱們的解決方案是經過加鹽的方法,增長盜取者破譯的時間成本。加鹽就是在生分的字符串上加入一些無心義的字段,好比:

YIHI&*……%……&c9c1ebed56b2efee7844b4158905d845
def salted_password(self, password, salt):
    def md5hex(ascii_str):
        return hashlib.md5(ascii_str.encode('ascii')).hexdigest()
    hash1 = md5hex(password)
    hash2 = md5hex(hash1 + salt)
    return hash2

  

 

 

(五)Web 後端傳遞數據的原理

  Web整個機制就像是人與機器在對話同樣,不過只是比較機械的對話。用戶給出一封信(HTTP 協議格式的信),服務器解析它而且機械地組織一封響應的信。(HTTP 協議)咱們對 Web 頁面的訪問是經過對路由的識別解析來完成的(Very important),不管是前端經過超級鏈接來訪問,仍是在前端頁面 form 表單中的 action = "/" 路徑,仍是在服務器來給瀏覽器的回信的時候加上 Location 字段來進行重定向都是經過路由來訪問的。若是咱們把後端的框架搭建好,那麼編寫路由函數就成了後端編程的主要工做。上古時期前端提交數據,就是用的 form 表單,而後依靠表單中的 action 數據實現路由跳轉。今天的 Web 技術已經實現了 Ajax 技術,能夠異步提交數據,和 Javascript 配合不用跳轉頁面就能夠拿到數據。

 

 

(六 )數據庫

  數據庫分爲關係型數據庫和非關係型數據庫。關係新數據庫約束比較複雜,早期主要是給銀行設計的,爲了保證數據的安全,如 MySQL。最近十幾年 NoSQL 型的數據庫也是十分的流行,如:MongoDB。咱們在後端編程使用數據庫的時候會把數據庫的一些 API 封裝成咱們最初設計的 Model 類的樣子,因此加入數據庫咱們的後端操做方式基本沒有改變,仍是在使用 Model 這個設計的存儲模式。   

相關文章
相關標籤/搜索