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)