2011-10-04 7 views
24

के साथ प्रतिक्रिया प्रतिक्रिया निकाय मैं पाइथन 3.2.2 के साथ थोड़ा सा खेल रहा हूं और कुछ डेटा दूरस्थ रूप से एक्सेस करने के लिए एक सरल वेब सर्वर लिखना चाहता हूं। यह डेटा पायथन द्वारा जेनरेट किया जाएगा, इसलिए मैं SimpleHTTPRequestHandler का उपयोग नहीं करना चाहता क्योंकि यह एक फ़ाइल सर्वर है, लेकिन मेरा खुद का एक हैंडलर है।बेसएचटीटीपीआरएस्टहैंडलर

मैंने इंटरनेट से कुछ उदाहरण कॉपी किया लेकिन मैं अटक गया क्योंकि प्रतिक्रिया आउटपुट स्ट्रीम शरीर सामग्री लिखने से इंकार कर देता है।

import http.server 
import socketserver 

PORT = 8000 

class MyHandler(http.server.BaseHTTPRequestHandler): 
    def do_HEAD(self): 
     self.send_response(200) 
     self.send_header("Content-type", "text/html") 
     self.end_headers() 
    def do_GET(self): 
     self.send_response(200) 
     self.send_header("Content-type", "text/html") 
     self.end_headers() 
     print(self.wfile) 
     self.wfile.write("<html><head><title>Title goes here.</title></head>") 
     self.wfile.write("<body><p>This is a test.</p>") 
     # If someone went to "http://something.somewhere.net/foo/bar/", 
     # then s.path equals "/foo/bar/". 
     self.wfile.write("<p>You accessed path: %s</p>" % self.path) 
     self.wfile.write("</body></html>") 
     self.wfile.close() 

try: 
    server = http.server.HTTPServer(('localhost', PORT), MyHandler) 
    print('Started http server') 
    server.serve_forever() 
except KeyboardInterrupt: 
    print('^C received, shutting down server') 
    server.socket.close() 

क्या प्रतिक्रिया शरीर लिखने के लिए एक सही कोड होना चाहिए:

यह मेरा कोड है?

बहुत बहुत धन्यवाद।

संपादित करें:

त्रुटि है:

... 
    File "server.py", line 16, in do_GET 
    self.wfile.write("<html><head><title>Title goes here.</title></head>") 
    File "C:\Python32\lib\socket.py", line 297, in write 
    return self._sock.send(b) 
TypeError: 'str' does not support the buffer interface 
+0

में इस का उपयोग मैं मानता हूं मैं अजगर में मूल बातें :) की जरूरत नहीं है तो मैं कर रहा हूँ एक छोटे से यह पता लगाने की उन्हें कैसे बदलने के लिए प्रकार और उपकरणों के साथ काम करने की कोशिश खो दिया ... – helios

+0

यह कोड आपके कोड में कहां है? self.wfile.write (prueba) – spicavigo

+0

ओह, मुझे खेद है। यह एक और परीक्षण (prueba = परीक्षण) से ट्रेस है। मैं इसे ठीक कर दूंगा। – helios

उत्तर

26

python3 स्ट्रिंग में अजगर 2. x में से एक अलग प्रकार का है बाइट्स में कास्ट का उपयोग कर या तो

bytes(s, "utf-8") 

या

s.encode("utf-8") 
+0

ग्रेट। अब मुझे लगता है कि अगर "प्रिंटराइटर" (हाँ, मैं जावा प्रोग्रामर हूं) में आउटपुटस्ट्रीम लपेटने का कोई तरीका है, तो हेहे। आइए कुछ ढूंढें (या बस एक साधारण रूपांतरण फ़ंक्शन को परिभाषित करें) – helios

+3

मैंने पायथन 3 के लिए .encode() स्ट्रिंग रूपांतरण के साथ प्रयास किया लेकिन अभी भी एक त्रुटि है। आपको अंतिम पंक्ति को हटाना होगा: self.wfile.close() क्योंकि do_GET बंद हो जाएगा और स्ट्रीम को स्वयं ही फ्लश करेगा। –

2

अपने कोड #comments आप शायद self.headers.getheaders लिए देख रहे हैं ('रेफ़रर'), यानी के आधार पर:

if 'http://www.icamefromthissite.com/' in self.headers.getheaders('referer'): 
    do something 
+1

अच्छा, वास्तव में नहीं। मैं केवल प्रतिक्रिया के आउटपुट प्रोग्रामेटिक रूप से नियंत्रित करना चाहता था। अनुमोदित उत्तर मुझे चाहिए। बाइट्स को प्रतिक्रिया में भेजने के लिए तारों को बाइट्स में एन्कोड करने के लिए। फिर भी धन्यवाद! – helios

3

अजगर 3 के लिए, एक b के साथ स्ट्रिंग शाब्दिक उपसर्ग:

self.wfile.write(b"<foo>bar</foo>") 
+0

यह सबसे साफ समाधान है, अच्छा! क्या आप पुष्टि कर सकते हैं कि यह utf-8 को एन्कोड करने के लिए डिफ़ॉल्ट है? –

0

बस python3.X

self.wfile.write(bytes("<body><p>This is a test.</p>", "utf-8")