These docs are for PubNub 4.0 for Python-Twisted V4 which is our latest and greatest! For the docs of the older versions of the SDK, please check PubNub 3.0 for Python, PubNub 3.0 for Python-Tornado and PubNub 3.0 for Python-Twisted.
If you have questions about the PubNub for Python SDK, please contact us at firstname.lastname@example.org.
The simplest way to get started is to install PubNub Python SDK via pypi:
from pubnub.pubnub_twisted import PubNubTwisted
from pubnub.enums import PNStatusCategory from pubnub.pubnub_twisted import PubNubTwisted as PubNub from pubnub.pnconfiguration import PNConfiguration from twisted.internet import reactor from pubnub.callbacks import SubscribeCallback def main(): pnconf = PNConfiguration() pnconf.subscribe_key = 'demo' pnconf.publish_key = 'demo' pubnub = PubNub(pnconf) def my_publish_callback(result, status): # Check whether request successfully completed or not if not status.is_error(): envelope = result pass # Message successfully published to specified channel. else: pass # Handle message publish error. Check 'category' property to find out possible issue # because of which request did fail. # Request can be resent using: [status retry]; class MySubscribeCallback(SubscribeCallback): def presence(self, pubnub, presence): pass # handle incoming presence data def status(self, pubnub, status): if status.category == PNStatusCategory.PNUnexpectedDisconnectCategory: pass # This event happens when radio / connectivity is lost elif status.category == PNStatusCategory.PNConnectedCategory: # Connect event. You can do stuff like publish, and know you'll get it. # Or just use the connected event to confirm you are subscribed for # UI / internal notifications, etc pubnub.publish().channel("awesome_channel").message("Hello World!").async(my_publish_callback) elif status.category == PNStatusCategory.PNReconnectedCategory: pass # Happens as part of our regular operation. This event happens when # radio / connectivity is lost, then regained. elif status.category == PNStatusCategory.PNDecryptionErrorCategory: pass # Handle message decryption error. Probably client configured to # encrypt messages and on live data feed it received plain text. def message(self, pubnub, message): # Handle new message stored in message.message pass pubnub.add_listener(MySubscribeCallback()) pubnub.subscribe().channels('awesome_channel').execute() reactor.callLater(30, pubnub.stop) # stop reactor loop after 30 seconds pubnub.start() if __name__ == '__main__': main()
subscribe_keyis mandatory. Also include
publish_keyif you intend to publish from this instance, and the
secret_keyif you wish to perform PAM administrative operations from this Python-Twisted V4 instance.
For security reasons you should only include the secret-key on a highly secured server. The secret-key is only required for granting rights using our Access Manager.
When you init with
from pubnub.pubnub_twisted import PubNubTwisted from pubnub.pnconfiguration import PNConfiguration pnconfig = PNConfiguration() pnconfig.subscribe_key = "my_subkey" pnconfig.publish_key = "my_pubkey" pnconfig.ssl = False pubnub = PubNubTwisted(pnconfig)
from pubnub.callbacks import SubscribeCallback class MySubscribeCallback(SubscribeCallback): def status(self, pubnub, status): pass # The status object returned is always related to subscribe but could contain # information about subscribe, heartbeat, or errors # use the operationType to switch on different options if status.operation == PNOperationType.PNSubscribeOperation \ or status.operation == PNOperationType.PNUnsubscribeOperation: if status.category == PNStatusCategory.PNConnectedCategory: pass # This is expected for a subscribe, this means there is no error or issue whatsoever elif status.category == PNStatusCategory.PNReconnectedCategory: pass # This usually occurs if subscribe temporarily fails but reconnects. This means # there was an error but there is no longer any issue elif status.category == PNStatusCategory.PNDisconnectedCategory: pass # This is the expected category for an unsubscribe. This means there # was no error in unsubscribing from everything elif status.category == PNStatusCategory.PNUnexpectedDisconnectCategory: pass # This is usually an issue with the internet connection, this is an error, handle # appropriately retry will be called automatically elif status.category == PNStatusCategory.PNAccessDeniedCategory: pass # This means that PAM does allow this client to subscribe to this # channel and channel group configuration. This is another explicit error else: pass # This is usually an issue with the internet connection, this is an error, handle appropriately # retry will be called automatically elif status.operation == PNOperationType.PNSubscribeOperation: # Heartbeat operations can in fact have errors, so it is important to check first for an error. # For more information on how to configure heartbeat notifications through the status # PNObjectEventListener callback, consult <link to the PNCONFIGURATION heartbeart config> if status.is_error(): pass # There was an error with the heartbeat operation, handle here else: pass # Heartbeat operation was successful else: pass # Encountered unknown status type def presence(self, pubnub, presence): pass # handle incoming presence data def message(self, pubnub, message): pass # handle incoming messages pubnub.add_listener(MySubscribeCallback())
my_listener = MySubscribeCallback() pubnub.add_listener(my_listener) # some time later pubnub.remove_listener(my_listener)
from pubnub.callbacks import SubscribeCallback from pubnub.enums import PNStatusCategory class HandleDisconnectsCallback(SubscribeCallback): def status(self, pubnub, status): if status.category == PNStatusCategory.PNUnexpectedDisconnectCategory: # internet got lost, do some magic and call reconnect when ready pubnub.reconnect() elif status.category == PNStatusCategory.PNTimeoutCategory: # do some magic and call reconnect when ready pubnub.reconnect() else: logger.debug(status) def presence(self, pubnub, presence): pass def message(self, pubnub, message): pass disconnect_listener = HandleDisconnectsCallback() pubnub.add_listener(disconnect_listener)
A subscribe event experienced an exception when running.
SDK was able to reconnect to pubnub.
SDK subscribed with a new mix of channels (fired every time the
time()to verify the client connectivity to the origin:
d = pubnub.time().deferred() d.addCallback(my_callback)
@gen.coroutine def publish_snippet(): def publish_callback(result, status): if not status.is_error(): envelope = result pass # Message successfully published to specified channel. else: pass # Handle message publish error. Check 'category' property to find out possible issue # because of which request did fail. # Request can be resent using: [status retry]; pubnub.publish().channel('such_channel').message(['hello', 'there']).async(publish_callback)
here nowon the channel by UUID:
Requires that the
envelope = yield pubnub.here_now()\ .channels("my_channel", "demo")\ .include_uuids(True)\ .future() if envelope.status.is_error(): # handle error return for channel_data in envelope.result.channels: print("---") print("channel: %s" % channel_data.channel_name) print("occupancy: %s" % channel_data.occupancy) print("occupants: %s" % channel_data.channel_name) for occupant in channel_data.occupants: print("uuid: %s, state: %s" % (occupant.uuid, occupant.state))
timeout, by UUID. Setting the presence attribute to a callback will subscribe to presents events on
Requires that the
pubnub.subscribe()\ .channels("my_channel")\ .with_presence()\ .execute()
Requires that the
envelope = yield pubnub.history()\ .channel("history_channel")\ .count(100)\ .future()