Flask入門flask-script 藍本 鉤子函數(三)

来源:https://www.cnblogs.com/why957/archive/2018/05/30/9114088.html
-Advertisement-
Play Games

1 flask script擴展庫 概念 : 是一個flask終端運行的解析器 ,因為項目完成以後,代碼改動會有風險,所以藉助終端完成不同啟動項的配置 安裝 使用 執行程式需要在啟動項輸入命令 2 Blueprint藍圖 概念 : Blueprint通過把實現不同功能的module分開,實現分類功能 ...


1 flask-script擴展庫

概念: 是一個flask終端運行的解析器 ,因為項目完成以後,代碼改動會有風險,所以藉助終端完成不同啟動項的配置

安裝

pip3 install flask-script

使用

from flask_script import Manager   #導入
manager = Manager(app)  #初始化flask運行的解析器
manager.run()   #運行

執行程式需要在啟動項輸入命令

python3 當前啟動文件名.py runserver  可選參數
可選參數如下:
-h  主機名
-p  埠號
--threaded 開啟多線程
-d 開啟調試模式
-r 代碼修改後重新載入

例如:
python3 manage.py runserver -d -r -h127.0.0.1 -p5001 --threaded   參數全部加上

2 Blueprint藍圖

概念 : Blueprint通過把實現不同功能的module分開,實現分類功能,從而把一個大的application分割成各自實現不同功能的module。在一個Blueprint中可以調用另一個blueprint的view function, 但要加相應的blueprint名。本質上來說就是讓程式更加松耦合,更加靈活,增加復用性,提高查錯效率.

導入

from flask import Blueprint,session

使用 : 創建藍圖路由文件userinfo.py文件

from flask import Blueprint

user = Blueprint('user',__name__)
@user.route('/login')
def login():
    return 'login'
    
註意 : 1 Blueprint接受兩個參數實例化,分別文藍本名與藍本所在的包與模塊
       2  藍本實質上也是一個命名空間

在啟動文件中註冊藍本: app/__init__.py,一般在初始化時候註冊藍圖

from mysession import user
app.register_blueprint(user)   #app註冊藍本user

app.register_blueprint(user,url_prefix='/user')  #在app中註冊藍本user,並添上首碼/user

下麵我們以一個具體例子說明: 假定一個文件系統

--app
    --main
        __init__.py
        errors.py
        forms.py
        views.py
     __init__.py
 其中mian就是藍本模塊,錯誤信息保存在errors.py,視圖函數保存在views.py文件中

(1) 創建藍本:

在文件app/main/__init__.py添加定義:

from flask import Blueprint
main = Blueprint('admin',__name__)
from . import views,errors

註:1 通過實例化Blueprint類的對象創建一個藍本
   2 視圖與errors的導入應放在藍本創建之後,防止迴圈導入問題

在文件app/main/views.py中添加視圖函數:

from . import main #當前目錄下導入藍本
from flask import render_template

@main.route('/test/')
def test():
    return render_template('main/test.html'),200
註: 1 跳轉到模板頁面test.html

在文件app/main/errors.py中添加錯誤視圖函數:

from flask import render_template
from app.main import main  #導入藍本
#捕捉404狀態碼
@main.app_errorhander(404)
def page_not_found(e):
    return render_tamplate('main/404.html'),404
#捕捉500狀態碼
@main.app_errorhander(500)
def internal_server_error(e):
    return render_template('main/500.html'),500

(2) 註冊藍本

app/__init__.py中添加註冊藍本代碼

from app.main import main   #導入藍本
app.register_blueprint(main,url_prefix='/admin')

(3) 構造url路由

在view視圖中有函數test
url_for('main.test')   url_for('藍本名.視圖函數名')

3 鉤子函數

類似於django中間件 在使用的時候需要使用裝飾器,使得 程式變成 A函數--->鉤子函數---->B函數,

flask項目中有個是應用上下文(app),一個是請求上下文(request),請求上下文request和應用上下文current_app都是一個全局變數。所有請求都共用的。Flask有特殊的機制可以保證每次請求的數據都是隔離的,即A請求所產生的數據不會影響到B請求。所以可以直接導入request對象,不會受到外界影響

兩個上下文一般包含4個屬性:

  1. request : 請求上下文的對象,一般用來保存一些請求的變數。比如method、args、form等。
  2. session: 請求上下文的對象,一般用來保存一些會話信息.
  3. current_app: 返回當前App
  4. g: 全局變數,應用上下文的對象,處理請求時作為臨時存儲的對象 : g.message存儲信息
鉤子函數 功能描述
before_first_request 第一次請求之前
before_request 每次請求之前
after_request 每次請求之後
teardown_request 不管是否異常都會在請求之後執行
context_processor 上下文處理器,返回字典的健
errorhandler errorhandler接收狀態碼,可以自定義返回狀態碼的響應頁面

註 : 在藍本中使用鉤子函數需要進行轉化: @mysession.teardown_app_request 藍本名.teardown_app_request

4 g對象

g : 全局變數,需要導入使用 from flask import g

  1. g對象專門用來保存用戶數據的
  2. g對象在一次請求中所有代碼都是公用的

例如: 在提交表單中測試下 action='{{ url_for('login') }}' method='post'

login_user.html

<form action="{{ url_for('login') }}" method="post">
       <table>
                    <tr>
                       <td>用戶名:</td>
                       <td><input type="text" placeholder="請輸入用戶名" name="username"></td>
                    </tr>
                    <tr>
                        <td>密碼:</td>
                        <td><input type="text" placeholder="請輸入密碼" name="password"></td>
                    </tr>
                    <tr>
                        <td></td>
                        <td><input type="submit" value="登錄"></td>
                    </tr>
       </table>
</form>

視圖函數utils.py中

from flask import g
def login_username():
    return u'當前登錄用戶:{}'.format(g.username)

def login_password():
    return u'當前密碼:{}'.format(g.password)

在主文件視圖函數中views.py

from flask import Flask,g,request,render_template
from utils import login_username

app = Flask(__name__)

@app.route('/login/',methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        return render_template('login.html')
    else:
        username = request.form.get('username')
        password = request.form.get('password')
        g.username = username   #將username變成全局g對象信息存儲
        g.password = password   #將password變成全局g對象信息存儲
        login_username()
        login_password()
        return u'登錄成功!'

if __name__ == '__main__':
    app.run()

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

-Advertisement-
Play Games
更多相關文章
  • https://www.cnblogs.com/taoweiji/archive/2012/12/14/2818787.html GridBagLayout是java裡面最重要的佈局管理器之一,可以做出很複雜的佈局,可以說GridBagLayout是必須要學好的的, GridBagLayout 類是 ...
  • 對於volatile型變數的特殊規則 關鍵字volatile可以說是Java虛擬機提供的最輕量級的同步機制。 在處理多線程數據競爭問題時,不僅僅是可以使用synchronized關鍵字來實現,使用volatile也可以實現。 Java記憶體模型對volatitle專門定義了一些特殊的訪問規則,當一個變 ...
  • 承接上篇文章Django Rest Framework源碼剖析(二) 許可權,當服務的介面被頻繁調用,導致資源緊張怎麼辦呢?當然或許有很多解決辦法,比如:負載均衡、提高伺服器配置、通過代理限制訪問頻率等,但是django rest framework自身就提供了訪問頻率的控制,可以從代碼本身做控制。 ...
  • Long Parameter List(過長參數列) Divergent Change(發散式變化) Shotgun Surgery(散彈式修改) Feature Envy(依戀情結) Data Clumps(數據泥團) Primitive Obsession(基本型別偏執) Switch Stat... ...
  • 在Flask中鉤子函數是使用特定的裝飾器的函數。為什麼叫做鉤子函數呢,是因為鉤子函數可以在正常執行的代碼中,插入一段自己想要執行的代碼,那麼這種函數就叫做鉤子函數。 before_first_request:Flask項目第一次部署後會執行的鉤子函數。 before_request:請求已經到達了F ...
  • 博客園是面向開發者的知識分享社區,不允許發佈任何推廣、廣告、政治方面的內容。 博客園首頁(即網站首頁)只能發佈原創的、高質量的、能讓讀者從中學到東西的內容。 如果博文質量不符合首頁要求,會被工作人員移出首頁,望理解。如有疑問,請聯繫[email protected]。 ...
  • 大家好,併發編程 進入第十章。好了,今天的內容其實還挺多的,我準備了三天,到今天才整理完畢。希望大家看完,有所收穫的,能給小明一個贊。這就是對小明最大的鼓勵了。為了更好地銜接這一節,我們先來回顧一下上一節的內容。 上一節「」,我們首先介紹了,如何創建一個協程對象.主要有兩種方法 通過async關鍵字 ...
  • 在瞭解完了 Python函數基礎篇 之後,本篇的存在其實是為了整合知識,由於該篇的知識是否雜亂,故大家可以通過點開點連接直接進入其詳細介紹,該篇主要大致的介紹一下幾個知識點: 一、Python的迭代器和生成器 二、Python的內置函數 三、Python的open函數之文件處理 四、Python的遞 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...