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)