2017-07-22 4 views
1

Warum erhalte ich diese Fehlermeldung:Warum kann ich den Statuscode dieser http_response nicht abrufen?

Exception in thread Thread-1: 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/threading.py", line 801, in __bootstrap_inner 
    self.run() 
    File "/usr/lib/python2.7/threading.py", line 754, in run 
    self.__target(*self.__args, **self.__kwargs) 
    File "/usr/lib/python2.7/urllib2.py", line 435, in open 
    response = meth(req, response) 
    File "/usr/lib/python2.7/urllib2.py", line 542, in http_response 
    code, msg, hdrs = response.code, response.msg, response.info() 
AttributeError: 'str' object has no attribute 'code' 

import urllib2 
import threading 

class MyHandler(urllib2.HTTPHandler): 
    def http_response(self, req, response): 
     return response.getcode() 

o = urllib2.build_opener(MyHandler()) 
t = threading.Thread(target=o.open, args=('http://www.google.com/',)) 
t.start() 
t.join() 

Antwort

0

Was die Fehlermeldung sagt, dass response ein str ist und es gibt keine code Attribut in einem str. Ich vermute, dass response geparst werden muss, um den Code herauszuziehen.

1

In Ihrem Handler sollten Sie geben die response

import urllib2 
import threading 

class MyHandler(urllib2.HTTPHandler): 
    def http_response(self, req, response): 
     return response 

o = urllib2.build_opener(MyHandler()) 
t = threading.Thread(target=o.open, args=('http://www.google.com/',)) 
t.start() 
t.join() 

Denn, wie der Fehler besagt, http_response erwartet wird drei Werte zurück: code, msg, hdrs

File "/usr/lib/python2.7/urllib2.py", line 542, in http_response 
    code, msg, hdrs = response.code, response.msg, response.info() 

Aber Sie überschreiben sie zurückkehren Nur ein Wert mit response.getcode()

HTTP-Antwortcode

012 erhalten

Um den Antwortcode zu erhalten, müssen Sie die Rückgabeergebnisse des Threads verarbeiten. This SO Diskussion präsentiert mehrere Methoden, das zu tun.

Hier ist, wie Sie Ihren Code ändern würden Queue zu verwenden:

import urllib2 
import threading 
import Queue 


class MyHandler(urllib2.HTTPHandler): 
    def http_response(self, req, response): 
     return response 

que = Queue.Queue() 
o = urllib2.build_opener(MyHandler()) 
t = threading.Thread(target=lambda q, arg1: q.put(o.open(arg1)), args=(que, 'http://www.google.com/')) 
t.start() 
t.join() 
result = que.get() 
print result.code 

Der Code drucken 200.

+0

Ich musste nur die Antwort zurückgeben, aber jetzt kann ich nicht herausfinden, wie Sie den Antwortcode aus dem Thread bekommen. –

+0

@RickyWilson das, denke ich, passt nicht zu der gleichen Frage. Aber Sie können eine ausführliche Diskussion darüber finden, wie Sie mit Antworten aus dem Thread umgehen können: https://stackoverflow.com/questions/6893968/how-to-get-the-return-value-from-a-thread-in-python – MedAli

Verwandte Themen