Return different content according to different requests
リクエストごとに異なるコンテンツを返す
前回のコードを少し簡略化します:
import socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('0.0.0.0', 8090))
server_socket. listen(128)
while True:
client_socket, client_addr = server_socket. accept()
data = client_socket.recv(1024).decode('utf8')
# レスポンスヘッダー
response_header = 'HTTP/1.1 200 OK ' + 'content-type: text/html '
response_header += ' '
# レスポンスボディ
response_body = 'hello world'
# レスポンス
response = response_header + response_body
# クライアントに送信
client_socket. send(response. encode('utf8'))
このコードを実行すると、レスポンスは hello world になります。ここで、リクエストに応じて異なるコンテンツを返すように実装します。これにより、ブラウザで /register や /login にアクセスすると、それぞれ異なるコンテンツを返せるようになります。
リクエストヘッダーの 1 行目からリクエストのパスを取得できます。ブラウザからのデータが空の場合があるため、ループ内に次のコードを追加します:
path = ''
if data: # # ブラウザから送信されるデータは空の場合がある
path = data.splitlines()[0].split(' ')[1]
print('リクエストされたパスは {}'.format(path))
ブラウザで localhost:8090/login にアクセスすると、コンソールにアクセスされたパスが出力されます:
次に、この情報を利用してパスごとに異なる response_body を返すようにします (このとき、ブラウザのデフォルトの読み取りエンコーディングは GBK であるため、コード側で調整が必要です):
if path == '/login':
response_body = 'ログインページへようこそ'
elif path == '/register':
response_body = '登録ページへようこそ'
elif path == '/':
response_body = 'ホームページへようこそ'
UTF-8 エンコーディングで返す場合は、レスポンスヘッダーの content-type:text/html を content-type:text/html;charset=utf8 に書き換えて、ブラウザに対応コンテンツのエンコーディング方式を通知するだけで済みます。
ブラウザで何もアクセスされていない場合でも、対応するレスポンスコンテンツを返す必要があります。分岐処理に次のブランチを追加します:
else:
# ページが見つかりません 404 ページが見つかりません
response_header = 'HTTP/1.1 404 Page Not Found '
response_body = '申し訳ございません。お探しのページは存在しません。'
ブラウザでアクセスすると、次のような結果になります:
オブジェクト指向によるサーバーのカプセル化
import socket
class MyServer(object):
def __init__(self, ip, port):
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.bind((ip, port))
self. socket. listen(128)
def run_forever(self):
while True:
client_socket, client_addr = self.socket.accept()
data = client_socket.recv(1024).decode('utf8')
path = ''
if data:
path = data.splitlines()[0].split(' ')[1]
response_header = 'HTTP/1.1 200 OK '
if path == '/login':
response_body = 'ログインページへようこそ'
elif path == '/register':
response_body = '登録ページへようこそ'
elif path == '/':
response_body = 'ホームページへようこそ'
else:
response_header = 'HTTP/1.1 404 Page Not Found '
response_body = '申し訳ございません。お探しのページは存在しません。'
response_header += 'content-type:text/html;charset=utf8 '
response_header += ' '
response = response_header + response_body
client_socket. send(response. encode('utf8'))
server = MyServer('0.0.0.0', 9090)
server. run_forever()
前回のコードを少し簡略化します:
import socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('0.0.0.0', 8090))
server_socket. listen(128)
while True:
client_socket, client_addr = server_socket. accept()
data = client_socket.recv(1024).decode('utf8')
# レスポンスヘッダー
response_header = 'HTTP/1.1 200 OK ' + 'content-type: text/html '
response_header += ' '
# レスポンスボディ
response_body = 'hello world'
# レスポンス
response = response_header + response_body
# クライアントに送信
client_socket. send(response. encode('utf8'))
このコードを実行すると、レスポンスは hello world になります。ここで、リクエストに応じて異なるコンテンツを返すように実装します。これにより、ブラウザで /register や /login にアクセスすると、それぞれ異なるコンテンツを返せるようになります。
リクエストヘッダーの 1 行目からリクエストのパスを取得できます。ブラウザからのデータが空の場合があるため、ループ内に次のコードを追加します:
path = ''
if data: # # ブラウザから送信されるデータは空の場合がある
path = data.splitlines()[0].split(' ')[1]
print('リクエストされたパスは {}'.format(path))
ブラウザで localhost:8090/login にアクセスすると、コンソールにアクセスされたパスが出力されます:
次に、この情報を利用してパスごとに異なる response_body を返すようにします (このとき、ブラウザのデフォルトの読み取りエンコーディングは GBK であるため、コード側で調整が必要です):
if path == '/login':
response_body = 'ログインページへようこそ'
elif path == '/register':
response_body = '登録ページへようこそ'
elif path == '/':
response_body = 'ホームページへようこそ'
UTF-8 エンコーディングで返す場合は、レスポンスヘッダーの content-type:text/html を content-type:text/html;charset=utf8 に書き換えて、ブラウザに対応コンテンツのエンコーディング方式を通知するだけで済みます。
ブラウザで何もアクセスされていない場合でも、対応するレスポンスコンテンツを返す必要があります。分岐処理に次のブランチを追加します:
else:
# ページが見つかりません 404 ページが見つかりません
response_header = 'HTTP/1.1 404 Page Not Found '
response_body = '申し訳ございません。お探しのページは存在しません。'
ブラウザでアクセスすると、次のような結果になります:
オブジェクト指向によるサーバーのカプセル化
import socket
class MyServer(object):
def __init__(self, ip, port):
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.bind((ip, port))
self. socket. listen(128)
def run_forever(self):
while True:
client_socket, client_addr = self.socket.accept()
data = client_socket.recv(1024).decode('utf8')
path = ''
if data:
path = data.splitlines()[0].split(' ')[1]
response_header = 'HTTP/1.1 200 OK '
if path == '/login':
response_body = 'ログインページへようこそ'
elif path == '/register':
response_body = '登録ページへようこそ'
elif path == '/':
response_body = 'ホームページへようこそ'
else:
response_header = 'HTTP/1.1 404 Page Not Found '
response_body = '申し訳ございません。お探しのページは存在しません。'
response_header += 'content-type:text/html;charset=utf8 '
response_header += ' '
response = response_header + response_body
client_socket. send(response. encode('utf8'))
server = MyServer('0.0.0.0', 9090)
server. run_forever()
Related Articles
-
A detailed explanation of Hadoop core architecture HDFS
Knowledge Base Team
-
What Does IOT Mean
Knowledge Base Team
-
6 Optional Technologies for Data Storage
Knowledge Base Team
-
What Is Blockchain Technology
Knowledge Base Team
Explore More Special Offers
-
Short Message Service(SMS) & Mail Service
50,000 email package starts as low as USD 1.99, 120 short messages start at only USD 1.00
