装饰器
- 为什么要用装饰器 ?
- 在不改变原函数的基础上, 对函数执行前后进行自定义操作.
原函数
def index(a):
return a + 100
# 执行
v = index(2)
print(v)
# 返回函数名
print(index.__name__)
装饰器
def wapper(func):
def inner(*args, **kwargs):
print("---1---")
return func(*args, **kwargs)
return inner
@wapper
def index(a):
return a + 100
@wapper
的作用- 执行wapper函数, 将被装饰的函数当做参数
- 将第一步的返回值, 重新赋值给新
index = wapper(index)
- 这时的
print(index.__name__)
等于inner
需求
- 当函数被装饰之后, 使用
print(index.__name__)
返回的依然是之前的函数名- 使用functools模块 :
@functools.wraps(func)
- 使用functools模块 :
def wapper(func):
@functools.wraps(func)
def inner(*args, **kwargs):
print("---1---")
return func(*args, **kwargs)
return inner
配置文件
app.config.from_object("python类或类的路径")
- 比如 :
app.config.from_object("settings.BaseConfig")
- 比如 :
配置
- 配置数据库 :
DATABASE_URI = 'mysql://user@pro/foo'
- 是否开启Debug模式 :
DEBUG
SECRET_KEY
: 设置秘钥
创建路由
第一种方式(常用)
-
@app.route('/index', methods=['GET', 'POST'])
-
源码解析 :
app.route
会返回一个函数decorator
.
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
f
对应的是index
rule
对应的是/index
options
对应的是methods
执行流程
- 执行
@app.route('/index', methods=['GET', 'POST'])
@decorator
立即执行decorator(index)
, 把index
作为参数
第二种方式
app.add_url_rule('/order', view_func=index)