Flask框架簡介


一、Flask簡介

Flask 是一個Python編寫的一種輕量級的框架,只提供了web框架基本的功能,比其他的框架更加靈活、自由

二、Flask的安裝

框架開發的時候,兼容性是一個很大的問題

開發環境:Python3.7版本,Flask1.1.1 版本

  1. 虛擬環境的使用

    工作中會根據需求,在Python環境下使用各種框架和包,但是可能每個項目使用的框架和版本不一樣,這樣就要根據需要更新和卸載相應的庫,為了不必要的麻煩,便於管理,使用虛擬環境

  2. anaconda虛擬環境的安裝,創建指定Python版本的環境

    conda create -n flask_env python=3,7

    flask_env:環境的名字,任意,有閱讀性

    Python=3.7:指定Python的版本

  3. 激活進入/離開虛擬環境

    conda active flask_env

    conda deacticve

  4. 進入虛擬環境,下載flask

    pip install flask==1.1.1

    查看當前環境下的包

    pip freeze

二、創建Flask項目

  • 實現最小應用

    使用 pycharm 創建一個項目project01,設置Python虛擬環境

  • 路由

    Flask 根據 HTTP 請求的url在路由表中匹配定義好的路由規則,找到對應的函數處理請求。

    在這個過程中需要保存一個url到行數的映射關系,我們把處理url到函數之間的關系成為路由

    flask中的路由是使用裝飾器的形式定義的,並且必須是/開頭,否則報錯

  • 視圖函數

    視圖函數是處理用戶的請求,返回響應的函數代碼塊

    在Flask中視圖函數的名字不能重復

  • 啟動服務器

run啟動參數 說明
host 主機地址,默認是127.0.0.1,運行外部ip地址訪問,0.0.0.0
port 端口號,默認是5000
debug 調試模式,默認為false,開發的時候一般設置為true,這樣有視圖有錯誤,在瀏覽器中顯示,方便調試錯誤。項目上線需要改為false。也可以啟動重啟代碼。
use_reloader 是否自動重啟代碼,默認為false,true為自定義
  • url路徑參數(動態路由)

    可以通過請求的url中獲取需要的參數。例如:現在定義一個路由/users/,如果請求的url為/users/1,表明想要獲取編號為1的用戶信息,則這里的1就是請求中傳遞的參數

    @app.route('/users/<sid>')
    def hello_world(sid):
        return '查詢id是{}的用戶信息'.format(sid)
    

    上面代碼中<>即為轉換器語法,默認為字符串類型,即匹配到的內容始終為字符串類型

    Flask中其他類型轉換器

轉換器類型 使用
string字符串類型 < string:name >
int整數類型 < int:name >
float小數類型 < float:name >
path路徑類型 < path:name >

三、Flask模板系統

flask默認采用是jinja2模板進行模板渲染,jinja2是python第三方的一個模板渲染模塊,通常用於flask,tornado框架中,jinja2的開發大量參考了django的模板渲染系統,相似度達到98%

靜態文件:css,js,img等這些都是靜態文件,flask中默認加載當前目錄下的static目錄下的靜態文件

模板文件:flask默認當前目錄下的templates目錄下的模板文件

  • 調用靜態頁面
    1. 新建一個templates目錄,存放了html文件
    2. 導入from flask import render_template模塊,調用靜態頁面
@app.route('/index')
def hello_world():
    return render_template("index.html")
  • 視圖傳遞參數到模板

    如果使用這種方式傳遞參數,如果變量的數量多的情況下,使用起來不方便,可以使用解包將函數內的所有變量傳遞到模板中。

    html頁面參數語法:{{name}}

@app.route('/index')
def hello_world():
    name = "老王"
    age = 33
    gender = "男"
    return render_template("index.html",name=name,age=age,gender=gender)

@app.route('/index')
def hello_world():
    name = "老王"
    age = 33
    gender = "男"
    return render_template("index.html", **locals())
  • 模板語法

    1. 變量的使用

      語法:{{變量名}},jinja2模板引擎支持python中基本數據類型,類變量等

      變量可以根據索引或者 . 取出來

      jinja2模板引擎可以使用一些python提供的一些方法。例如:upper,replace,lower等方法

      比如:{{p.name.replace("老","小")}}

    2. 控制語句

      (1) if語句

      {% if 條件%}

      {% elif 條件 %}

      {% else %}

      {% endif %}

      (2) for循環

      {% for 變量 in 可迭代對象 %}

      {% endfor %}

#if控制語句
{% if age<18 %}
    未成年
{% elif age<50 %}
    青壯年
{% else %}
    老年
{% endif %}

#for循環
{% for i in hobby %}
        {{ i }}
    {% endfor %}
    
{% for k,v in info.items() %}
        {{ k }}-{{ v }}
    {% endfor %}
    
    {% for i in hobby %}
        {% if loop.index%2 == 0 %}
            {{ loop.index0 }}:{{ i }}
        {% else %}
           {{ loop.index0 }}:{{ i }}
        {% endif %}
    {% endfor %}

(3) loop

在for循環中,jinja2還提供一個特殊變量,用來獲取當前的遍歷狀態

方法 說明
loop.index 當前迭代的索引(從1開始)
loop.index0 當前迭代的索引(從0開始)
loop.first 是否是第一次迭代,返回bool
loop.last 是否是最后一次迭代,返回bool
loop.length 序列中項目的數目
  • 過濾器

    過濾器本質是函數,可以使用過濾器將視圖傳遞過來的值進行修改顯示的效果

    jinja2提供的常見過濾器:

{{ nick_name | capitalize }}
{{ nick_name | upper }
{{ nick_name | replace("ni","NI") }}
方法 說明
capitialize 首字母轉換成大寫,其他字母轉換為小寫
lower 轉換成小寫形式
upper 轉換成大寫形式
title 每個單詞的首字母都轉換成大寫
replace 替換字符串的值
round 對數字進行四舍五入
safe 渲染時值不轉義
  • 自定義過濾器
    1. 定義過濾器函數
    2. 注冊過濾器函數(函數的名字,過濾器的名字)
#自定義過濾器
def my_add(num1, num2):
    return num1 + num2


app.add_template_filter(my_add, "myadd")

四、靜態文件

在全棧開發過程中,把css,js,img等非html內容看做是靜態內容

在網站有很多資源不存在數據庫中,直接放在服務器上,那么這樣的資源叫做靜態資源

flask在開發過程中,靜態文件需要放在默認的靜態位置(當前腳本目錄下的static目錄,並且在html中,使用/static/來代替目錄)

五、模板繼承與加載

針對網站所有的頁面通常使用一個模板,由於風格和需求導致,所有頁面都相同的部分,為了減少代碼冗余,方便代碼修改,出現了繼承和加載兩種機制

1、繼承:

當我們瀏覽器一個網站的時候發現里面有大部分是相同的,這時候我們為了去除代碼的冗余,使用繼承。

(1) 定義父模板,在父模板中定義block

(2) 在子模板中繼承,根據需要實現父模板中的block

2、包含

將可以常用的頁面內容如導航條,尾頁信息等不變的組件可以保存到單獨的文件中,然后在需要使用敵方按照如下語法導入即可。

#繼承
{% extends "father.html" %}
{% block title %}{% endblock %}

#包含
{% include "myblock.html" %}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM