使用 PubNub 在 Django 视图中发布消息
Using PubNub to publish message in Django view
我想使用 PubNub 从 Django 视图发布消息。我是 运行 我在 pythonanywhere 上的网络应用程序。一开始似乎工作正常,但如果我连续几次刷新页面,我最终会捕获到一个 RuntimeError 异常,消息为 "can't start new thread"。如果我稍微等一下(我不确定要等多久),它会再次恢复工作,然后重复相同的行为。
似乎问题在于为回调启动一个新线程,但我不确定。
这是我在 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
和堆栈跟踪:
[25/Aug/2018 11:30:25] ERROR [league.views:42] Caught exception in my_view()
Traceback (most recent call last):
File "/home/tennis/tennis.pythonanywhere.com/website/league/views.py", line 40, in my_view
pubnub.publish().channel('MyDemoChannel').message({"text": "Message from my_view()"}).async(publish_callback)
File "/home/tennis/.virtualenvs/tennis.pythonanywhere.com/lib/python3.6/site-packages/pubnub/endpoints/endpoint.py", line 116, in async
cancellation_event=self._cancellation_event)
File "/home/tennis/.virtualenvs/tennis.pythonanywhere.com/lib/python3.6/site-packages/pubnub/pubnub.py", line 68, in request_async
callback, cancellation_event)
File "/home/tennis/.virtualenvs/tennis.pythonanywhere.com/lib/python3.6/site-packages/pubnub/request_handlers/requests_handler.py", line 81, in async_request
thread.start()
File "/usr/lib/python3.6/threading.py", line 846, in start
_start_new_thread(self._bootstrap, ())
RuntimeError: can't start new thread
感谢您的帮助。
有两个问题。首先,您需要将 .async(callback_function_here)
添加到您的发布行。另外,您的频道名称包含空格,这是无效的。此处列出了频道名称限制:
此代码应该有效:
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)
在 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 从 Django 视图发布消息。我是 运行 我在 pythonanywhere 上的网络应用程序。一开始似乎工作正常,但如果我连续几次刷新页面,我最终会捕获到一个 RuntimeError 异常,消息为 "can't start new thread"。如果我稍微等一下(我不确定要等多久),它会再次恢复工作,然后重复相同的行为。
似乎问题在于为回调启动一个新线程,但我不确定。
这是我在 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
和堆栈跟踪:
[25/Aug/2018 11:30:25] ERROR [league.views:42] Caught exception in my_view()
Traceback (most recent call last):
File "/home/tennis/tennis.pythonanywhere.com/website/league/views.py", line 40, in my_view
pubnub.publish().channel('MyDemoChannel').message({"text": "Message from my_view()"}).async(publish_callback)
File "/home/tennis/.virtualenvs/tennis.pythonanywhere.com/lib/python3.6/site-packages/pubnub/endpoints/endpoint.py", line 116, in async
cancellation_event=self._cancellation_event)
File "/home/tennis/.virtualenvs/tennis.pythonanywhere.com/lib/python3.6/site-packages/pubnub/pubnub.py", line 68, in request_async
callback, cancellation_event)
File "/home/tennis/.virtualenvs/tennis.pythonanywhere.com/lib/python3.6/site-packages/pubnub/request_handlers/requests_handler.py", line 81, in async_request
thread.start()
File "/usr/lib/python3.6/threading.py", line 846, in start
_start_new_thread(self._bootstrap, ())
RuntimeError: can't start new thread
感谢您的帮助。
有两个问题。首先,您需要将 .async(callback_function_here)
添加到您的发布行。另外,您的频道名称包含空格,这是无效的。此处列出了频道名称限制:
此代码应该有效:
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)
在 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