当前位置: 首页 > 软件库 > Web应用开发 > Web框架 >

Falcon Framework

Python 框架
授权协议 Apache
开发语言 Python
所属分类 Web应用开发、 Web框架
软件类型 开源软件
地区 不详
投 递 者 端木涵润
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

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()
  • 介绍 当您的目标是构建快速、可扩展的REST风格API微服务时, Falcon 是个不错的选择。 这是一个可靠的、高性能的Python Web框架,用于构建大规模应用后端和微服务。Falcon鼓励REST架构风格的 URI到资源的映射,以花费尽可能少的精力同时又保持高效。 Falcon重点关注四个方面:速度、可靠性、灵活性和可调试性。它通过"响应者(responder)" (诸如 on_get()

  • Falcon - The minimalist Python WSGI framework

  • stackoverflow上的解释是: From the source code, we learn that Flask uses client side session which is based on secure cookies. Thus we could achieve the same thing by using Falcon Cookies API which also use

  • 工作中现在要用小米的open-falcon,准备都OK了,现在想通过短信来进行报警,但是找了官网,只提供了关于邮件的报警mail-provider,并没有短信SMS的。研究了一段时间。终于搞定了。 首先我的运行环境是CentOS6.5。前期搭建open-falcon的顺序是按照官方文档来的,不再提了。 短信发送重要的模块之一就是sender模块。 官网链接:[url]http://book.ope

  • Web Framework 框架 全栈 Web Framework Django Python 界最流行的 web 框架。 awesome 系列 很棒的Django pyramid一个小巧,快速,接地气的开源 Python web 框架。awesome web2py 一个全栈 web 框架和平台,专注于简单易用。官网 TurboGears 借助WebOb,SQLAlchemy,Genshi和Rep

  • 用Python做API,是用Tornado还是Falcon 从GitHub中整理出15个最受欢迎的Python开源框架。这些框架包件I/O,OLAP,Web开发,高性能网络通信,测试,爬虫 Django: Python Web应用开发框架 Django 应该是最出名的Python框架,GAE甚至Erlang都有框架受它影响。Django是走大而全的方向,它最出名的是其全自动化的管理后台:只需要使用

 相关资料
  • 我们在WebLogic11g下使用JSF2.1+PrimeFaces6.0+PrimeFaces-Extensions6.0.0、mojarra 2.1.7。 单击p:commandButton后,DOM inspector显示对话框已在正文和html标记之外创建,如下一个图像所示: 在正文外部呈现的对话框 如果我们使用相同的代码(没有帧)创建一个新的.xhtml,并单击p:commandButt

  • 许多的 PHP 开发者都使用框架,而不是重新造轮子来构建 Web 应用。框架抽象了许多底层常用的逻辑,并提供了有益又简便的方法來完成常见的任务。 你并不一定要在每个项目中都使用框架。有时候原生的 PHP 才是正确的选择,但如果你需要一个框架,那么有如下三种主要类型: 微型框架 全栈框架 组件框架 微型框架基本上是一个封装的路由,用来转发 HTTP 请求至一个闭包,控制器,或方法等等,尽可能地加快开

  • 主要内容:iframe - 设置高度与宽度,实例,iframe - 移除边框,实例,使用 iframe 来显示目标链接页面,实例,HTML iframe 标签通过使用框架,你可以在同一个浏览器窗口中显示不止一个页面。 iframe语法: 该URL指向不同的网页。 iframe - 设置高度与宽度 height 和 width 属性用来定义iframe标签的高度与宽度。 属性默认以像素为单位, 但是你可以指定其按比例显示 (如:"80%")。 实例 <iframe loading="lazy" s

  • tornado.web — RequestHandler and Application classes Thread-safety notes Request handlers Entry points Input Output Cookies Other Application configuration Decorators Everything else tornado.template

  • UI /主题框架和组件 LESS支持下表中列出的一些UI/Theme框架 - Sr.No. 框架和描述 1 1pxdeep 它是平坦的Bootstrap 3主题,提供强大的配色方案控件。 2 Bootflat 它是一个基于Bootstrap的开源框架。 3 BootPress 它是一个基于平面文件CMS的PHP框架 4 Bootstrap 它是功能强大的移动第一前端框架,可实现更快,更轻松的Web

  • 本章介绍 Decoder(解码器) Encoder(编码器) Codec(编解码器) 在前面的章节中,我们讨论了连接到拦截操作或数据处理链的不同方式,展示了如何使用 ChannelHandler 及其相关的类来实现几乎任何一种应用程序所需的逻辑。但正如标准架构模式通常有专门的框架,通用处理模式很适合使用目标实现,可以节省我们大量的开发时间和精力。 在这一章,我们将研究编码和解码——数据从一种特定协

  • WLAN框架接口 函数 rt_err_t  rt_wlan_set_mode (const char *dev_name, rt_wlan_mode_t mode)   注册WLAN设备到WLAN设备框架   rt_err_t  rt_wlan_connect (const char *ssid, const char *password)   同步连接热点   rt_err_t  rt_wlan

  • 通过使用框架,你可以在同一个浏览器窗口中显示不止一个页面。 iframe语法: <iframe src="URL"></iframe> 该URL指向不同的网页。 Iframe - 设置高度与宽度 height 和 width 属性用来定义iframe标签的高度与宽度。 属性默认以像素为单位, 但是你可以指定其按比例显示 (如:"80%")。 <iframe src="demo_iframe.htm