Python 3.2.2で少し遊んでいて、リモートでデータにアクセスする簡単なWebサーバーを作成したい。このデータはPythonそのため、ファイルサーバーである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
Python3では、文字列はPython 2.x.とは異なるタイプです。
self.wfile.write(bytes("<html><head><title>Title goes here.</title></head>","utf-8")
または
self.wfile.write("<html><head><title>Title goes here.</title></head>".encode("utf-8"))
Python 3の場合、文字列リテラルの前にb
を付けます:
self.wfile.write(b"<foo>bar</foo>")
あなたのコード#commentsに基づいて、おそらくself.headers.getheaders( 'referer')を探しています。つまり:
if 'http://www.icamefromthissite.com/' in self.headers.getheaders('referer'):
do something
Python3.Xでこれを使用するだけです
self.wfile.write(bytes("<body><p>This is a test.</p>", "utf-8")