我正在尝试创建一个使用本地消息传递的Web扩展,它可以与Web API交互。因此,这个想法是当有人通过API发送消息时,扩展也会接收它。
我按照firefox example的步骤操作。到目前为止一切顺利,我能够在主机和扩展之间进行通信。
下面是我的主机代码,使用的是flask框架:
import json
import sys
import struct
import threading
import os
from flask import Flask, request, jsonify, Response, abort
# Read a message from stdin and decode it.
def get_message():
raw_length = sys.stdin.read(4)
if not raw_length:
sys.exit(0)
message_length = struct.unpack('=I', raw_length)[0]
message = sys.stdin.read(message_length)
return json.loads(message)
# Encode a message for transmission, given its content.
def encode_message(message_content):
encoded_content = json.dumps(message_content)
encoded_length = struct.pack('=I', len(encoded_content))
return {'length': encoded_length, 'content': encoded_content}
# Send an encoded message to stdout.
def send_message(encoded_message):
sys.stdout.write(encoded_message['length'])
sys.stdout.write(encoded_message['content'])
sys.stdout.flush()
def get_message_background():
while True:
message = get_message()
if message == "ping":
send_message(encode_message("pong"))
thread = threading.Thread(target=get_message_background)
thread.daemon = True
thread.start()
app = Flask(__name__)
@app.route("/test", methods=['GET'])
def test():
send_message(encode_message('testing'))
return 'testing'
app.run('localhost', 5001, debug=True)
有了这个代码,我收到一个ping和回应一个pong。
问题是当我试图在终端上运行代码时,本地消息传递通过stdio进行通信,当我在终端上运行脚本时,终端变成了标准的输入和输出。
如果我只是加载扩展, flask 不启动。
有人解决了这个问题吗?
PS:对不起我的英语
1条答案
按热度按时间vh0rcniy1#
将
stdout
重定向到脚本开头的文件,就在导入之后:在
send_message()
中,将stdout
重定向到原始stdout
,然后返回到文件:我通过向Flask服务器发送
GET
请求来切换Firefox标签页。