Python 使用PubNub在Django视图中发布消息

Python 使用PubNub在Django视图中发布消息,python,django,pubnub,pythonanywhere,Python,Django,Pubnub,Pythonanywhere,我想使用PubNub从Django视图发布消息。我正在Pythonywhere上运行我的web应用程序。一开始它似乎工作得很好,但如果我连续刷新页面几次,我最终会发现一个RuntimeError异常,消息是“不能启动新线程”。如果我稍等一下(我不确定要等多久),它会再次恢复工作,然后重复相同的行为 问题似乎在于为回调启动一个新线程,但我不确定 以下是views.py中我的视图和回调的代码: def my_view(request): try: pnconfig = PNC

我想使用PubNub从Django视图发布消息。我正在Pythonywhere上运行我的web应用程序。一开始它似乎工作得很好,但如果我连续刷新页面几次,我最终会发现一个RuntimeError异常,消息是“不能启动新线程”。如果我稍等一下(我不确定要等多久),它会再次恢复工作,然后重复相同的行为

问题似乎在于为回调启动一个新线程,但我不确定

以下是views.py中我的视图和回调的代码:

def my_view(request):
    try:
        pnconfig = PNConfiguration()

        pnconfig.subscribe_key = '<sub key>'
        pnconfig.publish_key = '<pub key>'
        pnconfig.ssl = False

        pubnub = PubNub(pnconfig)
        pubnub.publish().channel('MyDemoChannel').message({"text": "Message from my_view()"}).async(publish_callback)
    except:
        logger.exception("Caught exception in my_view()")

        context = {'val_1': 1, 'val_2': 2}
        return render( request, 'my_app/my_view.html', context)


def publish_callback(envelope, status):
    if not status.is_error():
        pass
    else:
        pass

谢谢您的帮助。

有两个问题。首先,您需要将
.async(这里是回调函数)
添加到发布行。此外,频道名称包含空格,这是无效的。此处列出了通道名称约束:

此代码应适用于:

从pubnub.callbacks导入SubscribeCallback
从pubnub.enums导入PNStatusCategory
从pubnub.pnconfiguration导入pnconfiguration
从pubnub.pubnub导入pubnub
pnconfig=PNConfiguration()
pnconfig.subscribe_key=''
pnconfig.publish_键=“”
pnconfig.ssl=False
pubnub=pubnub(pnconfig)
def publish_回调(结果、状态):
通过
#处理PNPublishResult和PNStatus
publish().channel('MyDemoChannel').message({“text”:“来自my_视图的消息()”}).async(publish_回调)

在my_view()之外配置和实例化PubNub对象修复了以下问题:

from pubnub.pnconfiguration import PNConfiguration
from pubnub.pubnub import PubNub

pnconfig = PNConfiguration()

pnconfig.subscribe_key = '<sub key>'
pnconfig.publish_key = '<pub key>'
pnconfig.ssl = False

pubnub = PubNub(pnconfig)

def my_view(request):
    try:
        pubnub.publish().channel('MyDemoChannel').message({"text": "Message from my_view()"}).async(publish_callback)
    except:
        logger.exception("Caught exception in my_view()")

        context = {'val_1': 1, 'val_2': 2}
        return render( request, 'my_app/my_view.html', context)


def publish_callback(envelope, status):
    if not status.is_error():
        pass
    else:
        pass
从pubnub.pnconfiguration导入pnconfiguration
从pubnub.pubnub导入pubnub
pnconfig=PNConfiguration()
pnconfig.subscribe_key=''
pnconfig.publish_键=“”
pnconfig.ssl=False
pubnub=pubnub(pnconfig)
定义我的视图(请求):
尝试:
publish().channel('MyDemoChannel').message({“text”:“来自my_视图的消息()”}).async(publish_回调)
除:
logger.exception(“在我的视图()中捕获异常”)
上下文={'val_1':1'val_2':2}
返回渲染(请求“my_app/my_view.html”,上下文)
def publish_回调(信封、状态):
如果不是,则状态为。is_error():
通过
其他:
通过

添加完整的错误回溯
from pubnub.callbacks import SubscribeCallback
from pubnub.enums import PNStatusCategory
from pubnub.pnconfiguration import PNConfiguration
from pubnub.pubnub import PubNub

pnconfig = PNConfiguration()

pnconfig.subscribe_key = '<sub key>'
pnconfig.publish_key = '<pub key>'
pnconfig.ssl = False

pubnub = PubNub(pnconfig)

def publish_callback(result, status):
    pass
    # Handle PNPublishResult and PNStatus

pubnub.publish().channel('MyDemoChannel').message({"text": "Message from my_view()"}).async(publish_callback)
from pubnub.pnconfiguration import PNConfiguration
from pubnub.pubnub import PubNub

pnconfig = PNConfiguration()

pnconfig.subscribe_key = '<sub key>'
pnconfig.publish_key = '<pub key>'
pnconfig.ssl = False

pubnub = PubNub(pnconfig)

def my_view(request):
    try:
        pubnub.publish().channel('MyDemoChannel').message({"text": "Message from my_view()"}).async(publish_callback)
    except:
        logger.exception("Caught exception in my_view()")

        context = {'val_1': 1, 'val_2': 2}
        return render( request, 'my_app/my_view.html', context)


def publish_callback(envelope, status):
    if not status.is_error():
        pass
    else:
        pass