How do I “create”/“assign” a logging handler for Google Cloud Pubsub?

后端 未结 2 701
礼貌的吻别
礼貌的吻别 2021-01-22 01:59

Development from the previous thread found that the assumptions when asking the question were off-topic (subprocess was actually not causing the problems), so I\'m making a more

相关标签:
2条回答
  • 2021-01-22 02:37

    First, if I understand correctly by what you are showing in your output, you are using a Pub/Sub notification to send a message whenever you make changes to a Cloud Storage object. This information could be helpful.

    Now, message.data["name"] is not going to work because message.data is a BYTES object. Thus, can't be indexed as a dict.

    To treat it as a dict, you first have to decode it as base64 (import base64). After that, what you are left is a string which looks like JSON format. You then use json.load() (don't forget to import json) to transform this string into a dict. Now you can index the message.

    The code for this will be:

    print("This is before variables")
    dirpath = "/subfolder1/"
    print(dirpath)
    
    #Transform the bytes object into a string by decoding it
    namepath = base64.b64decode(message.data).decode('utf-8')
    
    #Transform the json formated string into a dict
    namepath = json.loads(namepath)
    
    print(namepath["name"])
    fullpath = dirpath + namepath["name"]
    print(fullpath)
    print("this is after variables")
    

    Now, if your intent is to read the attributes only, they are properly defined at the top like:

        if message.attributes:
            print('Attributes:')
            for key in message.attributes:
                value = message.attributes.get(key)
                print('{}: {}'.format(key, value))
    

    So, you could use:

        print("this is before variables")
        dirpath = "~/subfolder1/"
        print(dirpath)
        namepath = message.attributes["objectId"]
        print(namepath)
        fullpath = dirpath + namepath
        print(fullpath)
        print("this is after variables")
    

    Keep in mind that for this particular case, "objectId" is the name of the file because it's the attribute that the notification from Pub/Sub for Cloud Storage uses. If you pretend to send custom messages, change "objectId" to your desired attribute name.

    0 讨论(0)
  • 2021-01-22 03:00

    As Nahuel and tripleee explained, the problem is with the messages being BYTES instead of strings. However, their code didn't exactly work, and still threw out errors, and I have no idea why. By cross-referencing with Google's sample code for the pubsub appengine website, and a few more hours of trial and error, I have found the following code to be working. Might be inelegant and/or have bad practices, in that case please edit it and make it more robust.

    #Continues from after message.ack(), above code remains unchanged
    #except needing to <import json>
    
        #this makes a message.data a true python dict with strings.
        payload = json.loads(message.data.decode('utf-8')) 
    
        #this finds the value of the dict with key "name"
        namepath = payload["name"]
    
        #this is just a static string to pre-pend to the file path
        dirpath = "/home/[redacted]/"
    
        #combine them into a single functioning path
        fullpath = dirpath + namepath
    
        #currently type 'unicode', so convert them to type 'str'
        fullpath = fullpath.encode("utf-8")
    

    And at the end we will have a fullpath that is purely type 'str' to be used by later functions/commands.

    0 讨论(0)
提交回复
热议问题