目录
一、Flask上下文
1、请求上下文
2、应用上下文
例子1
例子2
二、蓝图
1、蓝图介绍
2、使用蓝图
三、Flask-RESTful
1、下载第三方模块
2、怎么使用
结果??四、装饰器
case_装饰器
?case_装饰器
?例子1
?1、视图类添加
2、单方法添加
一、Flask上下文
1、请求上下文
request
? 封装了HTTP请求的内容, 针对的是HTTP请求.
? 请求的数据封装在request对象中, 比如查询参数, 文件数据等
session
? session用来记录请求会话中的信息, 针对的是用户信息.
2、应用上下文
current_app 代表当前app ? app可以完成跨视图函数访问
?
g ? 全局的变量 ? 但是不能跨视图函数访问
例子1
app.jiyun = "你好 积云"
?
@app.route("/count")
def do_home():
? ?print("jiyun:{}".format(current_app.jiyun))
? ?return "<h1>登录失败!</h1>"
结果
?
例子2
@app.route("/comment")
def do_comment():
? ?print("g.msg=", g.msg)
?
@app.route("/error")
def do_error():
? ?g.msg = "我是小兵张嘎"
? ?print(g.msg)
? ?return "<h1>我是小兵张嘎</h1>"
结果:结果:先执行error,后执行comment
二、蓝图
1、蓝图介绍
蓝图(blueprint):用于实现单个应用的视图、模板、静态文件的集合。
?
蓝图就是模块化处理的类。类似于django中app,子应用。
?
简单来说,蓝图就是一个存储操作路由映射方法的容器,主要用来实现客户端请求和URL相互关联的功能。 在Flask中,使用蓝图可以帮助我们实现模块化应用的功能。
?
flask中,将项目模块化,blueprint,是flask自带的一种开发模式,目的是为了方便开发大型的项目
2、使用蓝图
使用蓝图 3步走
app = Flask(__name__)
?
# 1、创建一个蓝图模板
main_blue = Blueprint("main", __name__)
?
?
# 2、 定义视图函数 使用蓝图配置路由
@main_blue.route("/")
def home():
? return "<h1>欢迎来到2050年</h1>"
?
?
@main_blue.route("/login")
def login():
? return "<h1>登录成功</h1>"
?
?
# 3、把蓝图 注册到 app上
app.register_blueprint(main_blue)
- 结果?注册蓝图的时候 参数
我们可以 添加 url_prefix 添加一个路由前缀,这样子 这个蓝图上的所有路由都有了这个前缀。
三、Flask-RESTful
1、下载第三方模块
pip install flask-restful
2、怎么使用
flask-restful 引入了两个类 一个API类 一个是 Resource类
Resource类 用来定义视图类
API类 用来管理视图类
apps.book_blue
from flask_restful import Api, Resource
?
from flask import Blueprint, make_response, jsonify
?
book_blue = Blueprint("book", __name__)
?
api = Api(book_blue)
?
?
# 创建视图类
class Book(Resource):
? ?def get(self):
? ? ? ?resp = make_response("<h1>返回图书列表</h1>")
? ? ? ?return resp
?
? ?def post(self):
? ? ? ?return jsonify({"msg": "添加图书成功"})
?
?
# 把这个视图类 配置一个路由
api.add_resource(Book, "/books")
restful
from flask import Flask?
from apps.book_blue import book_blue
?
app = Flask(__name__)
?
#注册蓝图
app.register_blueprint(book_blue, url_prefix="/my")
?
if __name__ == "__main__":
? ?app.run()
结果?四、装饰器
case_装饰器
def checkInt(func):
? ?def inner(x,y):
? ? ? ?print("----函数执行前调用----")
? ? ? ?return func(x, y)
? ?return inner
?
@checkInt
def add(x, y):
? ?return x + y
?
@checkInt
def mulit(x, y):
? ?return x * y
?
print(add(3,10))
?
print(mulit(10, 20))
结果
?case_装饰器
def checkInt(func):
? ?def inner(x,y):
? ? ? ?if isinstance(x, (int, float)) and isinstance(y, (int, float)):
? ? ? ? ?return func(x, y)
? ? ? ?else:
? ? ? ? ? ?return "非数字不能相加"
? ?return inner
?
@checkInt
def add(x, y):
? ?return x + y
?
@checkInt
def mulit(x, y):
? ?return x * y
?
print(add(3,"a"))
结果
?例子1
from flask_restful import Api, Resource
?
from flask import Blueprint, make_response, jsonify
?
book_blue = Blueprint("book", __name__)
?
api = Api(book_blue)
?
?
def checkIsNone(func):
? ?def inner():
? ? ? ?resp = func()
? ? ? ?if resp.content_length > 0:
? ? ? ? ? ?return resp
? ? ? ?else:
? ? ? ? ? ?return make_response("内容为空")
?
? ?return inner
?
?
# 创建视图类
class Book(Resource):
?
? ?method_decorators = [checkIsNone]
?
? ?def get(self):
? ? ? ?resp = make_response("")
?
? ? ? ?return resp
?
? ?def post(self):
? ? ? ?return jsonify({"msg": "添加图书成功"})
?
?
# 把这个视图类 配置一个路由
api.add_resource(Book, "/books")
结果
?1、视图类添加
Flask-Restful 框架 定义的 Resource视图类中 都有一个属性
method_decorators,可以在这里方法里声明 多个装饰器
这样子,会作用在 每一个视图类中的方法上。
from flask_restful import Api, Resource
?
from flask import Blueprint, make_response, jsonify
?
book_blue = Blueprint("book", __name__)
?
api = Api(book_blue)
?
?
def checkIsNone(func):
? ?def inner():
? ? ? ?resp = func()
? ? ? ?if resp.content_length > 0:
? ? ? ? ? ?return resp
? ? ? ?else:
? ? ? ? ? ?return make_response("内容为空")
?
? ?return inner
?
?
def decorator2(func):
? ?def wrapper(*args, **kwargs):
? ? ? ?print('decorator2')
? ? ? ?return func(*args, **kwargs)
? ?return wrapper
?
?
# 创建视图类
class Book(Resource):
? ?method_decorators = [checkIsNone, decorator2]
?
? ?def get(self):
? ? ? ?resp = make_response("")
? ? ? ?return resp
?
? ?def post(self):
? ? ? ?return jsonify({"msg": "添加图书成功"})
?
# 把这个视图类 配置一个路由
api.add_resource(Book, "/books")
结果???????
2、单方法添加
我们也可以给每一个函数,进行单独的添加
from flask_restful import Api, Resource
from flask import Blueprint, make_response, jsonify
book_blue = Blueprint("book", __name__)
api = Api(book_blue)
?
def checkIsNone(func):
? ?def inner():
? ? ? ?resp = func()
? ? ? ?if resp.content_length > 0:
? ? ? ? ? ?return resp
? ? ? ?else:
? ? ? ? ? ?return make_response("内容为空")
? ?return inner
?
def decorator2(func):
? ?def wrapper(*args, **kwargs):
? ? ? ?print('decorator2')
? ? ? ?return func(*args, **kwargs)
? ?return wrapper
?
?
# 创建视图类
class Book(Resource):
? ?method_decorators = {
? ? ? ?"get":[checkIsNone],
? ? ? ?"post":[decorator2]
? }
?
? ?def get(self):
? ? ? ?resp = make_response("")
? ? ? ?return resp
?
? ?def post(self):
? ? ? ?return jsonify({"msg": "添加图书成功"})
?
# 把这个视图类 配置一个路由
api.add_resource(Book, "/books")
结果
|