hyperlyph在http上被隐藏为ipc类型

hyperglyph的Python项目详细描述


hyperlyph是动态duck类型语言的ipc(进程间通信)。不像 在其他ipc库中,服务器可以返回不同的对象 对客户来说,没有客户的破坏。

协议支持合理选择原始数据类型, 包括整数、浮点、列表、集合、字典、顺序 听写、utf-8字符串、字节数组和日期/时间增量。

与现有的HTTP工具(如缓存和负载均衡器)一起工作。 增加服务,以及支持重定向或链接 到其他主机上的服务。

在2012年SRC边缘会议上进行了一次在线演讲:http://vimeo.com/45474360 (在项目更改名称之前)

我们在irc.freenode.net上

许可证

hyperlyph是根据mit许可证发布的

状态

hyperlyph是pre 1.0软件,因此应被视为不稳定 实验性的。但是,早期版本已经成功 用于生产超过一年。

基本规范已经定稿,参考文献 实现正在迎头赶上。

ruby版本落后于python版本。

1.0路线图

  • 最终确定规格(完成)
  • python实现到规范(正在进行中)
    • 客户已完成
    • 服务器没有使用所有规范
  • 符合规范的ruby实现(正在进行,但速度较慢)
    • 客户端,服务器不完整
  • 通过测试完全覆盖规范(进行中,但速度较慢)
    • ruby、python单独测试
    • 需要交叉实施测试
  • 1.0释放
    • 完成文档、测试和两个实现

示例

要显示而不是告诉您,让我们从一些服务器代码开始:

import glyph

r = glyph.Router() # a wsgi application

@r.add()
def hello():
    return "Hello World"

# and a http server running in a thread
s = glyph.Server(r)
s.start()

print s.url
s.join()

还有一些客户代码:

import glyph

server = glyph.get('http://server/')

print server.hello()

添加新功能很简单:

@r.add()
def goodbye(name):
    return "Goodbye " + name

您可以稍微更改功能:

@r.add()
def hello(name="World"):
    return "Hello "+name

令人惊讶的是,老客户机仍然可以工作,没有任何更改:

print server.hello()

要调用新方法,只需调用它们:

print server.hello('dave')
print server.goodbye('dave')

函数可以返回列表、dict、set、字节字符串、unicode, 日期、布尔值、整数和浮点值:

@r.add()
def woo():
    return [1,True, None, False, "a",u"b"]

函数甚至可以返回映射的其他函数:

@r.add()
def greeting(lang="en"):
    if lang == "en":
        return hello
    elif lang == 'fr':
        return salut

客户不在乎:

greet = client.greeting()

print greet()

glyph也可以映射对象:

@r.add()
def find_user(name):
    user_id = database.find_user(name)
    return User(user_id)

@r.add()
class User(glyph.Resource):
    def __init__(self, id):
        self.id = id

    def message(self, subject, body):
        database.send_message(self.id, subject, body)

    def bio(self):
        return database.get_bio(self.id)

客户端可以获取用户并查找详细信息:

bob = server.find_user('bob')
bob.messsage('lol', 'feels good man')

像以前一样,可以添加新方法而不破坏旧客户端。 与以前不同,我们可以更改对象内部:

@r.add()
@glyph.redirect()
def find_user(name):
    user_id, shard = database.find_user(name)
    return User(user_id, shard)

@r.add()
class User(glyph.Resource):
    def __init__(self, id, shard):
        self.id = id
        self.shard = shard

    ...

glyph.redirect意味着不返回用户对象 它应该直接重定向到它的url。客户遵循这些 自动重定向。

尽管内部结构已经改变了,但名称没有改变,所以客户机 一如既往地工作:

bob = server.find_user('bob')
bob.messsage('lol', 'feels good man')

在所有这些下面-glyph将所有这些映射到http:

# by default, a server returns an object with a bunch
# of methods that redirect to the mapped obejcts

server = glyph.get('http://server/')

# in this case, it will have an attribute 'find_user'
# find user is a special sort of object - a form
# it has a url, method and arguments attached.


# when we call server.find_user(...), it submits that form
# find_user redirects to a url for User(bob_id, cluster_id)

bob = server.find_user('bob')

# each object is mapped to a url, which contains the internal state
# of the object - i.e /User/?id=bob_id&cluster=cluster_id

# the server is stateless - a new User object is created
# for each request that comes in, before destroying it.

# similarly, methods are mapped to a url too
# bob.message is a form pointing to /User/message?id=bo_id&cluster=cluster_id

bob.messsage('lol', 'feels good man')

尽管glyph将url映射到服务器端的对象,但这些url是 对客户端不透明-服务器可以自由地将它们更改为指向 其他对象,或在不中断客户端的情况下添加新的内部状态。

客户端代码不需要知道如何构造请求或存储所有请求 发出请求所需的状态-服务器告诉它,而不是 程序员。

服务器是无状态的-对象的状态是封装的 在链接和表单中。

glyph现在支持大文件。在glyph.blob中包装文件句柄, 把它传过来。在服务器端,会写入大blob 到临时文件

内部

服务器端的glyph有四个主要部分-路由器、映射器、处理程序和 资源。

路由器-查看url前缀,查找要使用的资源类 映射器-与类关联,它创建要使用的实例 处理程序-GI即使是实例,也会处理映射请求的反序列化和序列化。 资源-实际为请求提供服务的位

ruby客户端是目前最简单的,而python客户端 有更多的代码用于更通用的http服务。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何从ImageIO中排除特定的TIFF读取器?   JavaJMockit和passbyreference。我们中一定有一个人错了(可能是我!)   java Android camera2放弃了牛轧糖的表面,但在棉花糖上工作   java按字符串中出现的顺序对字符数组进行排序   如何获取Groovy生成的java源代码   java无法使用AutoIT和Selenium Webdriver在所需位置/文件夹保存图像   java为什么我的冒泡排序代码会打印出这些奇怪的东西?   java JAXB:typesafeEnumMemberName=“generateName”是否可自定义?   Java编程输入:今天是星期天输出:星期天是今天   java不理解首个OOAD书的吉他示例   java如何从JformattedTextfield检索货币格式值   java可以从相同的源代码生成功能不同的可执行文件吗?