1. 程式人生 > >Flask Python Web框架(一)

Flask Python Web框架(一)

一、框架的定義

1、框架是一個為了解決開放性問題而存在的一種程式結構,其本身提供了一些最基本的功能,使用
   者只需要在其基礎上搭建自己的操作就可以了。

2、框架模式

     1、MTV      

        M:Models,模型層,主要負責資料庫建模

        T:Templates,模板層,用於處理使用者的顯示內容,如html    

        V:Views,檢視,處理與使用者打交道的內容(請求和響應)

      2、MVC

         M:Models,模型層,主要負責資料庫建模

         V:View,檢視,處理使用者的顯示內容

         C:Controler,控制器,用於與使用者互動的部分內容(請求和響應)

二、Flask框架

 Flask框架是一種輕量級的 Python Web 框架。Flask基於python並且依賴於Jinja2模板引擎

 和Werkzeug WSGI服務的一個微型框架。

 WSGI:Web Server Gateway  Interface(WEB服務網管介面)

 1、Flask框架採用MTV的框架模式
 
 2、安裝Flask

    檢視已安裝的Flask版本:

    在python互動模式中:import flask; 
                        flask.__version__;

    安裝Flask:sudo pip3 install flask;

 3、路由 
           
      客戶端傳送請求給web伺服器,web伺服器再將請求傳送給Flask程式例項

      Flask程式例項需要知道每個url請求所對應的執行程式碼是誰。所以程式中必須要建立一個

      url請求地址到python執行函式的一個對映。處理url和函式之間的關係的程式就是路由。

 4、  在Flask中,路由是通過@app.route裝飾器表示。

      路由的基本表示

        @app.route('/')
        def index():
            return "xxx"
  
      
      基本帶參的路由

        @app.route('/show/<name>')
        def show(name):
            name表示的是從位址列上傳來的資料
            return "xxx"
       
      帶多個引數的路由
        http://localhost:5000/show/laowang/36

        @app.route('/show/<name>/<age>')
        def show(name,age):
            return "xxx"

      指定引數型別的路由
         @app.route('/show/<name>/<int:age>')
         def show(name,age):
             name:字串
             age:整數

 5、多個URL的路由匹配

    為多個訪問地址匹配同一個檢視處理函式

    @app.route('/地址1')
    @app.route('/地址2')
      ...
    def index():
       return "xxx"


 6、路由中設定HTTP請求方法

    Flask路由也允許設定對應的請求方法(post/get),只有將匹配上請求方法的路徑才能交給

    對應的檢視處理函式去處理。所有的路由,預設只接受get請求。

    @app.route('/xxx/xxx',methods=['GET','POST'])
    def xxx:
       pass

     ** methods可以是GET,可以是POST ,也可以二者同時接收,函式中可以用if語句判斷之後處         理相對應的請求響應
        
 7、URL的反向解析

    正向解析:程式自動解析,根據@app.route()中的訪問路徑,來匹配處理函式

    反向解析:通過檢視處理函式的名稱自動生成對應的訪問路徑


    在Flask中要實現反向解析則需要使用:

    url_for(funname,args)

    funname:要生成地址的函式名
    args:該地址中需要的引數

三、模板 - Templates

  1、模板:

     在Flask中就是允許響應給使用者看的網頁
     在模板中,允許包含“佔位變數”來表示動態的內容
     模板最終也會被解析成字串再響應給客戶端,這一過程通常稱為“渲染”。

     Flask中的模板是依賴於 Jinja2 模板系統

   2、模板設定

        預設情況下,Flask會在程式資料夾中的 templates 的子資料夾中搜索模板           

        預設情況下,需要手動建立templates

  3、模板的渲染

       作用:在檢視中,將模板檔案(xx.html) 渲染成字串之後,再響應給客戶端瀏覽器

       函式:render_template('xxx.html')

             return render_template('xxx.html')   


  4、模板中的語法(重難點)

   1、變數:是一種特殊的佔位符,告訴模板引擎該位置的值是從渲染模板時的資料中獲取出來的         

     在檢視中:

        @app.route('/')
        def index():
           return  render_template('xxx.html',變數1=值1,變數2=值2,...)
         
      在模板中:

         {{變數名}}

          <h1>{{name}}</h1>     

     2、過濾器:過濾器是允許在變數輸出前改變變數的值

        語法:{{變數|過濾器}}

        Jinja2 模板中常見過濾器:

               過濾器名                      說明

                capitalize                    首字元變大寫,其他變小寫

                lower                         將值轉換為小寫

                upper                         將值轉換為大寫

                title                         將值中的每個單詞首字元變大寫

                trim                           去掉值兩邊的空格

      3、標籤:每個標籤標示的是不同點伺服器端的功能

        常用的標籤

         if 標籤    

          (1)基本if結構

                  {% if 條件 %}
                  {% endif %}

            (2)if ... else ...結構

                   {% if 條件 %}
                      滿足條件時要執行的程式碼
                   {% else %}
                      不滿足條件時執行的程式碼
                   {% endif %}

            (3)if ... elif ... elif ... else

                    {% if 條件1 %}
                       滿足條件1時要執行的程式碼
                    {% elif 條件2 %}
                       滿足條件2時要執行的程式碼
                    {% elif 條件3 %}
                       滿足條件3時要執行的程式碼
                    {% else %}
                       不滿足以上所有條件時要執行的程式碼
                    {% endif %}

                   
          for標籤

              {% for 變數 in 元組|列表|字典 %}
              {% endfor %}

               在Jinja2模板的迴圈中,支援內部變數 - loop

                loop作用:記載當前迴圈中的一些相關資訊
                loop常用屬性:

                              1、index

                                   用法:loop.index

                                  作用:記錄當前迴圈的次數,從 1 開始記錄

                              2、index0

                                    用法:loop.index0

                                    作用:同上,從0開始記錄

                             3、first

                                    用法:loop.first

                                    作用:值為True,則表示當前迴圈是第一次迴圈

                             4、last

                                   用法:loop.last

                                   作用:值為True,則表示當前迴圈是最後一次迴圈
                      

                macro 標籤(巨集)

                        1、作用:相當於是在模板中宣告函式

                        2、語法:使用  {% macro %}  宣告巨集  

                                       {% macro 名稱(引數列表) %}
                                          xxx   xxx
                                       {% endmacro %}

                        3、在獨立的檔案中宣告巨集

                            建立macro.html模板檔案

                            作用:定義專案中要用到的所有的巨集

                            在使用的網頁中,匯入macro.html

                              {%  import  'macro.html'  as  macros %}                   

                  4、include 標籤

                          將其他的模板檔案包含到當前的模板檔案中

                          語法:{%  include  'xxx.html'  %}
  

    5、靜態檔案處理

          1、什麼是靜態檔案?

                在Flask中不能與伺服器動態互動的檔案都是今天檔案

                如:圖片,css檔案,js檔案,音訊檔案,...

               <img src="images/a.jpg">

               <link rel="" href ="css/a.css">

               <script src =""></script>

               <video src=""></video>

              <audio src=""></audio>

         2、靜態檔案的處理

               1、所有的靜態檔案必須放在名為static的目錄中

                   static目錄要放在專案的根目錄處

                   FlaskDemo02

                   templates

                   static

               2、所有的靜態檔案必須通過/static/路徑去訪問

                 /static/images/a.jpg