Flask的奥秘三

一、flask的路由装饰器

app = Flask(__name__)

@app.route("/", methods=['get', 'post'])
def fun():
	return "hello world"

上面的代码时flask的视图函数,由@app.route("/", methods=[‘get’, ‘post’]),来控制访问路径,源码如下:

def route(self, rule, **options):
      def decorator(f):
          endpoint = options.pop("endpoint", None)
本质        self.add_url_rule(rule, endpoint, f, **options)
          return f

      return decorator

看到源码,其中执行了self.add_url_rule(rule, endpoint, f, **options)函数,可以看出只要执行了这个方法,就可以添加访问路径。

二、app.route()的参数

  • rule
    路径规制

  • endpoint=""
    默认是函数名, 可以在app.route()的关键字参数中定义url_for("") 反向地址, 通过视图函数名, 或endpoint解析对应的URL

  • methods=[]
    该视图函数能处理的请求方式, 默认是GET, 当重新定义了
    methods, 那么默认的GET也会被覆盖

  • defaults={}
    给视图函数传递参数, 可以作为默认参数, 传了就必须的接

  • strict_slashes=Bool
    严格的使用"/", URL中没有"/", 访问时也不能有, URL中有"/", 你访问时没有, 会通过301进行永久重定向

  • redirect_to=""
    永久重定向

三、常用的路径

@app.route('/user/<username>')  传递字符串
@app.route('/user/<int:id>')  传递整数
@app.route('/user/<float:id>')  传递浮点数
@app.route('/user/<path:path>')  传递路径

尖括号中的值,视图函数可以从路径中获取相应的值

四、自定义传参规制

a.创建类并继承BaseConverter,实现to_python方法
b.把自定义的类添加进app.url_map.converters字典中
c.然后自己就可以使用自定义的路径

例如:

from flask import Flask
from werkzeug.routing import BaseConverter


class RegexConverter(BaseConverter):
    def __init__(self, maps, regex):
        super(RegexConverter, self).__init__(maps)
        self.regex = regex

    def to_python(self, value):
        """
        路由匹配时,匹配成功后传给视图函数中的参数
        :param value:
        :return:
        """
        return value

    def to_url(self, value):
        val = super(RegexConverter, self).to_url(value)
        return val


app = Flask(__name__)
app.url_map.converters['re'] = RegexConverter

这样就可以使用名为re的路径
@app.route("/…/<re(‘参数’):nid>")
其实这是自定义的以正则匹配的字符串,使得其传入视图函数

五、flash()方法和get_flashed_messages()方法

  • flash()
    这是基于session的,能够存储数据的方法,可以进行分类存储
    flash(message, category=“message”)
    可以使用category参数进行分类
  • get_flashed_messages()
    这是将使用flash()方法存入的数据全部取出或按照某类的全部数据取出
    get_flashed_messages(with_categories=False, category_filter=())
    可以按照分类进行获取数据

六、before_request,after_request等装饰器

1.使用 @app.before_request 装饰器装饰的函数,可以在每一次请求之前执行该函数(相当与检测)
2.如果有返回值,则表示被拦截了
3.如果没有返回值,则表示通过检测了
4.简单使用:用户认证
5.使用 @app.after_request 装饰器装饰的函数,可以在每一次请求之后执行,该函数必须要有response参数,必须要返回response
6.可以写多个这样的函数,@app.before_request 装饰的函数,顺序执行,@app.after_request 装饰的函数
倒序执行
7.请求拦截后,所有的 @app.after_request 装饰的函数都会执行
8.定制错误信息 使用 @app.errorhandler([状态码]) 装饰器来定制错误信息
9.使用 @app.template_filter @app.template_global 装饰器装饰的函数,可以在页面中调用

七、中间件

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

# 实例化flask对象
app = Flask(__name__)


@app.route('/')
def hello_world():
    return 'hello world!'


class md(object):  # 中间件
    def __init__(self, old_wsgi_app):
        self.old_wsgi_app = old_wsgi_app

    def __call__(self, *args, **kwargs):
        print("开始之前")
        ret = self.old_wsgi_app(*args, **kwargs)
        print("结束之后")
        return ret


if __name__ == '__main__':
    # 监听用户请求
    # 如果用户请求到来。执行app的__call__方法
    app.wsgi_app = md(app.wsgi_app)
    app.run()

将Flask实例化对象中的wsgi_app函数重写,可以在其中写入自己的想要执行的代码,能够在启动之前和之后执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值