2016-07-24 3 views
0

파이썬 3.5.2과 치료 1.1.1을 사용하고 있습니다. 아래의 코드를 실행 오류가 있습니다파이썬 3.5 : "TypeError : memoryview : 'str'이 아닌 bytes와 같은 객체가 필요합니다."

:

#-*- coding:utf-8-*- 

import random 
import base64 


class ProxyMiddleware(object): 
    def process_request(self, request, spider): 
     proxy = random.choice(PROXIES) 
     if proxy['user_pass'] is not None: 
      request.meta['proxy'] = "http://%s" % proxy['ip_port'] 
      encoded_user_pass = base64.encodebytes(proxy['user_pass']) 
      request.headers['Proxy-Authorization'] = 'Basic ' + encoded_user_pass 
      print("ok!" + proxy['ip_port']) 
     else: 
      print("fail!" + proxy['ip_port']) 
      request.meta['proxy'] = "http://%s" % proxy['ip_port'] 

오류 :

encoded_user_pass = base64.encodebytes(proxy['user_pass']) 

하지만 돈 :

File "C:\Users\dell\AppData\Local\Programs\Python\Python35\lib\base64.py", line 518, in _input_type_check 
    m = memoryview(s) 
    TypeError: memoryview: a bytes-like object is required, not 'str' 

나는 오류가이 문장에 관한 생각 그것을 해결하는 방법을 알지 못한다.
도와주세요.
미리 감사드립니다.

편집 :

request.headers['Proxy-Authorization'] = 'Basic ' + encoded_user_pass 
TypeError: Can't convert 'bytes' object to str implicitly 

어떻게해야합니까 :

encoded_user_pass = base64.encodebytes(proxy['user_pass']) 

다른 오류가

encoded_user_pass = base64.encodebytes(proxy['user_pass'].encode()) 

로 변경되었습니다?

+0

참고하시기 바랍니다 base64로 인코딩 :

base64.encodebytes('foo'.encode()) 

또는 귀하의 경우 비밀 번호는 안전하지 않으며 보안 측면에서 거의 아무것도하지 않습니다. 보다 안전한 방법으로 소금 해시를 조사해야합니다. 이 질문을 체크 아웃 : http://stackoverflow.com/questions/9594125/salt-and-hash-a-password-in-python – Granitosaurus

+0

@ Granitosaurus 덕분에, 나중에 그것을 시도 할 것이다. 다른 오류가있다, 내 편집을 참조하십시오. ,감사. – zwl1619

답변

1

기능은 값을 바이트 당신이 그것을 문자열을 제공하는 것처럼 보인다.

는 단순히 문자열 값을 인코딩 할 수 있음을 해결하려면 (인코딩() 함수는 바이트 객체로 문자열 객체를 회전) :

encoded_user_pass = base64.encodebytes(proxy['user_pass'].encode()) 
+0

당신의 편집에 관하여 : 당신의 오류는 여기에 하나의 값이'string'이고 다른 하나는'bytes'라는 것을 의미합니다. 그리고 여러분이 그것들을 추가하려고하면 약간 혼란스러워집니다. 두 문자열을 모두'str.encode()'로 변환하거나 두 문자열을'bytes.decode()'로 변환해야합니다. 이 특별한 경우에는'b'Basic '+ encoded_user_pass'로 고칠 수 있습니다. – Granitosaurus

1

이름에서 알 수 있듯이 base64.encodebytes바이트인데 문자열이 아닙니다. 설명서에 설명 된대로 bytes-like object이 필요합니다 (오류 메시지에서도 알려줍니다).

그러나 proxy['user_pass'] 값은 문자열입니다. 바이트로 그 변환하기 위해, str.encode 전화 : base64.encodebytes()이 기대

encoded_user_pass = base64.encodebytes(proxy['user_pass'].encode()) 
관련 문제