Flask中RESTful视图使用(蓝图、装饰器、渲染模板)

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)

运行结果:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值