• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • 01_初識Flask

    標簽: flask框架

    01-初識flask

    1 什么是flask?

    在這里插入圖片描述

    Flask 本是作者 Armin Ronacher在2010年4月1日的一個愚人節玩笑 ,不過后來大受歡迎,進而成為一個正式的python編寫的web框架

    Flask是一個Python編寫的Web 微框架,讓我們可以使用Python語言快速實現一個網站或Web服務,在介紹Flask之前首先來聊下它和Django的聯系以及區別,django個大而全的web框架,它內置許多模塊,flask是一個小而精的輕量級框架,Django功能大而全,Flask只包含基本的配置, Django的一站式解決的思路,能讓開發者不用在開發之前就在選擇應用的基礎設施上花費大量時間。Django有模板,表單,路由,基本的數據庫管理等等內建功能。與之相反,Flask只是一個內核,默認依賴于2個外部庫: Jinja2 模板引擎和 WSGI工具集–Werkzeug , flask的使用特點是基本所有的工具使用都依賴于導入的形式去擴展,flask只保留了web開發的核心功能。

    在這里插入圖片描述

    WSGI(web服務器網關接口)是python中用來規定web服務器如何與python Web服務器如何與Python Web程序進行溝通的標準,本質上就是一個socket服務端。而 Werkzeug模塊 就是WSGI一個具體的實現

    關鍵詞:一個Python編寫微web框架 一個核心兩個庫( Jinja2 模板引擎 和 WSGI工具集)

    2 為什么要有flask?

    flask性能上基本滿足一般web開發的需求, 并且靈活性以及可擴展性上要優于其他web框架, 對各種數據庫的契合度都非常高

    關鍵詞:1. 性能基本滿足需求 2 .靈活性可拓展性強 3. 對各種數據庫的契合度都比較高。

    ? 4.在真實的生產環境下,小項目開發快,大項目設計靈活

    在這里插入圖片描述

    3 學前準備:虛擬環境

    3.1 虛擬環境是什么?

    虛擬環境是隔離的Python解釋器環境。通過創建虛擬環境,你可以擁有一個獨立的Python解釋器環境,相當于對全局的python解釋器環境拷貝一份私有的副本, 這樣做的好處是可以為每一個項目創建獨立的Python解釋器環境,因為不同的項目常常會依賴不同版本的庫或Python版本。使用虛擬環境可以保持全局Python解釋器環境的干凈,避免包和版本的混亂,并且可以方便地區分和記錄每個項目的依賴,所謂環境追根溯源也是文件,既然是文件就支持拷貝到各個平臺上,所以同時提高了可移植性,以便在新環境下復現依賴環境。

    在這里插入圖片描述

    舉例說明:

    例1:如果你同時有很多個項目,有一個爬蟲項目,有一個Flask項目,有一個Django項目放在一個環境下,那么管理相關的第三方庫難免混亂。

    例2:如果你有兩個Flask項目,但是兩個項目flask版本不一致,會出現版本沖突問題

    關鍵詞:1、Python解釋器的一個私有副本 2、解決了包管理混亂、版本沖突、提高了移植性

    3.2 如何使用虛擬環境?

    3.2.1 搭建虛擬環境

    windows的開發環境的安裝過程,我們使用的是virtualenv虛擬開發環境,首先安裝相關包的依賴

    pip install virtualenvwrapper-win
    

    利用安裝好的模塊我們創建一個虛擬環境

    ##注意:這個‘’first_01_env‘’ 是我們自己給虛擬環境取的名字,并且要記錄一下圖(1)的安裝路徑,一會我們需要使用。

    mkvirtualenv first_01_env  
    

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-0GeFNwvJ-1584441296763)(配圖/01_虛擬環境安裝路徑.png)]

    虛擬環境其他相關命令
    01、切換到指定的虛擬環境:注意我們進入虛擬環境是需要用workon命令,但是首次安裝成功會自動進入虛擬環境。

    workon first_01_env
    

    02、退出虛擬環境

    deactivate
    

    03、刪除指定的虛擬環境

    rmvirtaulenv first_01_env
    

    04、列出所有虛擬環境:

    lsvirtualenv
    

    05、進入到虛擬環境所在的目錄:

    cdvirtualenv
    

    3.2.1 在虛擬環境中安裝我們的Flask模塊

    pip install	flask
    
    Collecting flask
    ...
    Successfully installed Jinja2-2.10 MarkupSafe-1.1.0 Werkzeug-0.14.1 click-7.0 flask-1.0.2 itsdangerous-1.1.0
    

    在這里插入圖片描述

    從上面成功安裝的輸出內容可以看出,除了Flask包外,同時被安裝的還有5個依賴包,它們的主要介紹如表(1-1)所示。

    包名及版本 功能
    Jinja2-2.10 渲染模板引擎工具集
    MarkupSafe-1.1.0 可以識別HTML轉義規則。HTML字符轉義工具集
    Werkzeug-0.14.1 Web 框架的底層庫,提供了請求及響應以及開發服務器的功能,簡稱WSGI工具集
    click-7.0 命令行工具集
    itsdangerous-1.1.0 加密工具集

    表(1-1)

    首先對這5個庫先有一個印象,接下來會在具體的實際應用中應用這些庫。

    提示:這些庫均由Flask團隊開發

    在這里插入圖片描述

    4 開始我們的第一個Flask程序

    這里我們使用***pycharm***編輯器來學習***Flask***,pycharm的安裝我們就不重復了。

    4.1 創建一個Flask程序

    具體操作如圖(a)–圖(d)

    第一步

    在這里插入圖片描述

    圖(a)

    第二步

    在這里插入圖片描述

    圖(b)

    第三步

    !注意 如果找不到虛擬環境路徑可以參考虛擬環境其他命令

    lsvirtualenv         # 列出所有的虛擬環境
    workon first_01_env  # 切換到指定的虛擬環境
    cdvirtualenv         # 切換到指定的虛擬環境路徑 該目錄就是我們所要的路徑
    

    在這里插入圖片描述

    ? 圖(c)

    第四步
    在這里插入圖片描述

    圖(d)

    在這里插入圖片描述

    4.2 解讀Flask程序

    4.2.1 項目目錄詳解

    ? “static文件夾”用于存放各種靜態文件 css、js、圖片等等

    ? “templates文件夾”用于存放html模板文件

    ? “app.py”為我們的主文件 ,啟動項目需要啟動該文件

    ? 注意 app.py 文件的名字我們可以自由命名,但是除了flask.py 這種和Flask庫相沖突的名字

    主文件app.py文件代碼

    from flask import Flask
    
    app = Flask(__name__)
    
    
    @app.route('/')
    def hello_world():
        return 'Hello World!'
    
    
    if __name__ == '__main__':
        app.run()
    
    

    4.2.2 代碼拆分為三部分

    在這里插入圖片描述

    第一部分

    from flask import Flask
    
    app = Flask(__name__)
    

    導入我們安裝好的flask包,通過flask包導入Flask類,Flask類即為Flask的核心,實例化這個Flask類的到一個實例化對象app。

    __name__這個特殊的參數:Python會根據所處的模塊來賦予__name__變量相應的值,對于我們的程序來說(app.py),這個值為app。

    @app.route('/')
    def hello_world():
        return 'Hello World!'
    

    如果有過對其他web框架的了解,相信看見這個已經看出了一些門道。沒錯這個 @app.route('/')就是用來匹配url的,在我們的flask里面是以裝飾器來實現的,裝飾器引用的也是我們上面實例化核心類出來的對象。

    那么如果路由下面跟的函數什么呢 ?沒錯就是我們的視圖函數,如果匹配到了路由就會觸發我們的視圖函數執行,并且return回具體的數據給前端或者移動端。

    不是很理解沒關系,我們先大概有個印象,會在接下來的章節詳細講解路由以及視圖函數的使用

    第三部分

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

    先不管邏輯判斷,先看 app.run()app.run()源碼如下去閱讀源碼不難發現,在內部定義了默認的 ip+端口為127.0.0.1:5000,并且調用了werkzeug.serving為我們創建了一個開發服務器(由依賴包Werkzeug提供),對套接字有一定了解的朋友,其內部就是做了一個循環監聽的功能以便交互.

    關鍵詞:app.run()實現了flask程序在開發環境下運行起來,并且默認ip和端口是127.0.0.1:5000

        def run(self, host=None, port=None, debug=None,
                load_dotenv=True, **options):
           
        	 ...
            
             _host ='127.0.0.1'
             _port = 5000
            
             ...
                
             host = host or sn_host or _host
             port = int(port or sn_port or _port)
                
             ...
        
             from werkzeug.serving import run_simple
    
                try:
                    run_simple(host, port, self, **options)
                finally:
                    # reset the first request information if the development server
                    # reset normally.  This makes it possible to restart the server
                    # without reloader and that stuff from an interactive shell.
                    self._got_first_request = False
    

    在第三部分中還有一個if判斷,那么這個判斷的作用是什么呢,有python基礎的朋友對這個寫法大概不陌生,if邏輯判斷時只有本文件為執行文件的時候才會執行,為什么要這么設計呢?因為在開發環境我們是以app.py作為執行文件,但是在真實的生產環境下 ,此文件會作為被調用的文件,并且真實的生成環境不會用到app.run()做監聽分配, 原因是性能太低了,

    關鍵詞:保證了app.run()只用于開發環境,并且不影響真實的生產環境。

    三部分串講

    導入Flask的核心類實例化對象app,然后app作為裝飾器使用匹配url分發給下面的視圖函數,然后執行該頁面會觸發app調用run()方法運行起來整個項目。

    在這里插入圖片描述

    4.2.2.1 Werkzeug簡介

    在這里插入圖片描述

    Werkzeug是一個WSGI工具包,他可以作為一個Web框架的底層庫。這里稍微說一下, werkzeug 不是一個web服務器,也不是一個web框架,而是一個工具包,官方的介紹說是一個 WSGI 工具包,它可以作為一個 Web 框架的底層庫,因為它封裝好了很多 Web 框架的東西,例如 Request,Response 等等 。

    代碼示例:

    from werkzeug.wrappers import Request, Response
    
    @Request.application
    def hello(request):
        return Response('Hello World!')
    
    if __name__ == '__main__':
        from werkzeug.serving import run_simple
        run_simple('localhost', 4000, hello)
    

    在這里插入圖片描述

    了解

    看到了這個wekzeug是不是特別像我們的flask代碼,沒錯我們的flask正是依賴于這個werkzeug模塊,由wekzeug模塊實現了socket服務端的功能,hello必然是加括號運行了,才會執行hello里面的代碼,而在我們的flask中app.run()會調用run_simple(host, port, self, **options)把上面代碼例子的hello替換成了self也就是app。app()會觸發Flask類的__call__方法。

    所以所flask程序的入口就在__call__方法中,而__call__方法返回self.wsgi_app(environ, start_response),所以整個程序的執行過程都在 self.wsgi_app(environ, start_response)中.

    小節:

    1 app.run() 調用 werkzeug.serving的run_simple(host, port, self, **options)
    
    2 self()等價于app(), app()調用Flask類的__call__方法
    
    3 Flask類的__call__方法返回了 self.wsgi_app(environ, start_response)
    
    4 flask程序的執行過程都在 self.wsgi_app(environ, start_response)

    具體代碼:

    def run(self, host=None, port=None, debug=None,
                load_dotenv=True, **options):
           
        	 ...
            
             _host ='127.0.0.1'
             _port = 5000
            
             ...
                
             host = host or sn_host or _host
             port = int(port or sn_port or _port)
                
             ...
        
             from werkzeug.serving import run_simple
    
                try:
                    run_simple(host, port, self, **options)
                finally:
                    # reset the first request information if the development server
                    # reset normally.  This makes it possible to restart the server
                    # without reloader and that stuff from an interactive shell.
                    self._got_first_request = False
    
        ...
        
        def __call__(self, environ, start_response):
            """The WSGI server calls the Flask application object as the
            WSGI application. This calls :meth:`wsgi_app` which can be
            wrapped to applying middleware."""
            return self.wsgi_app(environ, start_response)
        ...
        
        def wsgi_app(self, environ, start_response):
            
            ctx = self.request_context(environ)
            error = None
            try:
                try:
                    ctx.push()
                    response = self.full_dispatch_request()
                except Exception as e:
                    error = e
                    response = self.handle_exception(e)
                except:
                    error = sys.exc_info()[1]
                    raise
                return response(environ, start_response)
            finally:
                if self.should_ignore_error(error):
                    error = None
                ctx.auto_pop(error)
       ...
    

    關鍵詞

    • Werkzeug是一個WSGI工具包,本質上是一個socket服務端。
    • flask基于Werkzeug,flask只保留了web開發的核心功能。
    • flask的執行過程都在def wsgi_app(self, environ, start_response):

    4.2.3 運行項目

    運行起來我們的flask項目,見圖(2),也可以在app.py直接右鍵run啟動項目

    在這里插入圖片描述

    圖(2)

    然后訪問http://127.0.0.1:5000/可以見圖(3)

    在這里插入圖片描述

    圖(3)

    !強調以后我們創建flask項目不要用pycharm自帶的flask快捷方式創建,上邊的快捷創建方式是便于講解和理解,真實的生產環境更推薦直接創建一個空的python項目

    在這里插入圖片描述

    4.2.4 詳解DEBUG模式

    在這里插入圖片描述

    4.3.4.1 DEBUG模式解決了兩個問題。
    1. flask代碼中如果出現了異常,我們在瀏覽器中不會提示具體的錯誤信息,開啟debug模式后會把具體的錯誤信息發送到瀏覽器上。

    2. flask代碼如果被修改了,必須要重啟項目修改的代碼才會有效,開啟debug模式后我們修改了代碼只要ctrl+s我們的flask項目就會自動重新加載,不需要手動加載整個網站。

      例1:

      此案例明顯出現了一個數組越界的問題

      from flask import Flask
      app = Flask(__name__)
      
      @app.route('/')
      def hello():
          a = [1,2,3,4]
          print(a[4])
      
          return "hello"
      
      if __name__ == '__main__':
          app.run()
      

      訪問如圖(4)

    在這里插入圖片描述

    圖(4)

    如圖4只提示了服務器內部錯誤,并沒有提示具體的錯誤原因

    好我們為app.run()添加參數改寫為app.run(debug=True)

    from flask import Flask
    app = Flask(__name__)
    
    @app.route('/')
    def hello():
        a = [1,2,3,4]
        print(a[4])
    
        return "hello"
    
    if __name__ == '__main__':
        app.run(debug=True)
    

    再次訪問如圖(5)

    在這里插入圖片描述

    圖(5)

    我們看到了具體的報錯信息 IndexError: list index out of range

    并且每次修改代碼的時候按下ctrl+s保存一下都會自動重新加載flask項目代碼,在此就不做演示了

    !強調不要用快捷創建falsk的方式創建項目,就像創建一個普通的python項目一樣,或者打開一個空的文件的方式創建,否則debug=True會無效

    4.2.4.2 四種開啟DEBUG的方式

    第一種

    from flask import Flask
    app = Flask(__name__)
    
    @app.route('/')
    def hello():
        a = [1,2,3,4]
        print(a[4])
        return "hello"
    
    if __name__ == '__main__':
        app.run(debug=True)  # 設置
    

    第二種

    from flask import Flask
    app = Flask(__name__)
    app.debug = True  # 設置
    
    @app.route('/')
    def hello():
        a = [1,2,3,4]
        print(a[4])
        return "hello"
    
    if __name__ == '__main__':
        app.run()
    

    第三種

    from flask import Flask
    app = Flask(__name__)
    app.config.update(DEBUG=True)  # 設置
    
    @app.route('/')
    def hello():
        a = [1,2,3,4]
        print(a[4])
        return "hello"
    
    if __name__ == '__main__':
        app.run()
    

    第四種

    需要在app.py所在的目錄里 再創建一個config.py,隨著我們的學習會越來越多的用到這個配置文件,來配置我們的flask項目,注意配置的信息一般為大寫。

    config.py

    DEBUG = True
    

    app.py

    from flask import Flask
    import config  # 導入
    app = Flask(__name__)
    
    app.config.from_object(config)  # 設置
    
    @app.route('/')
    def hello():
        a = [1,2,3,4]
        print(a[4])
        return "hello"
    
    if __name__ == '__main__':
        app.run()
    

    app.config 本質上繼承的字典,是字典的子類的一個對象 如圖(6)

    在這里插入圖片描述

    圖(6)

    4.2.4.3 DEBUG的PIN碼可以在瀏覽器端調試代碼使用(不推薦使用,了解就可以)
    * Debugger PIN: 648-906-962
    

    在這里插入圖片描述

    圖(7)

    可以支持在網頁端調試
    在這里插入圖片描述

    圖(8)

    在這里插入圖片描述

    版權聲明:本文為weixin_46032351原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/weixin_46032351/article/details/104928258

    智能推薦

    Linux C系統編程-線程互斥鎖(四)

    互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...

    統計學習方法 - 樸素貝葉斯

    引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...

    styled-components —— React 中的 CSS 最佳實踐

    https://zhuanlan.zhihu.com/p/29344146 Styled-components 是目前 React 樣式方案中最受關注的一種,它既具備了 css-in-js 的模塊化與參數化優點,又完全使用CSS的書寫習慣,不會引起額外的學習成本。本文是 styled-components 作者之一 Max Stoiber 所寫,首先總結了前端組件化樣式中的最佳實踐原則,然后在此基...

    基于TCP/IP的網絡聊天室用Java來實現

    基于TCP/IP的網絡聊天室實現 開發工具:eclipse 開發環境:jdk1.8 發送端 接收端 工具類 運行截圖...

    19.vue中封裝echarts組件

    19.vue中封裝echarts組件 1.效果圖 2.echarts組件 3.使用組件 按照組件格式整理好數據格式 傳入組件 home.vue 4.接口返回數據格式...

    猜你喜歡

    劍指Offer39-調整數組順序使奇數位于偶數前面

    一開始想著用冒泡排序的方法來做,但是bug還是很多,后來看了評論區答案,發現直接空間換時間是最簡單的,而且和快排的寫法是類似的。...

    【一只蒟蒻的刷題歷程】【藍橋杯】歷屆試題 九宮重排 (八數碼問題:BFS+集合set)

    資源限制 時間限制:1.0s 內存限制:256.0MB 問題描述 如下面第一個圖的九宮格中,放著 1~8 的數字卡片,還有一個格子空著。與空格子相鄰的格子中的卡片可以移動到空格中。經過若干次移動,可以形成第二個圖所示的局面。 我們把第一個圖的局面記為:12345678. 把第二個圖的局面記為:123.46758 顯然是按從上到下,從左到右的順序記錄數字,空格記為句點。 本題目的任務是已知九宮的初態...

    dataV組件容器寬高發生變化后,組件不會自適應解決方法

    項目中需要大屏幕數據展示,于是使用了dataV組件,但是使用是發現拖動瀏覽器邊框,dataV組件顯示異常,如圖: 于是查了官網,官網的解釋如下:   于是按照官網的意思編寫代碼: 于是可以自適應了...

    CSS3干貨10:如何做一個板塊標題水平線左邊帶顏色效果

    很多網站在設計欄目標題的時候,喜歡用下劃線分開欄目標題和內容部分。 而且線條左邊的部分往往還有顏色,且這個顏色跟標題的文字長短保持一致。效果如圖所示: 這種效果其實很簡單。 我這里給大家推薦兩種方式: 假定我們的標題部分 HTML 結構如下: 方式一:利用下邊框。灰色部分是 h1 的下邊框,藍色部分是 span 標簽的下邊框。 h1 的高度為 40px,span 也設置它的高度為 40px。這樣,...

    拜師————python基礎入門——程序的構成,對象,引用,棧內存和堆內存,標識符命名規則——day4

    第九節課:任務9:009.程序的構成 Python程序的構成,一個程序是由什么構成的 1.python程序由模塊組成 , 一個模塊對應一個python源文件,(文件后綴名.py) 2.模塊由語句構成 運行程序時,安裝模塊中語句的順序依次執行。 代碼的組織和縮進 “龜叔”在設計python時,直接通過縮進來組織代碼 縮進時,幾個空格都是允許的,但是空格數必須統一,我們通常用四...

    精品国产乱码久久久久久蜜桃不卡