Python 框架 Falcon Framework

Python 框架 Falcon Framework

Apache
Python 查看源码»
跨平台
2015-01-05
红薯

Falcon 是一个高性能的 Python 框架,用于构建云端 API 和 Web 应用的后端程序。

特性:

  • 通过 URI 模板和资源类可直观的了解路由信息

  • 轻松访问请求和响应类来访问 header 和 body 信息

  • 通过方便的异常类实现对 HTTP 错误响应的处理

  • 通过全局、资源和方法钩子实现 DRY 请求处理

  • 通过 WSGI helper 和 mock 实现单元测试

  • 使用 Cython 可提升 20% 的速度

  • 支持 Python 2.6, Python 2.7, PyPy 和 Python 3.3/3.4

  • 高性能!!!

一个比较完整的例子:

import json
import logging
import uuid
from wsgiref import simple_server

import falcon


class StorageEngine(object):
    def get_things(self, marker, limit):
        return []

    def add_thing(self, thing):
        return {'id': str(uuid.uuid4())}


class StorageError(Exception):
    @staticmethod
    def handle(ex, req, resp, params):
        description = ('Sorry, couldn\'t write your thing to the '
                       'database. It worked on my box.')

        raise falcon.HTTPError(falcon.HTTP_725,
                               'Database Error',
                               description)


class Proxy(object):
    def forward(self, req):
        return falcon.HTTP_503


class SinkAdapter(object):

    def __init__(self):
        self._proxy = Proxy()

    def __call__(self, req, resp, **kwargs):
        resp.status = self._proxy.forward(req)
        self.kwargs = kwargs


def token_is_valid(token, user_id):
    return True  # Suuuuuure it's valid...


def auth(req, resp, params):
    # Alternatively, use Talons or do this in WSGI middleware...
    token = req.get_header('X-Auth-Token')

    if token is None:
        description = ('Please provide an auth token '
                       'as part of the request.')

        raise falcon.HTTPUnauthorized('Auth token required',
                                      description,
                                      href='http://docs.example.com/auth')

    if not token_is_valid(token, params['user_id']):
        description = ('The provided auth token is not valid. '
                       'Please request a new token and try again.')

        raise falcon.HTTPUnauthorized('Authentication required',
                                      description,
                                      href='http://docs.example.com/auth',
                                      scheme='Token; UUID')


def check_media_type(req, resp, params):
    if not req.client_accepts_json:
        raise falcon.HTTPNotAcceptable(
            'This API only supports responses encoded as JSON.',
            href='http://docs.examples.com/api/json')

    if req.method in ('POST', 'PUT'):
        if not req.content_type == 'application/json':
            raise falcon.HTTPUnsupportedMediaType(
                'This API only supports requests encoded as JSON.',
                href='http://docs.examples.com/api/json')


def deserialize(req, resp, resource, params):
    # req.stream corresponds to the WSGI wsgi.input environ variable,
    # and allows you to read bytes from the request body.
    #
    # See also: PEP 3333
    body = req.stream.read()
    if not body:
        raise falcon.HTTPBadRequest('Empty request body',
                                    'A valid JSON document is required.')

    try:
        params['doc'] = json.loads(body.decode('utf-8'))

    except (ValueError, UnicodeDecodeError):
        raise falcon.HTTPError(falcon.HTTP_753,
                               'Malformed JSON',
                               'Could not decode the request body. The '
                               'JSON was incorrect or not encoded as UTF-8.')


def serialize(req, resp, resource):
    resp.body = json.dumps(req.context['doc'])


class ThingsResource:

    def __init__(self, db):
        self.db = db
        self.logger = logging.getLogger('thingsapp.' + __name__)

    @falcon.after(serialize)
    def on_get(self, req, resp, user_id):
        marker = req.get_param('marker') or ''
        limit = req.get_param_as_int('limit') or 50

        try:
            result = self.db.get_things(marker, limit)
        except Exception as ex:
            self.logger.error(ex)

            description = ('Aliens have attacked our base! We will '
                           'be back as soon as we fight them off. '
                           'We appreciate your patience.')

            raise falcon.HTTPServiceUnavailable(
                'Service Outage',
                description,
                30)

        # An alternative way of doing DRY serialization would be to
        # create a custom class that inherits from falcon.Request. This
        # class could, for example, have an additional 'doc' property
        # that would serialize to JSON under the covers.
        req.context['doc'] = result

        resp.set_header('X-Powered-By', 'Small Furry Creatures')
        resp.status = falcon.HTTP_200

    @falcon.before(deserialize)
    def on_post(self, req, resp, user_id, doc):
        proper_thing = self.db.add_thing(doc)

        resp.status = falcon.HTTP_201
        resp.location = '/%s/things/%s' % (user_id, proper_thing['id'])


# Configure your WSGI server to load "things.app" (app is a WSGI callable)
app = falcon.API(before=[auth, check_media_type])

db = StorageEngine()
things = ThingsResource(db)
app.add_route('/{user_id}/things', things)

# If a responder ever raised an instance of StorageError, pass control to
# the given handler.
app.add_error_handler(StorageError, StorageError.handle)

# Proxy some things to another service; this example shows how you might
# send parts of an API off to a legacy system that hasn't been upgraded
# yet, or perhaps is a single cluster that all data centers have to share.
sink = SinkAdapter()
app.add_sink(sink, r'/v1/[charts|inventory]')

# Useful for debugging problems in your API; works with pdb.set_trace()
if __name__ == '__main__':
    httpd = simple_server.make_server('127.0.0.1', 8000, app)
    httpd.serve_forever()
的码云指数为
超过 的项目
加载中

评论(0)

暂无评论

暂无资讯

暂无问答

Open-Falcon监控系统安装和使用

0. 运维监控工具选择 1. 安装脚本(主服务) 常规安装环境搭建太复杂, dashboard安装碰到python依赖不容易解决, 直接使用docker安装, 这里总结除了一个安装 shell script, 如下: #!/bin/sh ## ...

2018/12/26 18:19
201
0
大数据生命周期管理框架Apache Falcon简介

Apache Falcon是一个开源的hadoop数据生命周期管理框架, 它提供了数据源 (Feed) 的管理服务,如生命周期管理,备份,存档到云等,通过Web UI可以很容易地配置这些预定义的策略, 能够大大简化had...

06/20 16:41
145
0
Apache Falcon数据集管理和数据处理平台

jopen 4年前发布 | 67K 次阅读 分布式/云计算/大数据 Apache Falcon Apache Falcon 是一个面向Hadoop的、新的数据处理和管理平台,设计用于数据移动、数据管道协调、生命周期管理和数据发现。...

05/24 16:58
71
0
golang toolkits包的使用方法介绍

在查看 open-falcon 项目源码时,经常会看到其引用了一个类库 https://github.com/toolkits ,而仔细查看该类库的作者为秦晓辉(UlricQin)--- 原Open-Falcon主程,现滴滴云运维负责人 。所以...

2018/12/18 21:50
142
0
开源工具推荐Open-Falcon

以下来源于网络 前言 监控系统,可以从运营级别(基本配置即可),以及应用级别(二次开发,通过端口进行日志上报),对服务器、操作系统、中间件、应用进行全面的监控,及报警,对我们的系统...

2018/09/06 14:45
492
0
golang toolkits包的使用方法介绍

在查看 open-falcon 项目源码时,经常会看到其引用了一个类库 https://github.com/toolkits ,而仔细查看该类库的作者为秦晓辉(UlricQin)--- 原Open-Falcon主程,现滴滴云运维负责人 。所以...

2018/12/18 11:12
43
0
MongoDB的sharding功能

MongoDB的auto-sharding功能是指mongodb通过mongos自动建立一个水平扩展的数据库集群系统,将数据库分表存储在sharding的各个节点上。 一个mongodb集群包括一些shards(包括一些mongod进程)...

2013/09/09 21:40
182
0
运维监控工具选择

1. 参考资料 详解十三款运维监控工具 (2017年08月17日) 开源IT监控系统对比 (2014年9月15日) 2. 选择结果-- open-falcon 理由 国内开源(小米) 文档完整 插件扩展 开源背景决定其更考虑互联网...

2018/12/24 11:40
96
0
数据库监控——mymon

mymon(MySQL-Monitor) 是Open-Falcon用来监控MySQL数据库运行状态的一个插件,采集包括global status, global variables, slave status以及innodb status等MySQL运行状态信息。 安装和配置(...

2018/09/17 15:30
487
0
Kubernetes监控在小米的落地

来源:小米云技术 ID:mi-cloud-tech 作者:郭如意 本文介绍了高可用、持久存储、可动态调整的Kubernetes监控方案的实现过程。 小米的弹性调度平台(Ocean)以及容器平台主要基于开源容器自动...

07/10 15:57
3
0

没有更多内容

加载失败,请刷新页面

返回顶部
顶部