2016-12-08 2 views
1

Je souhaite masquer un mot de passe dans une URL à des fins de consignation. J'espérais utiliser urlparse, en analysant, en remplacement de mot de passe avec le mot de passe factice et unparsing, mais cela me donne:Obfuscate password in url

>>> from urllib.parse import urlparse 
>>> parts = urlparse('https://user:[email protected]/aaa/bbb') 
>>> parts.password = 'xxx' 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: can't set attribute 

Ainsi, l'alternative semble être this, ce qui semble exagéré.

Existe-t-il un moyen plus facile de remplacer le mot de passe, en utilisant la bibliothèque standard?

+0

Qu'est-ce ici 'parts'? – AKS

+0

@AKS: désolé, je pensais que c'était clair. Ajouté plus de contexte. – dangonfast

+0

@janbrohl: C'est exactement ce que le script lié est en train de faire, et cela me semble trop juste parce que urlparse ne permet pas de définir les composants séparés. – dangonfast

Répondre

4

urlparse renvoie une (sous-classe de) tuple nommé. Utilisez le namedtuple._replace() method pour produire une nouvelle copie, et utilisez geturl() pour 'unparse'.

Le mot de passe fait partie de l'attribut netloc, qui peut être analysé plus:

from urllib.parse import urlparse 

def replace_password(url): 
    parts = urlparse(url) 
    if parts.password is not None: 
     # split out the host portion manually. We could use 
     # parts.hostname and parts.port, but then you'd have to check 
     # if either part is None. The hostname would also be lowercased. 
     host_info = parts.netloc.rpartition('@')[-1] 
     parts = parts._replace(netloc='{}:[email protected]{}'.format(
      parts.username, host_info)) 
     url = parts.geturl() 
    return url 

Démo:

>>> replace_password('https://user:[email protected]/aaa/bbb') 
'https://user:[email protected]/aaa/bbb' 
+0

C'est génial! Laisse moi le tester. – dangonfast

+0

@delavnog: léger problème: il n'y a pas de champ de mot de passe; Je vais mettre à jour avec le bon champ. –

+0

Pourquoi ne pas simplement vérifier si 'parts.password n'est pas None'? – warvariuc