導入
純粋な手でラインおよびWebフレームワーク
Reviewソフトウェア開発フレームワーク:C / SB / sの
CSクライアント・サーバ・クライアント-------サーバー
BS ブラウザブラウザ-------サーバーサーバー
HTTPプロトコル:ハイパーテキスト転送プロトコルを提供するブラウザとサーバとの間のデータ転送フォーマット
HTTP 4つの特性
要求 - 応答に基づいて、
TCP /アプリケーションレイヤ上で動作するIPプロトコルに基づいて、2
3つのステートレス(ユーザーのブラウザ後の状態を保存し、セッションクッキーを持っていたことができません)
接続なし4(切断に応答して直ちに最初の要求の後、二つのリンク間の接続なし)
長い接続用WebSocket
HTTPリクエスト・データ・フォーマット: 最初の行(HTTPプロトコルバージョン識別子と要求モード)を要求 リクエストヘッダ(K、Vキーと値のペアの束) / R / (また、1つのラインの焦点である)、N- 一部感受性を運ぶリクエストボディを(例えば、パスワード)等の識別情報 :形式のHTTP応答データ 応答最初の行(識別されたプロトコルバージョンHTTPレスポンスステータスコード) レスポンスヘッダ内の(ロットK、Vキーと値のペア) / R&LT / N-(また、ラインフォーカスである) 体に応答して(ブラウザのページに返されたデータ)は、通常はレスポンスボディのHTMLインターフェイスです
補足応答ステータスコードは: 単純な数の文字列には、いくつかの複雑な状態やメッセージを表現するために 1XX:サーバーは、データが追加データの提出を続けることができます処理されている受信に成功した サーバーが正常な応答をしたい:2XXをデータ(リクエストが200成功しました) 3XX:リダイレクション(あなたはあなたを訪問する訪問後にログインする必要があるページでは、ウィンドウが自動的にログインページに転送されることがわかりますとき301 302 ) 4XX:リクエストエラー(何のリソース要求404が存在しない、要求が正当ではありません許可は403)ではないであろう内部規則を遵守していない (内部サーバーエラー:5XX 500 ) 補足要求方法 1つのに.get要求 、ブラウザウィンドウなどのリソース(のサービス側には、)www.baidu.comを入力 2 .post要求 端部に向かって送信されたデータサービスを(例えば、ユーザのログインとユーザー名とパスワードを送信するために) のURL:ユニフォームリソースロケータ(URLは方言です)
HTTP GETリクエスト形式
HTTPレスポンスの形式:
ピュアラインとWebフレームワークの手のバージョン
''' バージョン情報を要求するHTTPヘッダー行方法を求める b'GET / HTTP / 1.1 \ Rの\ n個 のキー値KV本体要求 ホスト:127.0.0.1:9527\r\n 接続:キープアライブ\ R&LT \ N- Cache-コントロール:MAX-年齢= 0 \ R&LT \ N- ....... \ R&LT \ N- ' リクエストボディ ....... ' '' インポートソケット たちの靴下 = socket.socket(はsocket.AF_INET、socket.SOCK_STREAM ) sock.bind((' 127.0.0.1 '、8000 )) sock.listen() 一方TRUE: コネティカット、ADDR = sock.accept() データ = conn.recv(8096 ) #ステータス行に応答して応答メッセージプラス conn.send(B "HTTP / 1.1 200 OK \ rをする\ n \ rをする\ n " ) conn.send(B " OK 」) はconn.close()
型変換のヒント
データ= B ' のHello World ' データ =のSTR(データ、エンコード= ' UTF-8 ' ) 、印刷(データ) データ =バイト(データ、エンコード= ' UTF-8 ' ) 、印刷(データ)
最後のユーザ入力パスサフィックスを分割することにより、
= conn.recvデータ(1024 ) のデータ = STR(データ、エンコード= ' UTF-8 ' ) #取得サフィックスコミットされたデータの取得 #の印刷(Data)を CURRENT_PATH = data.split(' \のR&LT \ N- ')[0] .split(' ')[1 ] 印刷(CURRENT_PATH)
そのため私たちはwsgirefモジュールをカプセル化するのに役立つ面倒すぎるので、いくつかの書き込みソケットモジュール
#のインポートモジュールの簡単なシンプル から wsgiref.simple_server インポートはmake_server DEF RUN(ENV、応答): #ENVは、要求に関連付けられたエンベロープである #1 に関連付けられている応答応答 を印刷(ENV) #彼は大きな辞書で 応答(「200 OKです」、[]) CURRENT_PATH = env.get(' PATH_INFO ')#取得サフィックス IF CURRENT_PATH == ' ログイン' : リターン [B ' ログイン' ] リターン [B「彼LLO赤ちゃん」 ] #クライアントが起動されるrunメソッドに接続されている IF __name__ == 「__main__ 」: サーバー =はmake_server(「127.0.0.1 」、8080 実行して、) #リアルタイム監視、一度顧客アドレス127.0.0.1 8080端末が自動的に接続され、実行呼び出し括弧 #自動実行がクラスのインスタンスオブジェクトのブラケットです!フラスコフラスコヒントを #の ホスト、ポート、アプリケーション、server_classは=てWSGIServer、たhandler_class = WSGIRequestHandler
異なるサフィックスがあまりにも私たちは多くの問題を判断するための時間を必要とする場合、我々は機能サフィックスと機能を入れたタプル元祖の辞書セットを書くことができるさまざまな機能が、機能を持つべきではないそこに機能を決定し、実行するループのために使用しています
= FUNCをなし 用 URL 内のURL: #現在はタプルURL内でないと判断し たIF URL [0] == CURRENT_PATH: #それは、対応する機能FUNCに割り当てられた名前の上に置くURLサフィックス一致した場合 、[1 FUNC = URLを] #回試合は、資源節約するために、リサイクルのためにすぐに終了する必要があります BREAK #1 !一致していない彼に判断を下すことを恐れ変数funcを IF FUNC: RESの =のFUNC(ENV)
他: RESの =のエラー(ENV) リターン [res.encode(" UTF-8 ")]の各機能を処理した後、あなたはエンコードする必要はありません。
wsgirefベースのモジュールと異なるファイルに分割した後は、
機能を追加し、コードを変更するにちょうど2つの場所で
1つのルーティング機能.urls.pyのURL = >>>のビューとの対応関係[(「/インデックス」、インデックス)]
2 .views.pyビュー機能
静的および動的なページ
静的なページの データは同じ年、死んで書かれている 動的なWebページの データが書き込まれていない死はへの動的アクセスで 次のような、 現在の時刻を取得する1.リアルタイムバックエンド「の配信を」フロントページ表示するには 2.バックエンドデータベースからデータを取得します" 合格「フロントページを表示するには 、フロントページに渡される >>> ページのレンダリング
htmlファイル内で記述されたテンプレート
派生:ファイルを読み込み、そこに格納されて代わる代替記号を使用して、クライアントに返さ
しかし、今、私たちは必要な辞書は、辞書によってHTMLの値の内側に配置することができますしたいJinja2のモジュールを
Jinja2のの PIP3はJinja2のインストール により、フラスコをJinja2ののフレームワークに依存しているので、フラスコフレームモジュールはまた、Jinja2のが付属してダウンロードし たテンプレートが含まれているレンダリングテンプレート構文 のhtmlファイル---テンプレートをテンプレート構文(Pythonの構文に近い) フロントエンドはまた、構文のいくつかのバックエンドを使用することができます着信データの後端の操作{} {} {} %%
<P> {{}}データ</ P> <P> {{データ[ ' ユーザ名' ]}} </ P> <P> {{データ}}みましょう。パスワード</ P> <P> {{data.get(' 趣味')}} </ P> {%ため user_dict で user_listの%} <TR> <TD> user_dict.id {{}} </ TD> <TD>{{user_dict.name}} </ TD> <TD> {{user_dict.password}} </ TD> </ TR> {%ENDFOR%}
Jinja2のインポートテンプレート デフGET_USER(ENV): user_dict = { ' ユーザ名':' ジェイソン'、' パスワード':' 123 '、' 趣味':[ ' 読み取り'、' ゲーム'、' 実行' ]} 開きます( R ' テンプレート/ 03 get_user.html '、' R '、エンコーディング= "8-UTF " )F AS: データ = 達し、f.read() TEMP = テンプレート(データ) RES = temp.render(データ= user_dict) #user_dictのフロントページは、変数名でフロントページに送信されたデータ・ディクショナリに取得することができます 復帰 RES
概要
1.ホモキラルラインとWebフレーム
1.手動で書かれたコードをそのソケット
2.手動データ処理HTTP
私たちはscoketとHTTPデータ対処するためwsgirefモジュールに基づいて、2
wsgirefモジュールを
使用すると、伝送にパックを助けるために1 httpリクエストデータ辞書を解析する際には、あなたのデータの簡単な操作を与える
時間応答データを取る2.して、自動的にあなたを助けますhttpプロトコルの形式と一貫性のある方法としてパッケージ化して、フロントに戻っ
3.パッケージルーティングおよび表示機能だけでなく、フォルダ内のすべてのサイトテンプレートで使用するHTMLファイルビュー機能ファイル間のすべての通信
1.urls.pyのルーティングおよび表示機能対応関係
2.views.pyビュー機能(だけでなく、ビュー機能を指す機能クラスであってもよい)
テンプレートフォルダを3.templates
4. Jinja2のに基づいて、テンプレートのレンダリング達成
テンプレートをレンダリングする
フロントページを使用するには、何らかの方法で良いバックエンドのデータ転送を生成することを(前ページの上にバックエンドのデータ伝送を使用するために迅速かつ容易にテンプレート構文に基づきます)