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)

查看更多

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值