Python アドバンスト シリーズ チュートリアル: HTTP プロトコルと静的 Web サーバーの開発

学習目標

1. HTTP プロトコルの基本概念を理解する

2. HTTPリクエストメッセージとレスポンスメッセージを使いこなす

3. 開発者ツールを使用して HTTP プロトコルの通信プロセスを表示する方法を学びます

4. Python に付属する静的 Web サーバーを構築する

5. Python 静的 Web サーバー開発をマスターする

1. HTTPプロトコルの概要

1. ウェブサイトのURL

URLはURLとも呼ばれ、URLの英語のフルスペルは(Uniform Resoure Locator)、Uniform Resource Locatorを意味し、ネットワークリソースのアドレスという理解が一般的です。URLアドレス:https://www.itcast.com/18/1122/10/E178J2O4000189FH.html

2. URLの構成

3.HTTPプロトコル

☆シーンインポート

まずシナリオを見てみましょう。

ブラウザとWebサーバー間の通信プロセスにおいて、そのデータ形式にルールはありますか?また、任意に設定できるのでしょうか?回答: いいえ、ブラウザと Web サーバー間の通信では、HTTP プロトコルを使用して、ブラウザと Web サーバー間で通信されるデータの形式を指定する必要があります。

☆HTTPプロトコルとは何ですか?

HTTP プロトコルの正式名は (HyperText Transfer Protocol) で、翻訳するとハイパーテキスト転送プロトコルになります。ハイパーテキストとは、テキストデータをベースにした非テキストデータのことを指します。非テキストデータには、写真、音楽、ビデオなどが含まれ、これらの非テキストデータをリンクを使用して読み込んで表示します。一般に、ハイパーテキストはリンクを指します。次の図に示すように、テキスト データは、通常 Web ページ データと呼ばれるものでもあります。

☆HTTPプロトコルの概念と機能

HTTP プロトコルの作成者は Tim Berners-Lee で、1991 年に設計されました。HTTP プロトコルは Web ページ データを送信するために設計されましたが、現在ではあらゆる種類のデータの送信が可能になっています。HTTP プロトコル形式でのデータの送信は、TCP の送信プロトコルに基づいており、データを送信する前に接続を確立する必要があります。TCP 伝送プロトコルはネットワーク内で伝送されるデータのセキュリティを確保するために使用され、HTTP プロトコルはこれらのデータの特定の形式を指定するために使用されます。

注: HTTP プロトコルで規定されているデータ形式は、ブラウザと Web サーバー間の通信データの形式であり、ブラウザと Web サーバー間の通信には HTTP プロトコルが必要です。

☆ブラウザがWebサーバーにアクセスする過程

2、HTTPリクエストメッセージとレスポンスメッセージ

1.HTTPリクエストメッセージ

最も一般的な HTTP リクエスト メッセージは 2 つあります。 ① GET リクエスト メッセージ ② POST リクエスト メッセージ GET: Web サーバーのデータを取得 POST: Web サーバーにデータを送信

2. GETリクエストメッセージのフォーマット

 
 
 
 

---- リクエストライン ----
GET /wp-content/uploads/2020/12/zm.svg HTTP/1.1 # GET リクエストメソッド リクエストリソースパス HTTPプロトコルバージョン
---- リクエストヘッダ -----
ホスト: www.itcast.cn # サーバーのホスト アドレスとポート番号。デフォルトは 80 です。
Connection: keep-alive # サーバーとの接続を長時間維持します。
Upgrade-Insecure-Requests: 1 # ブラウザーに安全でないリクエストをアップグレードさせます。 https を使用して
ユーザー エージェントをリクエストします。 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML、Gecko など) Chrome/69.0.3497.100 Safari/537.36 # ユーザー エージェント (クライアントの名前) 受け入れます: text/html,application/
xhtml +xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 # 許容可能なデータ型 Accept-Encoding: gzip, deflate # 許容可能な圧縮形式 Accept-言語
:
zh -CN,zh;q=0.9 #使用可能な言語
Cookie: pgv_pvi=1246921728; #ログインユーザーの識別
---- 空行 ----

3. GETリクエストメッセージの解析

 
 
 
 

GET / HTTP/1.1\r\n

ホスト: www.itcast.cn\r\n
接続: キープアライブ\r\n
安全でないアップグレード要求: 1\r\n
ユーザー エージェント: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML、Gecko など) Chrome/69.0.3497.100 Safari/537.36\r\n
受け入れる: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp ,image/apng,*/*;q=0.8\r\n
受け入れエンコーディング: gzip、deflate\r\n
受け入れ言語: zh-CN,zh;q=0.9\r\n
Cookie: pgv_pvi=1246921728; \r\n

\r\n (リクエストヘッダ情報の後に省略できない'\r\n'が別途あります) => 空行

注: データの各項目の間に \r\n を使用します。HTTP リクエストでは、各オプションの終了後にラベル \r\n (行の終わりを表す) をその後ろに追加する必要があります

Windows システムでは、改行は \n を使用して実装されます。ただし、Linux および Unix システムでは、\r\n を使用して改行を実装する必要があります。

4. POSTリクエストのメッセージフォーマット

 
 
 
 

---- リクエスト行 ----
POST /xmweb?host=mail.itcast.cn&_t=1542884567319 HTTP/1.1 # POST リクエストメソッド リクエストリソースパス HTTP プロトコルバージョン
---- リクエストヘッダ ----
ホスト: メール。 itcast.cn # サーバーのホスト アドレスとポート番号、デフォルトは 80
Connection: keep-alive # サーバーとの接続を長時間維持します
Content-Type: application/x-www-form-urlencoded # 要求された内容をサーバーに伝えますデータ型
ユーザーエージェント: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML、Gecko など) Chrome/69.0.3497.100 Safari/537.36 # クライアントの名前 ---- 空行 ----
-- --
リクエスト本文 ----
username=hello&pass=hello # リクエストパラメータ

5. POSTリクエストメッセージの解析

 
 
 
 

POST /xmweb?host=mail.itcast.cn&_t=1542884567319 HTTP/1.1\r\n
ホスト: mail.itcast.cn\r\n
接続: キープアライブ\r\n
コンテンツ タイプ: application/x-www- form-urlencoded\r\n
ユーザー エージェント: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML、Gecko など) Chrome/69.0.3497.100 Safari/537.36\r\n \r\n(
requestヘッダー情報の後には '\r\n' が 1 つありますが、これは省略できません)
username=hello&pass=hello

注: 各データの間に \r\n を使用して終了します

6. GET および POST リクエスト メッセージの概要

① HTTP リクエストメッセージは、リクエストライン、リクエストヘッダ、空行、リクエストボディの 4 つの部分で構成されます。

② リクエスト行は、リクエストメソッド、リクエストリソースパス、HTTPプロトコルバージョン(1.1または2.0)の3つの部分で構成されます。

③ GET モードのリクエストメッセージにはリクエストボディがなく、リクエスト行、リクエストヘッダー、空行のみが含まれます。

④ POST リクエストメッセージは、リクエストライン、リクエストヘッダ、空行、リクエストボディの 4 つの部分で構成されます。注: POST メソッドではリクエスト本文を許可できませんが、この形式はまれです。

7. HTTP 応答メッセージの分析 (強調)

 
 
 
 

--- レスポンス行/ステータス行 ---
HTTP/1.1 200 OK # HTTP プロトコルのバージョン ステータスコード ステータスの説明
--- レスポンスヘッダ ---
Server: Tengine # サーバー名
Content-Type: text/html; charset=UTF- 8 # コンテンツタイプ (応答データタイプ、画像/png)
接続: keep-alive # クライアントとの接続を長時間維持する
日付: Fri, 23 Nov 2018 02:01:05 GMT # サーバーの応答時間
---空白行- --
-- レスポンスボディ ---
<!DOCTYPE html><html lang="ja"> …</html> # クライアント(htmlページ)のデータを応答

応答ヘッダー情報は主に、ブラウザーのクライアントに、返されるデータの処理方法を指示します。

8. HTTP レスポンスのステータスコード

Web サーバーの応答ステータスを示すために使用される 3 桁のコードです。

ステータスコード

説明する

200

サーバーはリクエストを正常に処理しました

400

不正なリクエストです。リクエストのアドレスまたはパラメータが間違っています。

404

要求されたリソースはサーバー上に存在しません

500 (サーバー側例外)

サーバーの内部ソースコードでエラーが発生しました

3. HTTPプロトコルの通信プロセスを表示する

1. Google Chrome 開発者ツール

Google Chrome ブラウザをインストールし、Windows および Linux プラットフォームで F12 または Ctrl+Shift+I を押して開発者ツールを表示します。Mac で「表示 -> 開発者 ->」開発者ツールを選択するか、alt+command+ のショートカット キーを直接使用します。 i 、もう 1 つのマルチプラットフォーム共通操作は、Web ページを右クリックしてチェックを選択することです。

ヒント: 開発者ツールは、Web ページのレイアウトを表示したり、JS コードをデバッグしたりするための強力なツールでもあります。

2. HTTPプロトコルの通信処理

 

注: ブラウザとサーバー間のすべてのデータ通信は、リクエストと応答のペアで発生し、各リクエストと応答は HTTP プロトコルの形式に準拠している必要があります。

3. Google Chrome 開発者ツールの使用

ステップ 1: 各タブの機能を理解する

ステップ 2: ネットワークを使用して HTTP リクエストを送信する

 

ステップ 3: HTTP プロトコルの通信プロセスのリクエスト ヘッダーとリクエスト ヘッダー情報を表示する

レスポンスヘッダー、レスポンスボディ情報

4. まとめ

Google Chrome のデベロッパー ツールは、http プロトコルの通信プロセスを表示するための強力なツールです。[ネットワーク] タブのオプションを使用して、各リクエストとレスポンスの通信プロセスを表示できます。デベロッパー ツールを呼び出す一般的な方法は、次のとおりです。 Web ページをクリックしてチェックを選択します。ヘッダー オプションは 3 つの部分で構成されます。

① 一般:主な情報

② Response Headers: レスポンスヘッダ

③ リクエスト ヘッダー: リクエスト ヘッダーの応答オプションは、応答本文の情報を表示します。

4. Python に付属する静的 Web サーバーを構築する

1. 静的 Web サーバーとは何ですか

静的ドキュメント (html/css/js/pictures/audio/video) を要求元のブラウザーに提供できるプログラム。通常、Baidu のニュース データを閲覧するとき、ニュース データは毎日変更されるため、アクセスするページは動的ですが、開発するものは静的であり、毎日独自の静的 Web サーバーにアクセスします。ページ上のデータは変化しません。変更します。

2. Python に付属する静的 Web サーバーを構築する

Linuxの作成方法:

Windowsの作成方法:

① フォルダーを作成し、すべてのリソース ファイルをこのフォルダーに置きます

② DOS ウィンドウで cd コマンドを使用して、このディレクトリに切り替えます。

③ python -m コマンドを使用して静的 Web サーバーを作成します

 
 
 
 

python -m http.server 9000

-m は、パッケージ内のモジュールを実行することを意味します。このコマンドを実行するときは、静的ファイルを指定するディレクトリに入る必要があります。その後、ブラウザを通じて対応する HTML ファイルにアクセスできるため、静的 Web サーバーが設定されます上。

④ Web 静的サーバーにアクセスします。

HTTP 通信プロセスを表示します。

3. まとめ

静的 Web サーバーは、リクエストを送信するブラウザーに静的ドキュメントを提供するプログラムです。Python に付属する Web サーバーを構築するには、コマンド python –m http.server ポート番号を使用します。ポート番号が指定されていない場合、デフォルトは8000です

強調!: 応答本文に含まれるデータがブラウザに送信され、ブラウザはレンダリング後に特定のページを生成します。

5. Python を使用して独自の Web サーバーを開発する

Webサーバー = TCPサーバー(7ステップ) + HTTPプロトコル(リクエスト、レスポンス)

1. 開発手順

2.固定ページのデータを返却する

importソケット


if __name__ == '__main__':
# 1. ソケットを作成します
tcp_server_socket =ソケット.socket(socket.AF_INET,ソケット.SOCK_STREAM)
tcp_server_socket.setsockopt(socket.SOL_SOCKET,ソケット.SO_REUSEADDR, True)
# 2.IPとポートをバインドします
tcp_server_socket.bind(("", 8080)) # 3. True のときにtcp_server_socket.listen(128)
のリスニングをセットアップします。 # 4. 接続を確立しますclient_socket, client_addr = tcp_server_socket.accept() client_request_data = client_socket.recv(1024).decode () print(client_request_data) with open("html/index.html", "rb") as f: file_data = f.read() # 応答行response_line = "HTTP/1.1 200 OK\r\n" # 応答ヘッダー応答ヘッダー = "サーバー:pwb\r\n"















# レスポンスボディ
response_body = file_data

# レスポンスデータ
response_data = (response_line + response_header + "\r\n").encode() + response_body

# 5. データの送信
client_socket.send(response_data)
# 6. クライアントソケット接続 client_socket を閉じます
。近い()

3. 指定したページのデータを返す

分析手順: ① ユーザーが要求したリソースのパスを取得します。

② 要求されたリソースのパスに従い、指定されたファイルのデータを読み込みます

③指定されたファイルデータの応答メッセージを組み立ててブラウザに送信

④ 要求されたファイルがサーバー上に存在しないことを確認し、404 ステータス応答メッセージを組み立ててブラウザに送信し、ユーザーが要求したリソースのパスを取得します。

 
 
 
 

request_list = client_request_data.split(" ", maxsplit=2)
request_path = request_list[1] # /gdp.html
if request_path == "/":
# ユーザーがリソース パスを指定しない場合、デフォルトでアクセスされるデータはホームページのデータ
request_path = "/index.html"

指定されたページのデータを取得します。

 
 
 
 

# 指定されたファイル データを読み取る
# rb を使用する理由は、ブラウザーが
open("html/" + request_path, "rb") をファイルとして含む画像も要求する場合があるためです。
# ファイル データを読み取る
file_data = file.read()

指定されたページ データの応答メッセージを組み立てます。

 
 
 
 

# 応答行
response_line = "HTTP/1.1 200 OK\r\n"
# 応答ヘッダ
response_header = "Server: PWS1.0\r\nContent-Type: text/html;charset=utf-8\r\n" #
応答ボディ
response_body = file_data
# 応答メッセージのデータを連結します
response_data = (response_line + response_header + "\r\n").encode("utf-8") + response_body #
応答メッセージのデータを送信
client_socket.send(response_data)
client_socket.close ()

404 ページ データの応答メッセージを組み立てます。

 
 
 
 

try:
# 指定されたファイルを開きます。コードは省略されます...
例外として e:
response_line = 'HTTP/1.1 404 Not Found\r\n'
response_header = 'Server: PWS1.0\r\nContent-Type: text /html; charset=utf-8\r\n'
response_body = '<h1>アクセスしている Web ページはもう存在しません</h1>'.encode('utf-8')
response_data = (response_line + response_header + ' \r\n').encode('utf-8') + response_body
# 404 応答メッセージ データを送信
client_socket.send(response_data)
else:
# 指定されたページの応答メッセージ データを送信します。コードは省略されます...
最後に:
client_socket .close()

6. FastAPI フレームワーク

学習目標

  • FastAPIとは何かを知ることができる

  • FastAPIのインストール方法を知ることができる

  • FastAPIの基本的な使い方をマスターできる

  • FastAPIを使いこなして指定した複数のWebページにアクセスできるようにする


1. FastAPIとは

FastAPI は、最新の高速 (高パフォーマンス) Python Web フレームワークであり、標準の Python タイプ ヒントに基づいて、Python3.6 以降を使用して API を構築するための Web フレームワークです。

FastAPI は、簡単に言うと、Web 開発に必要なコードをすべて簡素化するもので、マルチタスクやルーティング デコレータなどのさまざまな複雑なコードを自分で実装する必要はなく、FastAPI が提供する関数を呼び出すだけで済みます。 . これまで多くの複雑なコードを必要としていた機能を実現できます。

FastAPIの特徴

  • 高速パフォーマンス: NodeJS や Go に匹敵する高いパフォーマンス

  • 迅速な開発: 機能の開発が約 200% ~ 300% 高速化されます。

  • バグの減少:

  • バグの減少: 開発者が引き起こす傾向にあるエラーの 40% を削減します。

  • 直感的: 完璧な編集サポート

  • シンプル: 使いやすく、学びやすく、ドキュメントを読む時間が短縮されます。

  • 簡潔なコード: コードの重複を大幅に削減します。各パラメータで複数の関数を宣言してバグの発生を減らすことができます。

  • 標準化: API ベースで完全な互換性のある開発標準: OpenAPI (旧名 Swagger) および JSON スキーマ

環境を構築する

  • Python環境:Python 3.6以降

fastapi インストール

☆取り付け方法1:

  • fastapiをインストールする

  • pip インストール fastapi

  • 運用に使用する場合は、Uvicorn や Hypercorn などの ASGI サーバーも必要になります。

  • pip インストール uvicorn

☆インストール方法 2: 1) [ファイル] -> [設定] を選択します。

2) 対応するプロジェクトのプロジェクト インタープリターを選択します -> pygame を選択します (pygame と入力して検索すると時間を節約できます) -> パッケージのインストール ボタン -> プロジェクトが pygame パッケージをインストールするのを待ちます (数分から 10 分かかる場合があります)分) -> return if pygame パッケージ情報があれば、プロジェクトの設定が成功したことを意味します

2. FastAPIの基本的な使い方

機能要件:

  • サーバーを構築する

  • HTMLページを返す

基本的な手順:

  1. インポートモジュール

  2. FastAPI フレームワーク オブジェクトの作成

  3. @app ルーティング デコレーターを介してデータを送受信する

  4. サーバーを実行する

コード:

 
 
 
 

# fastapi から FastAPI モジュールをインポート
import FastAPI
# 応答メッセージをインポート
fastapi からの応答モジュール import Response
# サーバーをインポート uvicorn module
import uvicorn

# FastAPI フレームワーク オブジェクトを作成
app = FastAPI()


# @app ルーティング デコレータを介してデータを送受信
# @app.get (パラメータ) : getメソッドに従ってリクエストデータを受け入れる
# リクエストされたリソースのURLパス
@app.get("/index.html")
def main():
with open("source/html/index.html" ) as f:
data = f.read()
# return 応答データを返す
# Response(content=data, media_type="text/html"
# パラメータ 1: 応答データ
# パラメータ 2: データ形式
return Response(content=data, media_type ="text/html ")


# サーバーの実行
# パラメータ 1: フレームワーク オブジェクト
# パラメータ 2: IP アドレス
# パラメータ 3: ポート番号
uvicorn.run(アプリ、ホスト = "127.0.0.1"、ポート = 8000)

3. FastAPI を介して指定された複数の Web ページにアクセスする

  • ルート デコレータの役割:

  • 実際、ルート デコレータを使用すると、Web ページを関数に対応させることができ、指定された Web ページにアクセスできます。

 
 
 
 

# fastapi から FastAPI モジュールをインポート
import FastAPI
# 応答メッセージをインポート
fastapi からの応答モジュール import Response
# サーバーをインポート uvicorn module
import uvicorn

# FastAPI フレームワーク オブジェクトを作成
app = FastAPI()


# @app ルーティング デコレータを介してデータを送受信
# @app.get (パラメータ) : getメソッドに従ってリクエストデータを受け入れる
# リクエストされたリソースのURLパス
@app.get("/index1.html")
def main():
with open("source/html/index1.html" ) as f:
data = f.read()
# return 応答データを返す
# Response(content=data, media_type="text/html"
# パラメータ 1: 応答データ
# パラメータ 2: データ形式
return Response(content=data, media_type ="text/html ")


@app.get("/index2.html")
def main():
with open("source/html/index2.html") as f:
data = f.read()
# return 応答データを返す
# Response(content=data, media_type="text/html"
# パラメータ 1: 応答データ
# パラメータ 2: データ形式
return Response(content=data, media_type="text/ html")


# 実行サーバー
# パラメータ 1: フレーム オブジェクト
# パラメータ 2: IP アドレス
# パラメータ 3: ポート番号
uvicorn.run(app, host="127.0.0.1", port=8000)

4. まとめ

  • 基本的な手順:

  • インポートモジュール

  • FastAPI フレームワーク オブジェクトの作成

  • @app ルーティング デコレーターを介してデータを送受信する

  • サーバーを実行する

おすすめ

転載: blog.csdn.net/Blue92120/article/details/131223545