Flask框架學習筆記

代碼來自於網課中(老師名字需要求證後貼出)

安裝Flask:

pip install flask==1.0.4

一、第一個簡易程序

注意此處不可以使用from flask import *,需要理解例子中__name__的含義。

from flask import Flask

# __name__魔法對象,表示當前的模塊的名字
# 模塊名,flask以這個模塊所在的目錄爲總目錄,默認這個目錄中的static爲靜態目錄,templates爲模板目錄
# 當前_name_在hello.py文件裏,根目錄爲HelloFlask,傳的是根目錄的static及templates
# 創建flask的應用對象
app = Flask(__name__)


# 在裝飾器中綁定路徑,.route()帶參函數
@app.route("/")
def index():
    """定義的視圖函數"""
    return "Hello"


if __name__ == '__main__':
    # .run()簡易測試服務器
    app.run()

運行結果圖:
運行結果圖

二、關於if __name__ == '__main__':

Python的包

Python的包有兩種:

  1. 帶有__init__.py文件的目錄
  2. 當前目錄下的*.py文件。

當兩者同名存在時,目錄的優先級高於文件,文件會被隱藏而不可被使用

魔術變量

類似C語言的宏,該宏由編譯器定義,在運行時,根據環境自動調整變量的值。Python中常見的魔術變量有__name__、__file__等。

  • __file__爲當前文件的完整文件路徑;
  • __name__爲當前文件的包名,特別的,當以該文件啓動時,該文件作爲主包存在,主包的名稱始終爲:'__main__'

eg

運行demo.py文件打印出來的是寫死的'__main__';作爲導入的包,以hello作爲啓動文件,運行到import demo時,打印出來的是'demo',即包名。

三、實例化一個Flask對象

構造方法

    def __init__(
        self,
        import_name,
        static_url_path=None,
        static_folder='static',
        static_host=None,
        host_matching=False,
        subdomain_matching=False,
        template_folder='templates',
        instance_path=None,
        instance_relative_config=False,
        root_path=None
    ):

幾個重要的參數

  • import_name: 包名,即當前應用從哪個包啓動,以哪個包爲根目錄,一般情況下使用__name__,即以當前運行文件所在目錄爲根目錄。
  • static_url_path: 指定訪問靜態目錄的文件時,路由地址的前綴,默認爲'/static',即訪問靜態目錄文件時,需要使用http://主機域名或IP:端口號/static/<path:filename>來訪問。
  • static_folder: 指定靜態文件所在目錄,默認爲'static'
  • template_folder: 指定模板文件所在目錄,默認爲'templates'
app = Flask(
	__name__,
	static_url_path="/python",  # 訪問靜態資源的url前綴,默認值是/static
	static_folder="static",     # 靜態文件的目錄,默認值就是static
	template_folder="templates" # 模板文件的目錄,默認值就是templates
)

四:配置文件

1、使用配置文件

(1)建立文件名爲Config.cfg的配置文件:

DEBUG = True

(2)使用配置文件:
一般使用第二種:

1.使用配置文件
# app.config.from_pyfile("config.cfg")

2.使用對象配置參數
class Config(object):
    DEBUG = True
app.config.from_object(Config)

3.直接操作config的字典對象
 app.config["DEBUG"] = True
from flask import Flask


app = Flask(__name__,
            static_url_path="/python",  # 訪問靜態資源的url前綴,默認值是static
            static_folder="static",     # 靜態文件的目錄,默認值就是static
            template_folder="templates"  # 模板文件的目錄,默認值就是templates
            )


# 配置參數的使用方式
# 1.使用配置文件
# app.config.from_pyfile("config.cfg")

# 2.使用對象配置參數
class Config(object):
    DEBUG = True


app.config.from_object(Config)

# 3.直接操作config的字典對象
# app.config["DEBUG"] = True


# 在裝飾器中綁定路徑,.route()帶參函數
@app.route("/")
def index():
    """定義的視圖函數"""
    a = 1/0   # 運行文件時調用配置文件DEBUG
    return "Hello Flask"


if __name__ == '__main__':
    # .run()簡易測試服務器
    app.run()

運行hello.py文件時出現Debugger is active,成功調用配置文件
在這裏插入圖片描述訪問127.0.0.1:5000
在這裏插入圖片描述

2、讀取配置文件

讀取配置文件的方法:
1、通過全局變量app讀取
print(app.config.get("ITCAST"))
2、通過current_app讀取,導入current_app,作爲app的代名詞
print(current_app.config.get("ITCAST"))
from flask import Flask
from flask import current_app

app = Flask(__name__,
            static_url_path="/python",  # 訪問靜態資源的url前綴,默認值是static
            static_folder="static",     # 靜態文件的目錄,默認值就是static
            template_folder="templates"  # 模板文件的目錄,默認值就是templates
            )


# 配置參數的使用方式
# 1.使用配置文件
# app.config.from_pyfile("config.cfg")

# 2.使用對象配置參數
class Config(object):
    DEBUG = True
    ITCAST = "python" # 作爲讀取配置文件的參數


app.config.from_object(Config)

# 3.直接操作config的字典對象
# app.config["DEBUG"] = True


# 在裝飾器中綁定路徑,.route()帶參函數
@app.route("/")
def index():
    """定義的視圖函數"""
    # a = 1/0
    # 讀取配置文件的方法
    # 1、通過全局變量app讀取
    # print(app.config.get("ITCAST"))
    # 2、通過current_app讀取,導入current_app,作爲app的代名詞
    print(current_app.config.get("ITCAST"))
    return "Hello Flask"


if __name__ == '__main__':
    # .run()簡易測試服務器
    app.run()

在這裏插入圖片描述

五、run()使用

app.run()只能使用Running on 後面的ip地址進行訪問,host=本機ip地址,可以用本機ip進行訪問或者host=0.0.0.0,可以使用兩個ip進行訪問,此次只能帶DEBUG參數,其他參數不可以。

app.run(host="0.0.0.0", port=5000,DEBUG = True)

六、獲取路由信息

1、通過app.url_map()查看整個flask的路由信息

from flask import Flask

app = Flask(__name__)


@app.route("/")
def index():
    """定義的視圖函數"""
    return "Hello Flask"


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

在這裏插入圖片描述

2、post請求

@app.route("/post_only", methods=["POST"]) # 指定爲post請求方式
@app.route("/post_only", methods=["GET", "POST"])  # GET和POST訪問方式
from flask import Flask

app = Flask(__name__)


@app.route("/")
def index():
    """定義的視圖函數"""
    return "Hello Flask"


@app.route("/post_only", methods=["POST"]) # 指定爲post請求方式
def post_only():
    return "post only page"


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

在這裏插入圖片描述在這裏插入圖片描述

3、相同的url訪問不同的視圖函數

遇到相同的訪問路徑,不指明訪問方式的時候只會hello1,從上往下執行,覆蓋hello2;當指名訪問方式的時候,hello1 methods=post,hello2 methods = get時,訪問出現hello2

@app.route("/hello")
def hello1():
    return "hello1"


@app.route("/hello")
def hello2():
    return "hello2"

在這裏插入圖片描述

4、不同的url訪問相同的視圖函數

@app.route("/way1")
@app.route("/way2")
def hello():
    return "同一個 hello"

在這裏插入圖片描述在這裏插入圖片描述
在這裏插入圖片描述

5、重定向接口&通過方法名獲得其對應的URL地址

導入redirect, url_for,建議使用方法二,便於改路徑

# 通過方法名獲得其對應的URL地址
@app.route("/get_url_name")
def interface_de_method():
    from flask import url_for
    return url_for("interface_hello")
# 重定向接口
@app.route("/redirect")
def interface_redirect():
    from flask import redirect
    return redirect("/hello")

運用url_for進行反解析

@app.route("/login")
def login():
    # 方法一:寫死路徑
    # url = "/"
    # 方法二:使用url_for的函數,通過視圖函數的名字找到視圖對應的url路徑
    url = url_for("index")

    return redirect(url)

from flask import Flask, redirect, url_for

app = Flask(__name__)


@app.route("/")
def index():
    """定義的視圖函數"""
    return "Hello Flask"


@app.route("/login")
def login():
    # 方法一:寫死路徑
    # url = "/"
    # 方法二:使用url_for的函數,通過視圖函數的名字找到視圖對應的url路徑
    url = url_for("index")

    return redirect(url)


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

使用127.0.0.1:50000/login進行訪問時,會進行跳轉至127.0.0.1網頁
在這裏插入圖片描述

6、自定義轉換器在路由中提取參數

注意:此處需要多看。

from flask import Flask, redirect, url_for
from werkzeug.routing import BaseConverter

app = Flask(__name__)

app.config['DEBUG'] = True 
#debug模式,不用手動重啓,代碼修改後Ctrl+S就會自動重新運行

# 轉換器 127.0.0.1:5000/goods/123


# @app.route("/goods/<int:goods_id>")
@app.route("/goods/<goods_id>")  # 不加轉換器類型,爲普通的字符串規則,除/之外的字符
def goods_detail(goods_id):
    """定義的視圖函數"""
    return "goods detail  page %s" % goods_id


# 1、自定義自己的轉換器
class RegexConverter(BaseConverter):
    """
    定義類的方式定義轉換器,繼承BassConverter
    """

    def __init__(self, url_map, regex):
        # 調用父類的初始化方法
        super(RegexConverter, self).__init__(url_map)
        # 將正則表達式的參數保存到對象的屬性中,flask會使用這個屬性去進行正則表達式匹配
        self.regex = regex


# 2、將自定義的轉換器添加到flask的應用中


app.url_map.converters["re"] = RegexConverter

# 3、使用轉換器
# 127.0.0.1:5000/send/15345678901


# 反斜槓必須兩個;如果不想寫兩個,就前面加r,表示不轉義
@app.route(r"/send/<re(r'1[34578]\d{9}'):mobile>")
def send_sms(mobile):
    return "send sms to %s" % mobile


if __name__ == '__main__':
    HOST = "127.0.0.1"
    PORT = 5000
    DOMAIN = "http://" + HOST + ":" + str(PORT)

    # print(app.url_map)
    # 打印路由信息表
    for item in app.url_map.iter_rules():
        print(" *", DOMAIN + str(item))
    # end for
    print()

    app.run()

在這裏插入圖片描述to_python提前參數的過程:15345678901與正則表達式進行匹配,正確則提取參數至to_python函數,可在此函數中對數字進行操作,如:以某種規則進行篩選,return至send_sms函數,進行打印。to_python,to_url函數可以不寫有默認操作。
在這裏插入圖片描述to_url提取參數的過程:to_url()使用url_for()函數時被調用,18922222222提取數字進入to_url函數value中,返回至替換正則轉換表達式中,再傳至redirect中。
在這裏插入圖片描述

7、打印路由信息表

此處代碼來自於此鏈接

if __name__ == '__main__':
    HOST = "127.0.0.1"
    PORT = 5000
    DOMAIN = "http://" + HOST + ":" + str(PORT)

    # 路由信息
    # print(app.url_map)
    for item in app.url_map.iter_rules():
        print(" *", DOMAIN + str(item))
    # end for
    print()

    # 啓動應用
    app.run(host=HOST, port=PORT)

效果圖爲:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章