Seite 1 von 1

Wie korrekt mit URLs umgehen

Verfasst: Samstag 21. Mai 2011, 17:21
von anogayales
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

Re: Wie korrekt mit URLs umgehen

Verfasst: Sonntag 22. Mai 2011, 08:45
von sma
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

Re: Wie korrekt mit URLs umgehen

Verfasst: Sonntag 22. Mai 2011, 15:24
von anogayales
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

Re: Wie korrekt mit URLs umgehen

Verfasst: Sonntag 22. Mai 2011, 22:53
von sma

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

Re: Wie korrekt mit URLs umgehen

Verfasst: Montag 23. Mai 2011, 08:04
von anogayales
Vielen Dank!