2016-12-08 7 views
1

私は、ログに記録するためにURLのパスワードを隠す必要があります。私は、パースダミーパスワードとパスワードを置き換え、そしてunparsingにより、urlparseを使用することを期待していたが、これは私を与えている: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 

ので代替が過剰思われる、thisのようです。

標準ライブラリを使用して簡単にパスワードを置き換える方法はありますか?

+0

'parts'はここで何ですか? – AKS

+0

@AKS:申し訳ありませんが、私はそれがはっきりしていると思いました。コンテキストを追加しました。 – dangonfast

+0

@janbrohl:それはまさにリンクされたスクリプトがやっていることであり、urlparseが別々のコンポーネントを設定することを許していないからといって、私には残酷に思えます。 – dangonfast

答えて

4

urlparseは、という名前のタプルという名前のサブクラスを返します。 namedtuple._replace() methodを使用して新しいコピーを作成し、その上にgeturl()を使用して「解読しない」。

パスワードをさらに解析することができnetloc属性の一部で、次のとおりです。

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 

デモ:

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

それは幻想的です!私はそれを試してみましょう。 – dangonfast

+0

@delavnog:わずかな問題:パスワードフィールドはありません。私は右のフィールドで更新します。 –

+0

なぜ 'parts.passwordがNone'でないのかチェックしてみませんか? – warvariuc