python - Flask 或 Pyramid 中的简单网络 UDP 监听

标签 python nginx flask wsgi

我需要创建一个网络应用程序来显示通过定期传入的 UDP 数据包提供的数据。该站点可能位于 Flask(可能是 Pyramid)中,部署在 Nginx 下。我如何创建一个非常简单的后台任务(基本上只是 socket.recv())来监听任何传入的数据包,并将数据推送到全局可访问的列表中?

我可以简单地从 main() 生成一个线程来执行此操作,还是我需要使用 Celery 或 PyRes 之类的东西?

感谢您的指导。

最佳答案

你将不得不使用 celery ,但你很幸运,因为 There's already a flask extension that integrates celery .你必须 pip install flask, pip install flask-celery, pip install redis 并且你的系统需要一个redis服务器.

import socket, select, Queue

from flask import Flask
from celery import Celery


def make_celery(app):
    celery = Celery(app.import_name, broker=app.config['CELERY_BROKER_URL'])
    celery.conf.update(app.config)
    TaskBase = celery.Task
    class ContextTask(TaskBase):
        abstract = True
        def __call__(self, *args, **kwargs):
            with app.app_context():
                return TaskBase.__call__(self, *args, **kwargs)
    celery.Task = ContextTask
    return celery

app = Flask(__name__)
app.config.update(
    CELERY_BROKER_URL='redis://localhost:6379',
    CELERY_RESULT_BACKEND='redis://localhost:6379'
)
celery = make_celery(app)
socket_queue = Queue.Queue()


@celery.task()
def listen_to_udp():
    """
    This code was taken from 
    https://stackoverflow.com/questions/9969259/python-raw-socket-listening-for-udp-packets-only-half-of-the-packets-received
    """
    s1 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s1.bind(('0.0.0.0', 1337))
    s2 = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_UDP)
    s2.bind(('0.0.0.0', 1337))
    while True:
        r, w, x = select.select([s1, s2], [], [])
        for i in r:
            socket_queue.put((i, i.recvfrom(131072)))

@app.route("/")
def test_home():
    listen_to_udp.delay()
    print(socket_queue.get())

if __name__ == "__main__":
    #run install.py to install dependencies and create the database
    app.run(host="0.0.0.0", port=5000, debug=True)

关于python - Flask 或 Pyramid 中的简单网络 UDP 监听,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26281935/

相关文章:

python - Bokeh 中的网络图形 : displaying a node's connections when hovering over the node

Python+D-Bus+BlueZ 5 : can't read property of object?

python - Flask WTForms Integerfield 类型是文本而不是数字

python - 无法使用 Flask 和 Shapely 在 heroku 上运行应用程序

python - 删除 json 文件中的键引发列表索引错误

python - verbose_name_plural 在模型中出乎意料?

azure - 有没有办法从 nginx-kubernetes 入口提供外部 URL?

if-statement - 仅当 cookie 存在时,如何有条件地覆盖 nginx 中的 header ?

php - 如何避免 PHP 脚本失败时服务器无响应

google-app-engine - GAE标准Flask教程: ImportError: cannot import name SpooledTemporaryFile