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()

Related Articles

Explore More Special Offers

  1. 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

phone お問い合わせ
Hi, I'm Alibaba Cloud AI Assistant!
I can help with questions and solutions.