python 初步認識Flask
阿新 • • 發佈:2018-06-10
傳參 步驟 json 進一步 第一個程序 _id 方式 folder 匹配
1.簡介 flask 問題一: 訪問百度的流程? a. 客戶端: 發送請求報文, 請求行, 請求頭, 請求體 b.服務端: 解析請求的報文, 解析域名, 進行路由匹配分發找到對應的視圖函數, 打包, 會送給客戶端, 響應頭, 響應體, 響應 c.客戶端: 收到了響應報文, 進行解析, 顯示到瀏覽器中 2.框架: 定義: 封裝一些方法函數的代碼 框架的核心: jinja2(模板引擎), werkzeug(路由) 3.虛擬環境 思考: 為什麽搭建虛擬環境? 實際開發中, 為了不影響兩個項目的正常運行, 所以使用虛擬環境. 如何創建虛擬環境? mkvirtualenv 虛擬環境名稱 進入虛擬環境? workon 虛擬環境名稱 退出虛擬環境 deactivate 4.第一個程序helloworld 實現步驟 a. 導入模塊flask b.創建實例對象 c.視圖函數 d.綁定路由, 與視圖函數建立聯系 e.調用run方法 demo1 hello world from flask import Flask # 導入該模塊 app = Flask(__name__, static_path = "/static", # 靜態訪問路徑 static_url_path = "/static", # 靜態訪問路徑 static_folder = "", # 靜態訪問文件 template_folder = "" # 模板訪問的文件夾 ) # 創建實例對象 @app.route("/") def index(): return " hello world " # 定義視圖函數, 與路由進行關聯 ? if __name__ = "__main__": app.run() # 調用run方法, 運行函數 加載調試的三種方式: 記住在實例對象的下面進行配置 # 1. 通過對象來配置 class Config(object): debug = True # 進行關聯 實例對象.config.form_object(Config) # 2. 通過文件來配置 實例對象.config.from_pyfile("config.ini") # 3. 通過環境變量來配置 實例對象.config.from_envvar("ENVCONFIG") ? 一些常用的可以直接在實例對象後創建: 實例對象.debug = True 實例對象.config["DEBUG"] = True ? ? 註意: 調用run方法是可以傳遞參數 實例對象.run(host, post, debug) 5.怎樣設置路由? demo1 # 實現路由, 指定路徑為/index @app.route("/index") def index(): return index 裝飾器傳參 # 傳參實例 註意: 路由傳遞參數時, 默認會傳遞string類型, 也可以指定其他類型 @app.route("/user/<user_id>") def user_info(): return "%s" % user_id 思考: 如何指定一個請求方式? 通過methods來進行指定請求方式, 默認是get請求 @app.route("/index", methods=["POST","GET"]) def index(): return "index" 擴展: put: 修改服務器數據 pash: 修改服務器數據 兩個之間的區別: put其中一個修改之後全部發送, pash就是傳輸修改的內容 delete: 刪除服務器數據 option: 只需要返回HEAD, 不返回header 6.視圖常用邏輯 a.返回json數據 b.重定向: url_for 註意: 如果返回的是一個固定的網址, 可以不適應url_for c.自定義狀態碼 #demo from flask import Flask, jsonify from flask import json from flask import redirect from flask import request from flask import url_for ? app = Flask(__name__) ? @app.route("/") def index(): return "index" ? @app.route("/demo1") def demo1(): return "demo1" ? # 給路由添加參數,格式就是 <參數名> # 並且視圖函數需要接收這個參數 @app.route("/user/<int:user_id>") def demo2(user_id): return "demo2 %s" % user_id ? @app.route("/demo3", methods=["POST","GET"]) def demo3(): return "demo3 %s " % request.method ? @app.route("/json") def demo4(): json_dict = { "name": "laowang", "age" : 18 } # 使用JSON.dumps將字典轉成JSON字符串 # result = json.dumps(json_dict) # return result # 使用JSON將字符串轉成JSON.dumps字典 # result = json.loads(json_dict) # return result # jsonify會指定響應內容的數據格式(告訴客戶端我返回給你的數據格式是什麽) return jsonify(json_dict) ? @app.route(‘/redirect‘) def demo5(): # 重定向回到自己的頁面 # url_for:取到指定視圖函數所對應的路由URL,並且可以攜帶參數 # return redirect(url_for(‘demo2‘,user_id=123)) # 重定向到百度, 這個時候就不用書寫url_for return redirect(‘http://www.baidu.com‘) ? @app.route(‘/demo6‘) def demo6(): return "demo6", 3456 # 3456 ? if __name__ == ‘__main__‘: app.run(port=1245, debug=True) ? 7.正則匹配路由 代碼實現步驟 #導入werkzeug.routing中的BaseConverter from werkzeug.routing import BaseConverter from flask import Flask #自定義轉換器 # 自定義正則轉換器 class RegexConverter(BaseConverter): def __init__(self, url_map, *args): super(RegexConverter, self).__init__(url_map) # 將接受的第1個參數當作匹配規則進行保存 self.regex = args[0] # 添加轉換器到默認的轉換器字典中,並指定轉換器使用時名字為: re app = Flask(__name__) ? # 將自定義轉換器添加到轉換器字典中,並指定轉換器使用時名字為: re app.url_map.converters[‘re‘] = RegexConverter #使用轉換器去實現自定義匹配規則 #當前此處定義的規則是:3位數字 @app.route(‘/user/<re("[0-9]{3}"):user_id>‘) def user_info(user_id): return "user_id 為 %s" % user_id to_python 和 to_url class ListConverter(BaseConverter): # 自己定義轉換器 regex = "(\\d+,?)+\\d$" def to_python(self, value): """當屁配到參數, 對參數進一步處理, 返回給試圖函數""" return value.split(",") ? def to_url(self, value): """使用url_for的時候,對視圖函數傳的參數進行處理,處理完畢之後以便能夠進行路由匹配""" result = ‘,‘.join(str(v) for v in value) return result 系統自帶的轉換器6種 DEFAULT_CONVERTERS = { ‘default‘: UnicodeConverter, ‘string‘: UnicodeConverter, ‘any‘: AnyConverter, ‘path‘: PathConverter, ‘int‘: IntegerConverter, ‘float‘: FloatConverter, ‘uuid‘: UUIDConverter, } 8.異常捕獲 a. 主動拋出異常 abort(狀態碼) b. errorhandler裝飾器進行裝飾 demo from flask import Flask from flask import abort ? app = Flask(__name__) ? @app.route(‘/‘) def index(): return ‘index‘ ? @app.route(‘/demo1‘) def demo1(): # abort(404) # 註意報錯碼此時應該註意傳入參數 a = 0 b = b / a return "demo1" ? @app.errorhandler(404) def page_not_found(error): return "親, 頁面不見了" ? @app.errorhandler(ZeroDivisionError) def zero_division_error(error): # 必須要傳入一個參數 return ‘除數不能為0‘ ? if __name__ == ‘__main__‘: app.run(port=1111, debug=True) 9.鉤子函數 demo1 from flask import Flask ? app = Flask(__name__) ? @app.before_first_request def before_first_request(response): """第一次會訪問該函數並且函數裏面接受一個參數:響應,還需要將響應進行返回""" print(‘before_first_request‘) return response ? @app.before_request def before_request(): """每次請求之前都會調用""" print(‘before_request‘) ? @app.teardown_request def teardown_request(error): """在請求之後會執行,如果請求的函數報有異常,會把具體異常傳入到此函數""" print("teardown_request") ? @app.route(‘/‘) def index(): return ‘index‘ ? if __name__ == ‘__main__‘: app.run(port=1456)
python 初步認識Flask