2.Flask視圖

Flask視圖

1.Hello World

# -*- coding: utf-8 -*-
from flask import Flask

app = Flask(__name__)


@app.route('/')
def index():
    return '主頁頁面!'


if __name__ == '__main__':
    app.run(debug=True)
  • app = Flask(__name__),__name__確定程序所在目錄,也可以傳入與Python內置模塊名不相同的字符串,也可傳入__main__,最好傳入__name__

2.給路由指定http方法

# -*- coding: utf-8 -*-
from flask import Flask

app = Flask(__name__)


@app.route('/', methods=['POST', 'GET'])
def index():
    return '主頁頁面!'


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

3.動態匹配url

# -*- coding: utf-8 -*-
from flask import Flask

app = Flask(__name__)


@app.route('/<name>', methods=['POST', 'GET'])
def index(name):
    return u'主頁頁面! %s' % name


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

4.過濾url

# -*- coding: utf-8 -*-
from flask import Flask

app = Flask(__name__)


@app.route('/<int:num>', methods=['POST', 'GET'])
def index(num):
    return u'主頁頁面! %s' % num


if __name__ == '__main__':
    app.run(debug=True)
  • 內置URL轉換器
DEFAULT_CONVERTERS = {
    'default':          UnicodeConverter,
    'string':           UnicodeConverter,
    'any':              AnyConverter,
    'path':             PathConverter,
    'int':              IntegerConverter,
    'float':            FloatConverter,
    'uuid':             UUIDConverter,
}

5.自定義轉換器

  • 自定義正則轉換器,根據路由函數傳入的正則表達式匹配url

# -*- coding: utf-8 -*-
from werkzeug.routing import BaseConverter
from flask import Flask

app = Flask(__name__)


class MyRegexConverter(BaseConverter):
    """自定義URL正則轉換器"""

    def __init__(self, url, *args):
        super(MyRegexConverter, self).__init__(url)
        self.regex = args[0]


app.url_map.converters['re'] = MyRegexConverter


@app.route('/<re(r"[a-z]{3}"):filename>')
def get_file(filename):
    return 'This file is %s' % filename


if __name__ == '__main__':
    app.run(debug=True)
  • 優化訪問路徑
# -*- coding: utf-8 -*-
from werkzeug.routing import BaseConverter
from flask import Flask, make_response, current_app
import os

app = Flask(__name__)


class MyRegexConverter(BaseConverter):
    """自定義URL正則轉換器"""

    def __init__(self, url, *args):
        super(MyRegexConverter, self).__init__(url)
        self.regex = args[0]


app.url_map.converters['re'] = MyRegexConverter


@app.route('/<re(r"[a-z]{3}"):filename>')
def get_file(filename):
    return 'This file is %s' % filename


@app.route('/<re(".*"):file_name>')
def get_static_file(file_name):
    if not file_name:
        file_name = os.path.join('html', 'index.html')
    else:
        file_name = os.path.join('html', file_name)
    return make_response(current_app.send_static_file(file_name))


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

經過正則轉換器後訪問靜態目錄由/static/html/filename直接變成了/filename

6.返回自定義狀態碼

實現前後端的數據交互,可以返回不符合http協議的狀態碼

# -*- coding: utf-8 -*-
from werkzeug.routing import BaseConverter
from flask import Flask, make_response, current_app
import os

app = Flask(__name__)


@app.route('/status')
def show_status():
    return 'show status code ', 999


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

7.自定義配置文件

  • 創建config.py文件
# -*- coding: utf-8 -*-


class Config:
    DEBUG = True
  • config是flask封裝的對象
# -*- coding: utf-8 -*-
from flask import Flask
from config import Config

app = Flask(__name__)
app.config.from_object(Config)


@app.route('/status')
def show_status():
    return 'show status code ', 999


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

8.異常處理

如果在視圖函數執行過程中,產生了異常錯誤,可以使用abort函數來立即終止函數的執行,通過abort函數可以向前端返回一個存在的http錯誤狀態碼,表示出現的錯誤信息。

使用abort拋出一個http標準中不存在的自定義的狀態碼,沒有實際意義。如果abort函數被觸發,其後面的語句將不會執行。其類似於python中raise。

# -*- coding: utf-8 -*-
from flask import Flask, abort

app = Flask(__name__)


@app.route('/')
def hello_world():
    abort(404)
    return 'HelloWorld!'


if __name__ == '__main__':
    app.run()
  • 捕獲異常

在Flask中通過裝飾器來實現捕獲異常,errorhandler()接收的參數爲異常狀態碼。視圖函數的參數,返回的是錯誤信息。

# -*- coding: utf-8 -*-
from flask import Flask, abort

app = Flask(__name__)


@app.route('/')
def hello_world():
    abort(500)
    return 'HelloWorld!'


@app.errorhandler(500)
def show_error(e):
    return '服務器出現了異常,請稍後再試!<br>%s' %e


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

9.重定向(redirect())

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

app = Flask(__name__)


@app.route('/redirect')
def redirect_url():
    url = 'http://www.baidu.com'
    return redirect(url)


if __name__ == '__main__':
    app.run()
  • 反向解析(url_for())
# -*- coding: utf-8 -*-
from flask import Flask, abort, redirect, url_for

app = Flask(__name__)


@app.route('/')
def hello_world():
    # abort(500)
    return 'HelloWorld!'


@app.errorhandler(500)
def show_error(e):
    return '服務器出現了異常,請稍後再試!<br>%s' % e


@app.route('/redirect')
def redirect_url():
    url = 'http://www.baidu.com'
    return redirect(url)


@app.route('/goback')
def go_index():
    return redirect(url_for('hello_world'))


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

10.狀態保持

http協議是無狀態的,需要通過cookie和session來保持狀態

  • 設置cookie
# -*- coding: utf-8 -*-
from flask import Flask, make_response

app = Flask(__name__)


@app.route('/set_cookie')
def set_cookie():
    resp = make_response('set cookie')
    resp.set_cookie('hello,cookie')
    return resp


if __name__ == '__main__':
    app.run()
  • 獲取cookie
# -*- coding: utf-8 -*-
from flask import Flask, make_response, request

app = Flask(__name__)


@app.route('/set_cookie')
def set_cookie():
    resp = make_response('set cookie')
    resp.set_cookie('hello', 'cookie')
    return resp


@app.route('/get_cookie')
def get_cookie():
    cookie = request.cookies.get('hello')
    return u'獲取到的cookie信息是:%s' % cookie


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

11.返回json

使用jsonify()函數來返回json對象

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

app = Flask(__name__)


@app.route('/get_json')
def get_json():
    json_dict = {'name': 'Lily', 'age': '18'}
    return jsonify(json_dict)


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

12.Flask的Context(上下文)

詳細說明

  • 請求上下文(request context)

    • request和session都屬於請求上下文對象。
    • request:封裝了HTTP請求的內容,針對的是http請求。舉例:user = request.args.get(‘user’),獲取的是get請求的參數。
    • session:用來記錄請求會話中的信息,針對的是用戶信息。舉例:session[‘name’] = user.id,可以記錄用戶信息。還可以通過session.get(‘name’)獲取用戶信息。
  • 應用上下文(application context)

    • current_app和g都屬於應用上下文對象。
    • current_app:表示當前運行程序文件的程序實例。我們可以通過current_app.name打印出當前應用程序實例的名字。

13.請求鉤子

在客戶端和服務器交互的過程中,有些準備工作或掃尾工作需要處理,比如:

在請求開始時,建立數據庫連接;

在請求結束時,指定數據的交互格式。

爲了讓每個視圖函數避免編寫重複功能的代碼,Flask提供了通用設施的功能,即請求鉤子。

請求鉤子是通過裝飾器的形式實現,Flask支持如下四種請求鉤子:

before_first_request:在處理第一個請求前運行。

before_request:在每次請求前運行。

after_request:如果沒有未處理的異常拋出,在每次請求後運行。

teardown_request:在每次請求後運行,即使有未處理的異常拋出。

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

app = Flask(__name__)


@app.route('/json')
def rsp_json():
    rsp_dit = {
        'name': u'老王',
        'age': '18'
    }
    return jsonify(rsp_dit)


@app.after_request
def after(response):
    response.headers['Content-type'] = 'application/json'
    print 'after_request run'
    return response


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

查看更多

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