1. 程式人生 > >python 初步認識Flask

python 初步認識Flask

傳參 步驟 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