Wie korrekt mit URLs umgehen

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
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Hallo liebe Community,

ich brauch mal wieder Nachhilfe in pythonisch :)

Ich schreibe eine Klasse die einen API zugriff über urrlib2 regelt. Dabei ist es dem Benutzer freigestelt entweder https oder http zu verwenden. Die Frage ist nun, wie ich das ganze pythonisch mach?

Code: Alles auswählen

class SomeAPI(HosterAPI):
    def __init__(self, credentials=None, secure=False):
        if secure:
            self.scheme = "https://"
        else:
            self.scheme = "http://"
        self.username, self.password = credentials
        self.base_url = "%sapi.someurl.com/cgi-bin/test.cgi?login=%s&password=%s" % (self.scheme, self.username, self.password)
Es is mir klar, dass das ganze nicht so schön aussieht. Gibt es sowas wie ein URLBuilder? Hab mir zwar schon URLParse angeschaut, aber sooooo gut sah das auch wieder nicht aus.

Grüße,
anogayales
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Im Modul urlparse gibt es unparse und unsplit, damit kann man URLs bauen. So wie du's mit Strings machst, darfst du jedenfalls nicht vergessen, die Parameter explizit zu "escapen", denn insbesondere das Passwort könnte in URLs nicht erlaubte Zeichen enthalten.

Warum gönnst du eigentlich in der Signatur von __init__ dem Namen und dem Passwort nicht eigene Variablen? So wie du's implementiert hast, kracht das, wenn jemand keine credentials übergibt. Wenn du "scheme" sonst nirgendwo brauchst, ist es unnötig, dafür ein Attribut anzulegen. Ich würde es wahrscheinlich so machen:

Code: Alles auswählen

url = "http%s://example.com/..." % (("s" if secure else ""), ...)
Stefan
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Danke für das Feedback, ich arbeite mich grade ein wenigs in urlparse modul ein, bisher sieht das ganze so aus:

Code: Alles auswählen

class SomeAPI(HosterAPI):
    def __init__(self, credentials=None, secure=False):
        #scheme, netloc, url, params, query, fragment = data
        self.base_url = ["http%s" % ("s" if secure else ""), "api.someurl.com", "cgi-bin/test.cgi", "", "", ""]
        try:
            self.username, self.password = credentials
            self.base_url[4] = "login=%s&password=%s" % (self.username, self.password)
        except ValueError:
            pass
Zu den credentials: es macht ja wenig sinn nur passwort bzw. nur den username zu übertragen, deswegen hab ich das mal als einen parameter übergeben.

Wie kann ich user input sauber escapen?

Grüße,
anogayales
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Code: Alles auswählen

>>> urllib.quote("http://Äußerst Ärgerlich/[]")
'http%3A//%C3%84u%C3%9Ferst%20%C3%84rgerlich/%5B%5D'
>>> urllib.urlencode({"c": "a b", "a": ">"})
'a=%3E&c=a+b'
Stefan
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Vielen Dank!
Antworten