《Flask Web 開髮指南 pt.2》

来源:https://www.cnblogs.com/edisonfish/archive/2023/04/08/17298544.html
-Advertisement-
Play Games

哈嘍大家好,我是鹹魚 在《Flask Web 開髮指南 pt.1》中,鹹魚跟大家介紹了 Flask 的由來——誕生於一個愚人節玩笑,簡單介紹了一些關於 Flask 的概念,並且編寫了一個簡單的 Flask 程式 在編寫 Flask 程式的時候,你需要註意你的程式文件不要命名為 flask.py,建議 ...


哈嘍大家好,我是鹹魚

 

《Flask Web 開髮指南 pt.1》中,鹹魚跟大家介紹了 Flask 的由來——誕生於一個愚人節玩笑,簡單介紹了一些關於 Flask 的概念,並且編寫了一個簡單的 Flask 程式

 

在編寫 Flask 程式的時候,你需要註意你的程式文件不要命名為 flask.py,建議命名為 app.py 或者 wsgi.py

 

但如果你的程式不是叫 app.py 或者 wsgi.py,那麼你就需要設置環境變數 FLASK_APP 的值為程式名字

 

設置環境變數有兩種方法,在《開髮指南 pt.1》有提到,大家可以去看一下

 

 運行環境

我們知道,代碼的運行環境一般分為開發環境和生產環境

 

開發環境指的是我們在本地編寫和測試程式時的電腦環境

 

而生產環境也叫線上環境,指的是程式部署在互聯網能夠對外提供服務且供用戶使用的環境

 

在 Flask 中,Flask 會根據運行環境的不同來改變相應的行為和設置,建議小伙伴們在編寫 Flask 程式的時候將運行環境設置成開發環境

 

因為在開發環境下,Flask 會開啟調試模式(Debug Mode),這時候執行 flask run啟動程式會激活 Werkzeug 內置的調試器和重載器,這能更好地幫助我們去 debug

 

  • 調試器(debugger)

當你的程式報錯時,網頁會生成詳細的錯誤信息,而調試器允許你在錯誤頁面上執行代碼

 

 

首先單擊錯誤信息右側的命令行圖標,然後會彈出一個視窗要求你輸入 PIN 碼,這個 PIN 碼在你執行 flask run 命令的時候程式會給你

 

 

 

 

 

 

 

 

輸入 PIN 碼之後,點擊錯誤堆棧的某個節點右側的命令行圖標,就會出現一個包含代碼執行上下文信息的 Python Shell

 

 

  • 重載器(reloader)

重載器的作用就是檢測程式文件的變動,然後重啟。當修改了代碼之後,你會在終端看到下麵的輸出

 

這意味著每次修改完代碼不需要手動重啟 flask 程式

 

PS

網上有些 flask 教程可能告訴你按照下麵的方式將 Flask 運行環境將設置成開發環境

 

這個環境變數在早期版本的 flask 中是適用的,但是後面被棄用了,不建議使用這個環境變數,否則可能會 warning

 

 

 相關鏈接:https://github.com/docker/docs/issues/15571

 

URL 路由

註冊路由

 

 

在上面這段代碼中,我們通過 route() 裝飾器將根地址與 index() 函數綁定在一起,當用戶訪問

 

http://localhost:5000/ 的時候,就會顯示 index 函數的返回結果 '<h1>Hello,Flask!</h1>'

 

通過 route() 裝飾器將 URL 與函數建立關聯的這個過程叫做註冊路由,路由負責管理 URL 與函數之間的映射

 

即我訪問哪個 URL (前提是這個 URL 已經與函數建立起了關聯),Flask 就去對應的函數下執行並返回結果給我

 

這個函數被稱作視圖函數,視圖函數返回的結果不僅僅是一串字元串這麼簡單,它還能夠返回各種鏈接、表單、HTML 文件等等

 

上面的代碼中,'/' 為相對 URL,index() 函數為視圖函數

 

一個 Web 程式其實就是用戶點擊不同的 URL 鏈接,程式內部去執行對應的函數然後返回對應的結果給用戶。可以說,大部分 Flask 的基本模式就是這一個個註冊路由的實現

 

為一個視圖函數綁定多個 URL

 

現在無論是訪問 http://localhost:5000/http://localhost:5000/home 還是 http://localhost:5000/index ,返回的都是同一個值

 

動態URL

除此之外,我們還可以在 URL 里定義變數,實現動態 URL

 

添加變數使用 <變數名> 的形式

 

例如 /user/<name> ,flask 在處理請求時會把這個變數傳入視圖函數裡面

 

上面的代碼中 user_page() 視圖的 URL 為 /user/<name>,那麼像 /user/edison、/user/fish 的請求都會觸發這個函數

 

 

 

 

但是如果你訪問的時候沒有添加變數(比如訪問 /user ),那麼會返回一個 404 錯誤,該如何解決呢?

 

常見的方法是設置預設值,當訪問的 URL 裡面沒有帶變數時,就會使用預設值。設置預設值有兩種方法:

 

  • 在裝飾器裡面使用 default 參數添加預設值

請註意,你需要添加兩條 URL 規則,這樣當用戶訪問 /user 時 flask 才能找到對應的視圖函數

 

  • 在視圖函數裡面添加預設值

 

對於 URL 變數,flask 支持在 URL 里對變數設置處理器,對變數進行預處理

 

 轉換器類型:

 

 

 

關於 URL 後面帶斜杠的問題

這是一個常見但是也容易混淆的問題

 

上面的代碼裡面,這兩條 URL 的尾部一個添加了斜杠一個沒有添加,有什麼區別呢?

  • projects() 視圖函數的 URL 尾部有一個斜杠,路徑看起來像一個目錄。如果你訪問 /projects,Flask 會自動幫你重定向到 /projects/  ,即無論是訪問/projects/  還是 /projects ,都能正常返回

  • about() 視圖函數的 URL 尾部沒有斜杠,路徑看起來像一個文件。如果你訪問 /about/  ,Flask 會返回一個 404 錯誤。因為這樣可以保持 URL 唯一,並幫助搜索引擎避免重覆索引同一頁面

 

端點

上面我們講過,在編寫 Flask 程式的時候會將 URL 與 視圖函數進行關聯(註冊路由)

即通過將不同 URL 關聯到不同的視圖函數上,以此來實現不同的業務邏輯

但其實在 Flask 中,URL 首先被映射到端點上,然後再映射到視圖函數

 

端點通常用來標記一個視圖函數以及對應的 URL,預設值是視圖函數的函數名

 

 在上面的代碼中,端點即視圖函數的名稱hello

 

當然你也可以修改端點名(通常不建議這麼做)

 

當訪問 hhttp://localhost:5000/hello 時,URL 首先映射到端點 say_hello 上,然後與端點 say_hello 相關聯的視圖函數 hello() 就會處理這個請求

 

在 web 程式中,URL 無處不在。如果我們在編寫 web 程式的時候使用 URL 都是用硬編碼方式,那麼就會大大降低代碼的易用性

 

硬編碼是指在寫代碼過程中將變數用一個固定數值表示,如果後續想要修改這個變數就非常困難

 

比如在 flask 中,如果你修改了某個路由的 URL,那麼在其他調用到這個 URL 的視圖函數裡面的 URL 都需要修改,很麻煩

 

一個常用的解決方法就是使用 Flask 中的 url_for() 函數來獲取 URL

 

url_for() 函數中第一個參數為端點,這說明端點通常用作反向查詢 URL 地址

 

在上面的代碼中,端點即視圖函數的函數名 index,通過調用 url_for() 函數就可以獲得對應的 URL

 

如果你的視圖函數綁定的是動態 URL,那麼需要在 url_for() 函數中添加相關參數

 

上面所說的 URL 都是相對 URL(URL 中的 path 部分),如果你想獲得絕對 URL,需要在 url_for() 函數中添加相關參數 _external=True

 

 


感謝閱讀,喜歡作者就動動小手[一鍵三連],這是我寫作最大的動力!

 


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

-Advertisement-
Play Games
更多相關文章
  • 效果 搭建一個spring源碼調試環境,創建一個spring-demo模塊,寫一些測試代碼。 給源碼添加註釋。 給源碼打包 ubantu環境下搭建spring6.0.x源碼環境 步驟 源碼網址 Spring Framework 下載代碼 fork到自己的GitHub倉庫,然後拉代碼 git clon ...
  • 簡介 本文給大家推薦博主自己開源的電商項目newbee-mall-pro。在newbee-mall項目的基礎上搭建而來, 使用 mybatis-plus 作為 orm 層框架,並添加了一系列高級功能以及代碼優化,特性如下: 商城首頁 【為你推薦】 欄目添加協同過濾演算法。按照 UserCF 基於用戶的 ...
  • 操作系統 :CentOS 7.6_x64 freeswitch版本 :1.10.9 sofia-sip版本: sofia-sip-1.13.14 freeswitch使用sip協議進行通信,當sip消息超過mtu時,會出現拆包的情況,這裡整理下sip消息拆包原理及組包流程。 一、拆包的原理 簡單來說 ...
  • 函數式語言特性:-迭代器和閉包 本章內容 閉包(closures) 迭代器(iterators) 優化改善 12 章的實例項目 討論閉包和迭代器的運行時性能 一、閉包(1)- 使用閉包創建抽象行為 什麼是閉包(closure) 閉包:可以捕獲其所在環境的匿名函數。 閉包: 是匿名函數 保存為變數、作 ...
  • 承接上文 承接上一篇文章【演算法數據結構專題】「延時隊列演算法」史上手把手教你針對層級時間輪(TimingWheel)實現延時隊列的開發實戰落地(上)】我們基本上對層級時間輪演算法的基本原理有了一定的認識,本章節就從落地的角度進行分析和介紹如何通過Java進行實現一個屬於我們自己的時間輪服務組件,最後,在 ...
  • 實現一個簡單的UDP通信程式,僅作為筆記使用 網路編程中有三要素:IP、埠號和通信協議,分別用來確定對方在互聯網上的地址、指定接受數據的軟體和確定數據在網路中傳輸的規則。 IP地址 IP地址分為IPv4地址和IPv6地址,這裡不做討論。 IPv4地址中分為公網地址(萬維網使用)和私有地址(區域網使 ...
  • 第二章 線程管控 std::thread 簡介 構造和析構函數 /// 預設構造 /// 創建一個線程,什麼也不做 thread() noexcept; /// 帶參構造 /// 創建一個線程,以 A 為參數執行 F 函數 template <class Fn, class... Args> exp ...
  • 作者:袁首京 原創文章,轉載時請保留此聲明,並給出原文連接。 元編程並不象它聽起來那麼時髦和新奇。常用的 decorator 就可以認為是一種元編程。簡單來說,元編程就是編寫操作代碼的代碼。 有點繞,是吧?彆著急,咱們一點一點來討論。 註意:本文中的代碼適用於 Python 3.3 及以上。 元類 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...