Hello Flask

来源:https://www.cnblogs.com/sfencs-hcy/archive/2019/03/30/10624969.html
-Advertisement-
Play Games

Hello Flask Flask簡介 Flask是一個使用Python編寫的輕量級Web應用框架。基於Werkzeug WSGI工具箱和Jinja2 模板引擎。Flask使用BSD授權。Flask被稱為“microframework”,因為它使用簡單的核心,用extension增加其他功能。Fla ...


Hello Flask

Flask簡介


Flask是一個使用Python編寫的輕量級Web應用框架。基於Werkzeug WSGI工具箱和Jinja2 模板引擎。Flask使用BSD授權。
Flask被稱為“microframework”,因為它使用簡單的核心,用extension增加其他功能。Flask沒有預設使用的資料庫、窗體驗證工具。然而,Flask保留了擴增的彈性,可以用Flask-extension加入這些功能:ORM、窗體驗證工具、文件上傳、各種開放式身份驗證技術。
Flask英文翻譯為瓶子,燒瓶,與另一個web框架Bottle同義,意在表示另一種容器,另一個框架。而且他們兩個也有一些相似的地方。

第一個Flask程式


from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
    return '<h1>Hello,Flask<h1/>'
app.run('127.0.0.1',8000)

運行後可見控制台輸出:

  • Serving Flask app “hello” (lazy loading)
    • Environment: production
      WARNING: Do not use the development server in a production environment.
      Use a production WSGI server instead.
    • Debug mode: off
    • Running on http://127.0.0.1:8000/ (Press CTRL+C to quit)

URL路由

Flask路由採用裝飾器的方式


@app.route('/')
  def index():

綁定多個路由


@app.route('/index')
@app.route('/')
def index():

動態路由


@app.route('/index/<name>')
def index(name):

name會作為參數傳入視圖函數
也可以為參數設置預設值:


@app.route('/index',defaults={'name':'sfencs'})
@app.route('/index/<name>')
def index(name):

它其實相當於


@app.route('/index')
@app.route('/index/<name>')
def index(name='sfencs'):

還可以指定參數的類型:


@app.route('/index/<int:num>')
def index(num):

這樣路由只會匹配index後是數值類型參數的url,並且還會把num轉換為int型
除了int之外還有path,string,float,any,uuid等

指定請求方式的路由


@app.route('/index/<int:num>',methods=['get'])
def index(num):

method參數是一個列表

使用url_for()獲取url

當視圖函數綁定的路由發送改變時,我們可能在其他使用該路徑的地方一個一個手動修改,這種硬編碼的方式降低了代碼的易用性,這種情況可以使用url_for()函數來獲取url
url_for()函數的參數為視圖函數名
例如


@app.route('/index')
def aaa():

那麼url_for(’aaa‘)就是’/index’
當然如果是有參數的路由,那麼需要在url_for()函數中傳入參數
例如


@app.route('/index/<int:num>')
def aaa(num):

url_for函數就應該寫為:url_for(‘aaa’,num=123)
url_for()函數預設生成的是相對URL,要想生成絕對URL需要加入參數_external=True

http請求與響應

請求

如何在視圖函數中獲取請求,首先需要引入request對象


from flask import Flask,request

在視圖函數中可以直接通過request獲得屬性或方法
舉個簡單的例子


@app.route('/index/<int:num>',methods=['get'])
def index(num):
    print(request.method)
    print(request.args.get('name','sfencs'))
    return '<h1>Hello,Flask<h1/>'

request中的方法和屬性未來都會對我們很有用,這裡就不一一介紹了。

響應

1.普通響應

return '<h1>Hello,Flask<h1/>'

return '<h1>Hello,Flask<h1/>',200  #可以設置狀態碼
2.重定向

return redirect(url_for('index'))
3.錯誤響應
abort(404)

abort()函數直接返回錯誤響應,後面的代碼不再執行

4.返迴響應對象

response = make_response('<h1>Hello,Flask<h1/>')
response.mimetype = 'text/html'
return response

通過設置mimetype可以返回不同類型的數據,常用的有純文本,html,xml,json
返回json格式數據時Flask提供一種更簡潔的方式


return jsonify({'name':'sfencs'})

這一個東西把生成response對象,設置數據類型,json序列化都做完了。

請求鉤子

請求鉤子是在視圖函數處理請求的前或者後的階段進行的處理函數
Flask預設實現的五種請求鉤子:

  • before_first_request 處理第一個請求之前
  • before_request 處理請求之前
  • after_request 處理請求之後
  • after_this_request 在視圖函數內註冊一個函數,會在這個請求結束後運行
  • teardown_request 在請求結束後,如果有異常也會執行的鉤子,它在所有鉤子中最後一個執行,需要傳入異常對象

鉤子通過裝飾器註冊,比如

@app.before_request
def func():
  pass

after_request和after_this_request的鉤子必須接受一個響應類對象做參數,最後並將其返回

配置變數

Flask中,配置變數通過Flask對象的config屬性配置與獲取
在Flask對象的源碼中看到config中已經存儲了很多預設值


default_config = ImmutableDict({
    'ENV':                                  None,
    'DEBUG':                                None,
    'TESTING':                              False,
    'PROPAGATE_EXCEPTIONS':                 None,
    'PRESERVE_CONTEXT_ON_EXCEPTION':        None,
    'SECRET_KEY':                           None,
    'PERMANENT_SESSION_LIFETIME':           timedelta(days=31),
    'USE_X_SENDFILE':                       False,
    'SERVER_NAME':                          None,
    'APPLICATION_ROOT':                     '/',
    'SESSION_COOKIE_NAME':                  'session',
    'SESSION_COOKIE_DOMAIN':                None,
    'SESSION_COOKIE_PATH':                  None,
    'SESSION_COOKIE_HTTPONLY':              True,
    'SESSION_COOKIE_SECURE':                False,
    'SESSION_COOKIE_SAMESITE':              None,
    'SESSION_REFRESH_EACH_REQUEST':         True,
    'MAX_CONTENT_LENGTH':                   None,
    'SEND_FILE_MAX_AGE_DEFAULT':            timedelta(hours=12),
    'TRAP_BAD_REQUEST_ERRORS':              None,
    'TRAP_HTTP_EXCEPTIONS':                 False,
    'EXPLAIN_TEMPLATE_LOADING':             False,
    'PREFERRED_URL_SCHEME':                 'http',
    'JSON_AS_ASCII':                        True,
    'JSON_SORT_KEYS':                       True,
    'JSONIFY_PRETTYPRINT_REGULAR':          False,
    'JSONIFY_MIMETYPE':                     'application/json',
    'TEMPLATES_AUTO_RELOAD':                None,
    'MAX_COOKIE_SIZE': 4093,
})

它其實是字典的子類,所以我們可以以字典的方式操作它


app.config['SWITCH'] = 'on'
print(app.config['SWITCH'])

也可以使用update方法一次添加多個配置


app.config.update(SWITCH_A=True,SWITCH_B=False)

最後要註意配置變數的名稱必須要大寫,小寫的變數不會被讀取

debug模式

如運行時控制台的輸出

  • Debug mode: off

可知預設debug模式是關閉的,所以當訪問路徑的程式出現錯誤的時候頁面會顯示

若要開啟debug模式,可在run方法添加debug=True參數


app.run('127.0.0.1',8000,debug=True)

此時我們故意使程式出錯,即將視圖函數多添加一個參數,再次訪問url,會出現

這個頁面對於我們調試錯誤非常有用,同時還允許我們在頁面上執行Python代碼,我們只需要點擊錯誤最右邊的命令行圖標
這時會彈出一個視窗讓我們輸入PIN碼,這個可以在程式剛允許時控制台輸出找到

輸入後就可在頁面執行代碼了


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

-Advertisement-
Play Games
更多相關文章
  • 使用工廠模式解耦。 一、需求場景: 某一層功能需要改動,但其他層代碼不變 實現類1: 查詢自己的資料庫. ====改為==== 實現類2: 從其它地址得到數據. 二、步驟: 1.創建一個 類,Bean工廠 2.解決硬編碼問題,進一步優化解耦 提供一個配置文件: 內容: 三、理論 1.導入 使用介面開 ...
  • 策略模式屬於對象的行為模式。其用意是針對一組演算法,將每一個演算法封裝到具有共同介面的獨立的類中,從而使得它們可以相互替換。策略模式使得演算法可以在不影響到客戶端的情況下發生變化。 策略模式的結構 策略模式是對演算法的包裝,是把使用演算法的責任和演算法本身分割開來,委派給不同的對象管理。策略模式通常把一個系列的 ...
  • 作為一門面向對象的編程語言,Java認為一切皆是對象,每個對象都能歸屬於某個類,甚至每個類均可提取出一種特殊的類型,即Class類型。早在前面介紹多態的時候,就提到每個類都存在獨一無二的基因,通過比較實例的類基因與具體類名的類基因,即可分辨某個實例是否屬於目標類。例如,若想獲取公雞類的類型,則可通過 ...
  • 近幾天,很多公眾號發佈了 Python 官方文檔的消息。然而,一個特別奇怪的現象就發生了,讓人啼笑皆非。 Python 文檔的中文翻譯工作一直是“默默無聞”,幾個月前,我還吐槽過這件事《再聊聊Python中文社區的翻譯》,當時我們的進度是 10.3%,遠遠落後於日本和法國,甚至落後於巴西! 這次所謂 ...
  • 用python轉換jupyter成pdf 關註公眾號「**Python專欄**」,後臺回覆「**zsxq06**」,獲取本文全套源碼! ...
  • Java環境配置 1.JDK下載安裝 進入oracle官網選擇jdk下載(快捷鏈接:https://www.oracle.com/technetwork/java/javase/downloads/index.html) 選擇jdk版本(記住jdk的安裝路徑) 2.環境變數配置 右鍵我的電腦——點擊 ...
  • 問題如圖 需要添加一個導入 這樣就不會報錯了 ...
  • Maven生成jar包時, 怎樣把項目中依賴的jar包也包括進去? 這裡介紹2種方式: 使用 shade插件, 和使用 assembly插件. 另外擴展Maven安裝本地jar包到本地倉庫的方法、手動生成jar包的方法、Linux下運行jar包的幾種方式. ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...