Flask的request和session是從哪裡來的?

来源:https://www.cnblogs.com/594504110python/archive/2018/12/22/10162928.html
-Advertisement-
Play Games

因為之前一直在項目中使用django, 所以在學習Flask的過程中, 難免對吧django和Flask進行對比, 這一次我發現Flask中的request和session並沒有想象的那麼簡單, 所以就讀了一下這一部分的源碼, 讀完之後對整個過程理解了一番, 好像並沒有get到Flask的開發這個這 ...


因為之前一直在項目中使用django, 所以在學習Flask的過程中, 難免對吧django和Flask進行對比,

這一次我發現Flask中的request和session並沒有想象的那麼簡單, 所以就讀了一下這一部分的源碼,

讀完之後對整個過程理解了一番, 好像並沒有get到Flask的開發這個這樣寫的原因什麼, 以後再使用Flask

的過程中希望能漸漸的明白這個其中的原因吧, 要是有老鐵能指點一二, 那就更好了, 評論區見吧老鐵

PS: 我覺得你應該也不知道, 否則你怎麼會淪落到看我博客的地步呢, 哈哈

 

我發現

django中使用request, 這個和request是視圖函數傳進來的參數, 當用戶請求進來後, 根據URL進入不同的視圖, 隨之

當前請求的request也被傳進來了, 所以的django的request的由來很清楚, Flask中的request並非如此, 當你點擊request時

會發現, 他是另外一個叫做globals.py中的一個對象, 從名字上就可以看出, 這是一個全局的變數, 而且是在當前模塊內

實例化好的一個對象, 都是知道, python的模塊導入就是一個天然的單例, 也就是說, 在整個flask程式中就這一個request對象,

不信你看, 有圖為證

 

request到底是怎麼回事

要想知道reqeust是怎麼回事, 就要從用戶的請求進來開始說了, 

還有一件事就是當flask啟動的時候, 也就是執行run的時候都做了什麼, 因為globas這個模塊肯定是被載入了, 只要一載入

globals中會有好多對象, 現在只知道這個裡面的對象都是去全局的就可以.

 

werkzeug介紹

 Flask 是一個微型的 Python 開發的 Web 框架,基於Werkzeug WSGI工具箱和Jinja2模板引擎,使用BSD授權。 

看看werkzeug是如何工作的

from werkzeug.wrappers import Response, Request
from werkzeug.serving import run_simple


@Request.application
def app(req):  # 接受一個request
    print(req)
    # < Request http: // 127.0.0.1: 8800 / favicon.ico [GET] >
    print(req.method)
    # GET
    print(req.path)
    # /
    return Response("200 OK!")


run_simple(hostname="127.0.0.1", port=8800, application=app)

運行上面的代碼, 就會啟動一個服務, 瀏覽器就可以直接訪問, 並且返回頁面 200 OK!

簡單說當請求進來之後就會執行application=app, 也就是對app進行加括弧執行, 記住一個加括弧, 後面會用到的.

 

flask上下文管理之存放用戶請求高清無碼大圖

有了上面的問題, 在加上知道了werkzeug是如何接受用戶的請求的, 那麼就可以看圖說話了

記住當接受到請求請求後, werkzeug會對app進行加括弧執行

 

 當使用request時又發生了什麼

看完上面的圖, 就能大概瞭解, request使用哪裡來, 存放了哪裡, 那麼我們又是怎麼使用request的呢, 看下麵又一副大圖

 

偏函數的簡單瞭解

源碼中用到了一個偏函數, 看看偏函數大概是怎麼用的

from functools import partial


def add(a, b):  # 這個函數需要兩個參數
    return str(a) + str(b)


ret = partial(add, "request")
# 偏函數返回一個未執行的函數, 這個函數就是add函數, 並且本來需要兩個參數, 現在只要一個參數就可以執行
# 偏函數固定一個add的一個參數為request
# 偏函數的源碼看不到, 不過我覺得是直接操作的內容, 將參數傳到了函數中
# 要是按照正常的傳參的數, 函數一加括弧就執行了, 但是偏函數卻返回了一個已經傳好參數並且未執行的函數
print(ret("          我是傳進來的參數"))

# 輸出
# request          我是傳進來的參數

 

無碼高清大圖

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 組合模式通過將多個具有相同屬性和行為的對象組裝成一個類似樹形結構的單一對象。以此來表示各個對象之間的層次關係。 前言 組合模式屬於結構型模式,通過將多個相似對象組合到一起,從而能夠構建出一個樹形的 整體 部分 的關係。保證了單個對象和組合對象的使用方式是一致的。在現實場景中,類似電腦中文件夾的瀏覽展 ...
  • 過濾器模式通過使用不同的過濾標準來篩選數據,解耦了多個數據源的數據篩選操作。 介紹 過濾器模式屬於結構型模式,它通過將多個不同的過濾標準結合起來從而達到一個統一的過濾標準,使具體的過濾對上層隔離。 類圖描述 由上圖可知, ICriteria 定義了過濾介面,然後 CriteriaMale 、 Cri ...
  • java 面試中單例模式基本都是必考的,都有最推薦的方式,也不知道問來幹嘛。下麵記錄一下 ...
  • builder模式,目的在於:抽離複雜對象的構造函數,讓我們可以通過多種方法的排列組合構建複雜的對象。如果構造器參數過多,可以考慮 builder 模式 ...
  • 上一篇用鏈表實現了stack,這篇我們採用數組來存儲數據,數組更容易理解,直接貼代碼 第一、代碼實現 1 #pragma once 2 #include <iostream> 3 using namespace std; 4 template <typename T> class StackArra ...
  • 有時,變數的取值只在一個有限的集合內。針對這種情況,可以使用枚舉類型。此外,使用枚舉值來代替直接使用字面量可以讓程式更加易於閱讀和維護。本文將從枚舉類型的定義以及如何使用枚舉類型兩個方面對枚舉類型進行詳細的介紹。 ...
  • C++是一門電腦編程語言,G++不是語言,是一款編譯器中編譯C++程式的命令而已。 不同的編譯器,會對代碼做出一些不同的優化 比如說: a++; 和 ++a; 如果從標準C的角度去理解。a++這個語句等同於 a = a + 1 也就是說,我是先調用,再自增。在調用過程中,會申請一個新的數據地址,用 ...
  • 1、Spring Boot 簡介 簡化Spring應用開發的一個框架 整個Spring技術棧的一個大整合 J2EE開發的一站式解決方案 2、微服務 2014, martin fowler 微服務:架構服務 (服務微化) 一個應用應該是一組小型服務;可以通過HTTP的方式進行互通 單體應用:ALL I ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...