Python class in defination

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
fynnpf
User
Beiträge: 10
Registriert: Dienstag 20. Oktober 2020, 08:21

Code: Alles auswählen

from selenium import webdriver
from datetime import datetime
from time import sleep
from chrome2 import Chrome

class Whatsapp:
    
    def __init__(self):
        self.selectors = {
            'qrcode': 'canvas',
            'search_input':  '#side .copyable-text.selectable-text',
            'search_result': '#side span[title="{}"]',
            'message_input': '#main footer div.copyable-text.selectable-text',
            'message_send':  '#main footer button span[data-icon="send"]'
        }
        
        url = 'http://web.whatsapp.com'
        
        self.chrome = Chrome.instance
        
               
        
    def _ensure_page_load(self):
        pass
        
    def _check_valid_qrcode(self):
        # Not logged in
        small_timeout = 5
        while not self.chrome.element_exists_at(self.selectors['search_input'], timeout=small_timeout):
            qrcode = self.chrome.wait_for(self.selectors['qrcode'], timeout=small_timeout)
            self.chrome.screenshot('screens/qrcode.png')
            
            print('Look for whatsapp QRCode inside your running directory.')
            sleep(small_timeout)
        
        print('Whatsapp successfully logged in...')
        self.chrome.screenshot('screens/1.png')

    def _search_for_chat(self, to):
        self.chrome.wait_for(self.selectors['search_input']).send_keys(to)
        self.chrome.wait_for(self.selectors['search_result'].format(to)).click()
        self.chrome.screenshot('screens/2.png')
    
    def _type_message(self, message):
        self.chrome.wait_for(self.selectors['message_input']).send_keys(message + '\n')
        # self.chrome.wait_for(selectors['message_send']).click()  # replaced by '\n' on previous line
        self.chrome.screenshot('screens/3.png')
    
    def send(self, message, to):
        
        try:
            self._check_valid_qrcode()
            self._search_for_chat(to)
            self._type_message(message)
            
        except Exception as e:
            print('An unexpected error occured. Quiting chrome now')
            self.chrome.screenshot('screens/error.png')
            self.chrome.quit()
            
            raise e
            
            
    def load_chats(self):
        '''
            return a triple (name, timestamp) for every chat open
        '''
        return_chats = []
        sel = '#pane-side'
        
        timeout = 15
        chatbox = self.chrome.wait_for('#pane-side', timeout=timeout)
        chats = chatbox.find_elements_by_css_selector('div[tabindex]')
        
        self.chrome.screenshot('screens/4.png')
        
        # print('chats', chats)
        for chat in chats:
            # print('---')
            items = chat.text.split('\n')
            print(items[1], items[0])
            return_chats.append( (items[1], items[0]) )
        

if __name__ == '__main__':
    message = 'Auftrag\r\r\nneue Spalte!!!!'
    to = 'Test'
    
    whats = Whatsapp()
    whats.send(message, to)
    

Code: Alles auswählen

def create(person):
    """
    This function creates a new person in the people structure
    based on the passed in person data
    :param person:  person to create in people structure
    :return:        201 on success, 406 on person exists
    """
    lname = person.get("lname", None)
    fname = person.get("fname", None)

    # Does the person exist already?
    if lname not in PEOPLE and lname is not None:
        PEOPLE[lname] = {
            "lname": lname,
            "fname": fname,
            "timestamp": get_timestamp(),
        }
        return make_response(
	
	#CODE SOLL HIER AUSFEFÜHRT WERDEN
	
        )
    else:
        abort(
            406
        )
Wie bekommte ich es hin, dass der erste Code an der Stelle return make_response (#CODE SOLL HIER AUSFEFÜHRT WERDEN) ausgeführt wird???
Zuletzt geändert von fynnpf am Mittwoch 21. Oktober 2020, 13:58, insgesamt 1-mal geändert.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

Welcher "class test"? Woher kommt lname?
Benutze keine Abkürzungen. Bei lname, fname sind das l und f doch total nichtssagend.
fynnpf
User
Beiträge: 10
Registriert: Dienstag 20. Oktober 2020, 08:21

Es geht allgemein darum, wie ich "class test" in "def create" ausführen kann.
Benutzeravatar
__blackjack__
User
Beiträge: 13110
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@fynnpf: Du willst da ziemlich sicher keine ``class`` in der Funktion definieren. Und Klassen führt man nicht aus. Klassen sind nichts ausführbares, Klassen sind eine Vorlage für Objekte die man damit erstellen kann. Was trivial ist, also sicher nicht die Frage sein kann. Ich glaube hier weiss keiner was Du tatsächlich machen willst.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
fynnpf
User
Beiträge: 10
Registriert: Dienstag 20. Oktober 2020, 08:21

Ich habe die Frage aktualisiert!!!
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Falls ich es richtig rate:

Code: Alles auswählen

make_response(Test())
fynnpf
User
Beiträge: 10
Registriert: Dienstag 20. Oktober 2020, 08:21

TypeError: The view function did not return a valid response.
Benutzeravatar
__blackjack__
User
Beiträge: 13110
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@fynnpf: Ich könnte jetzt anfangen zu raten was denn eine „view function“ in diesem Kontext ist, und welches Rahmenwerk Du vielleicht verwendest. Du könntest solche Sachen aber auch einfach mal von Dir aus verraten.

Was sagt denn die Dokumentation was man da zurückgeben darf? Und was ist `make_response()`?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
fynnpf
User
Beiträge: 10
Registriert: Dienstag 20. Oktober 2020, 08:21

@__blackjack__ Das ist eine REST-API. make_response() hat ursprünglich einen Dialog ausgegeben.
Ich möchte jetzt aber, dass die class Whatsapp ausgeführt wird, wenn make_response() ausgeführt wird, also die Daten erfolreich verarbeitet worden sind.

Zu der Fehlermeldung: TypeError: The view function did not return a valid response. The return type must be a string, dict, tuple, reponse instance, or wsgi callable, but it was a Whatsapp.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Dann muss offenbar WhatsApp von Response erben und sich entsprechend der geforderten Schnittstelle verhalten. Da du nur häppchenweise Infos lieferst, könnte das noch ein lustiges Frage-Antwort-Spiel werden. :)
Benutzeravatar
__blackjack__
User
Beiträge: 13110
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ich würde sagen das ist kein so guter Rat, denn ich glaube nicht das zwischen `Whatsapp` und `Response`, offenbar von einem Webrahmenwerk, eine „ist-ein(e)“-Beziehung besteht. Vererbung wäre da das falsche Mittel.

Die Frage ist ja was denn da an den Client ausgeliefert werden soll. Text/HTML(-Fragment) für eine Webseite? Ein JSON-Objekt? Ein Objekt mit dem man Nachrichten per Whatsapp verschicken kann, macht da nicht wirklich Sinn an der Stelle.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
fynnpf
User
Beiträge: 10
Registriert: Dienstag 20. Oktober 2020, 08:21

Hallo, ich bin noch neu was Python angeht.
Was ich aber zusätlich sagen kann, dass class Whatsapp funktioniert, wenn es in einer einzelnen .py Datei ist. Das Whatsapp script wird dann ausgeführt.
Ich versuche halt, dass die REST API wenn ein neuer Eintrag erstellt wird, das script ausführt. In python2 war es execfile, was ich soweit auch zum laufen bekomme.
Ich weiss nur nicht, wie ich die Daten von der einen zu der anderen Python Datei bekomme, also z.B. lname, deshalb habe ich die class Whatsapp in die andere Python datei eingefügt, weil ich dann direkt mit variablen arbeiten kann. Wenn also make_response() ausgeführt wird, soll ganz simpel die class bzw. das script whatsapp ausfeführt werden.
fynnpf
User
Beiträge: 10
Registriert: Dienstag 20. Oktober 2020, 08:21

Entscheidene Zusatzinfo: Das ganze ist eine REST-API mit Flask, in der dann nach dem return response bzw. make response die class ausgeführ werden soll. Hilft das als information???
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

Eine Whatsapp-Klasse kann man nicht per REST-API zurückgeben. Man kann nur in einer Funktion, die per REST-API aufgerufen wird, irgendwas mit der Whatsapp-Klasse machen, so wie Du das ja schon in einer einzlnen py-Datei machst.
Antworten