1、为路由起名
通过endpoint参数为路由起名
api.add_resource(HelloWorldResource, '/', endpoint='HelloWorld')
2、蓝图中使用
在蓝图中,如果使用Flask_RESTful,创建Api对象的时候,传入蓝图对象即可,不再是传入 app 对象。
示例代码1:
from flask import Flask, Blueprint
from flask_restful import Api, Resource
app = Flask(__name__)
user_bp = Blueprint('user', __name__)
user_api = Api(user_bp)
class UserProfileResource(Resource):
def get(self):
return {'msg': 'get user profile'}
user_api.add_resource(UserProfileResource, '/users/profile')
app.register_blueprint(user_bp)
app.run()
运行结果:
示例代码2:
main.py
from flask import Flask
app = Flask(__name__)
from user import user_bp
app.register_blueprint(user_bp)
if __name__ == '__main__':
app.run(debug=True)
user.__init__.py
from flask import Blueprint
user_bp = Blueprint('user', __name__, url_prefix='/user')
from user import views
user.view.py
from user import user_bp
from flask_restful import Api, Resource
api = Api(user_bp)
class LoginView(Resource):
def get(self):
return {'msg': '登录成功!'}
# 建立映射关系
api.add_resource(LoginView, '/login')
运行结果:
3、装饰器
使用method_decorators
添加装饰器。
3.1 为类视图中的所有方法添加装饰器
def decorator1(func):
def wrapper(*args, **kwargs):
print('decorator1')
return func(*args, **kwargs)
return wrapper
def decorator2(func):
def wrapper(*args, **kwargs):
print('decorator2')
return func(*args, **kwargs)
return wrapper
class DemoResource(Resource):
method_decorators = [decorator1, decorator2]
def get(self):
return {'msg': 'get view'}
def post(self):
return {'msg': 'post view'}
3.2 为类视图中不同的方法添加不同的装饰器
class DemoResource(Resource):
method_decorators = {
'get': [decorator1, decorator2],
'post': [decorator1]
}
# 使用了decorator1 decorator2两个装饰器
def get(self):
return {'msg': 'get view'}
# 使用了decorator1 装饰器
def post(self):
return {'msg': 'post view'}
# 未使用装饰器
def put(self):
return {'msg': 'put view'}
3.3 实例演示
示例代码:
from flask import Flask, Blueprint
from flask_restful import Api, Resource
app = Flask(__name__)
user_bp = Blueprint('user', __name__)
user_api = Api(user_bp)
def decorator1(func):
def wrapper(*args, **kwargs):
print('decorator1')
return func(*args, **kwargs)
return wrapper
def decorator2(func):
def wrapper(*args, **kwargs):
print('decorator2')
return func(*args, **kwargs)
return wrapper
class DemoResource(Resource):
method_decorators = {
'get': [decorator1, decorator2],
'post': [decorator1]
}
# 使用了decorator1 decorator2两个装饰器
def get(self):
return {'msg': 'get view'}
# 使用了decorator1 装饰器
def post(self):
return {'msg': 'post view'}
# 未使用装饰器
def put(self):
return {'msg': 'put view'}
user_api.add_resource(DemoResource, '/')
app.register_blueprint(user_bp)
app.run()
运行效果:
4、渲染模板
渲染模版就是在Flask_RESTful的类视图中要返回html片段代码,或者是整个html文件代码。
如果需要浏览器渲染模板内容应该使用 api.representation 这个装饰器来定义一个函数,在这个函数中,应该对 html 代码进行一个封装,再返回。
注意:
- api.representation装饰器修饰的函数必须返回一个Response对象
示例代码:
from flask import Flask, render_template, Response
from flask_restful import Api, Resource
import json
app = Flask(__name__)
# 如果想要前端的中文不再是\u这样的编码,可以加如下参数配置
app.config['RESTFUL_JSON'] = dict(ensure_ascii=False)
api = Api(app)
class HomeView(Resource):
def get(self):
return {'msg': '个人主页'}
class IndexView(Resource):
def get(self):
return render_template('index.html')
api.add_resource(IndexView, '/index')
api.add_resource(HomeView, '/home')
@api.representation('text/html')
def out_html(data, code, headers):
# 必须返回一个response对象
if isinstance(data, str):
resp = Response(data)
resp.headers = {
"name": 'dgw'
}
return resp
else:
return Response(json.dumps(data, ensure_ascii=False).encode('gbk'))
if __name__ == '__main__':
app.run(debug=True)
运行结果: