代碼來自於網課中(老師名字需要求證後貼出)
文章目錄
安裝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的包有兩種:
- 帶有
__init__.py
文件的目錄 - 當前目錄下的
*.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)
效果圖爲: