Flask-1-05-Response

若是在執行後端代碼的時候,用戶的訪問不能知足你規定的要求的時候,你還想給用戶一個反饋,這裏就可使用abort函數,當即終止視圖函數的執行,並返回給前端特定的信息

例如這裏咱們模擬,用戶訪問首頁的時候,須要先登陸,跳轉到登陸頁面後,模擬用戶輸入的請求是錯誤,咱們返回給他401的狀態(禁止訪問)html

# coding:utf-8
from flask import Flask, redirect, url_for, abort # 這裏咱們須要導入abort這個類

app = Flask(__name__)


@app.route('/')
def index():
    # 將視圖重定向到login頁面
    return redirect(url_for('login'))


def this_is_never_excuted():
    # 永遠不會被執行
    pass


@app.route("/login", methods=['GET'])
def login():
    # 模擬登錄失敗, 返回401意爲着禁止訪問
    abort(401)
    print('永遠不會去執行')
    this_is_never_excuted()


if __name__ == '__main__':
    app.run(host='0.0.0.0', debug=True)

 返回結果:

這裏能夠看出返回的狀態碼是401說明,咱們abort函數執行了,經過後臺返回的信息也能看出,abort函數以後的代碼也沒有執行,下面就是服務端的返回信息:

(Flask_py) python@python-VirtualBox:~/code$ python abort_demo.py 
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 294-731-034
192.168.3.5 - - [23/Jul/2019 07:41:58] "GET / HTTP/1.1" 302 -
192.168.3.5 - - [23/Jul/2019 07:41:58] "GET /login HTTP/1.1" 401 -
192.168.3.5 - - [23/Jul/2019 07:41:58] "GET /favicon.ico HTTP/1.1" 404 -

經過源碼咱們能夠看到abort函數給出的註釋裏還有一種應用方法前端

'''
Can be passed a WSGI application or a status code. If a status code is
given it's looked up in the list of exceptions and will raise that
exception, if passed a WSGI application it will wrap it in a proxy WSGI
exception and raise that::

abort(404)
abort(Response('Hello World'))

'''

大概翻譯的就是python

你能夠傳遞一個WSGI應用或者是一個狀態碼。若是給定一個狀態碼,它會在異常列表中查找並引起異常,若是傳遞的是一個WSGI應用,它將把它包裝在一個代理WSGI異常中並引起該異常json

# abort 的另外一種應用方法
from flask import Flask, redirect, url_for, abort, Response # 須要導入的包

app = Flask(__name__)


@app.route('/')
def index():
    # 將視圖重定向到login頁面
    return redirect(url_for('login'))


def this_is_never_excuted():
    # 永遠不會被執行
    pass


@app.route("/login", methods=['GET'])
def login():
    # 模擬登錄失敗, 返回401意爲着禁止訪問
    # abort(401)
    abort(Response('禁止訪問!!!'))
    print('永遠不會去執行')
    this_is_never_excuted()


if __name__ == '__main__':
    app.run(host='0.0.0.0', debug=True)

這裏並非拋出狀態碼給定的HTTPException,因此瀏覽器默認認爲,它只是執行了, 咱們想給定的結果,因此狀態碼是200,如今咱們使用到的都是默認給出的狀態碼返回的信息,好比頁面未找到會拋出一個404的狀態碼。若是你要定製錯誤頁面,這裏就可使用errorhandler() 裝飾器:

# coding:utf-8
from flask import Flask, redirect, url_for, abort, Response

app = Flask(__name__)


@app.route('/')
def index():
    # 將視圖重定向到login頁面
    return redirect(url_for('login'))


def this_is_never_excuted():
    # 永遠不會被執行
    pass


@app.route("/login", methods=['GET'])
def login():
    # 模擬登錄失敗, 返回401意爲着禁止訪問
    abort(404)
    # abort(Response('禁止訪問!!!'))
    # print('永遠不會去執行')
    # this_is_never_excuted()

# 自定義錯誤視圖,用來返回給前端用戶看到的結果
@app.errorhandler(404)
def page_not_found(error):
    return "頁面未找到 %s" % error, 404


if __name__ == '__main__':
    app.run(host='0.0.0.0', debug=True)

 訪問127.0.0.1:5000/ 會返回的結果是:由於這裏跳轉到登陸頁面以後會直接執行abort(404)

這就是經過咱們本身定製給出的返回結果

 

響應


 

視圖函數的返回值會被自動轉換爲一個響應對象。若是返回值是一個字符串, 它被轉換爲該字符串爲主體的、狀態碼爲 200 OK``的 、 MIME 類型是 ``text/html 的響應對象。Flask 把返回值轉換爲響應對象的邏輯是這樣:

  1. 若是返回的是一個合法的響應對象,它會從視圖直接返回。

  2. 若是返回的是一個字符串,響應對象會用字符串數據和默認參數建立。

  3. 若是返回的是一個元組,且元組中的元素能夠提供額外的信息。這樣的元組必須是 (response, status, headers) 的形式,且至少包含一個元素。 status 值會覆蓋狀態代碼, headers 能夠是一個列表或字典,做爲額外的消息標頭值。

  4. 若是上述條件均不知足, Flask 會假設返回值是一個合法的 WSGI 應用程序,並轉換爲一個請求對象。

若是你想在視圖裏操縱上述步驟結果的響應對象,可使用 make_response() 函數。

接下來定義一個index視圖,分別展現一下返回響應的信息和自定義的狀態碼

# coding:utf-8
from flask import Flask, make_response

app = Flask(__name__)

@app.route("/index")
def index():
    # 1 使用元祖,返回自定義的響應信息
    #          響應體     狀態碼                  響應頭
    # return "index page", 400, [("Programme_L", "python"), ("Locality", "Harbin")]
    # return "index page", 400, {"Programme_L": "python", "Locality": "Harbin"}
    # return "index page", "666 userDefined status", {"Programme_L": "python", "Locality": "Harbin"}
    # return "index page", "666 userDefined status"

    # 2 使用make_response 響應信息
    resp = make_response("index page 2")
    resp.status = "999 userDefined"  # 設置狀態碼
    resp.headers["city"] = "Harbin"  # 設置響應頭
    return resp


if __name__ == '__main__':
    app.run(host='0.0.0.0', debug=True)

這裏只給你們展現用make_response 響應的結果:

 

 

返回 json 數據

在學習Python的時,其中有一個json模塊能夠幫咱們將字典數據轉換成 json字符串【json.dumps(dict)】,也能夠將字符串轉換成Python中的字典【json.loads(str)】,顯然咱們這裏就能夠這樣使用

# coding:utf-8
import json

from flask import Flask

app = Flask(__name__)

@app.route("/index")
def index():
    data = {
        'name': 'circle',
        'age': 30,
    }
    json_str = json.dumps(data)
    return json_str, 200, {"Content-Type": "application/json"}  # 這裏咱們必定要手動添加這句話來指定爲json數據

if __name__ == '__main__':
    app.run(host='0.0.0.0', debug=True)

雖然咱們這樣本身指定也是很方便的就能夠將json數據返回,可是咱們仍是須要手動添加{"Content-Type": "application/json"}  來指定爲json數據,這裏咱們使用Flask框架幫我封裝的 jsonify() 就能夠完成更簡便的操做

# coding:utf-8
from flask import Flask, jsonify

app = Flask(__name__)

@app.route("/index")
def index():
    data = {
        'name': 'circle',
        'age': 30,
    }
    # json_str = json.dumps(data)
    # return json_str, 200, {"Content-Type": "application/json"}
    return jsonify(data)


if __name__ == '__main__':
    app.run(host='0.0.0.0', debug=True)

經過返回的結果能夠看出,咱們能夠將json數據返回給瀏覽器

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息