尝试为Python3支持的应用程序创建Web前端.该应用程序将需要双向流,这听起来像是查看websockets的好机会.
我的第一个倾向是使用已经存在的东西,mod-pywebsocket的示例应用程序已被证明是有价值的.不幸的是,他们的API似乎并不容易扩展,而且它是Python2.
环顾博客圈,许多人为早期版本的websocket协议编写了自己的websocket服务器,大多数人都没有实现安全密钥哈希所以不行.
阅读RFC 6455我决定自己尝试一下,并提出以下建议:
#!/usr/bin/env python3
"""
A partial implementation of RFC 6455
http://tools.ietf.org/pdf/rfc6455.pdf
Brian Thorne 2012
"""
import socket
import threading
import time
import base64
import hashlib
def calculate_websocket_hash(key):
magic_websocket_string = b"258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
result_string = key + magic_websocket_string
sha1_digest = hashlib.sha1(result_string).digest()
response_data = base64.encodestring(sha1_digest)
response_string = response_data.decode('utf8')
return response_string
def is_bit_set(int_type, offset):
mask = 1 << offset
return not 0 == (int_type & mask)
def set_bit(int_type, offset):
return int_type | (1 << offset)
def bytes_to_int(data): …Run Code Online (Sandbox Code Playgroud) 我开始使用更多 Python3 的类型支持,我希望能够注释staticmethods作为替代构造函数的返回类型。
下面是一个最小的例子;如果我包含注释,它会失败:
def from_other_datastructure(json_data: str) -> MyThing:
NameError: name 'MyThing' is not defined
Run Code Online (Sandbox Code Playgroud)
import typing
class MyThing:
def __init__(self, items: typing.List[int]):
self.items = items
@staticmethod
def from_other_datastructure(json_data: str):
return MyThing(
[int(d) for d in json_data.split(',')]
)
if __name__ == '__main__':
s1 = MyThing([1, 2, 3])
s2 = MyThing.from_other_datastructure("2,3,4")
Run Code Online (Sandbox Code Playgroud)
那么如何在为类型注释定义类之前引用类呢?