以前は Django を使って小さなサイトを構築していましたが、Django は面倒だと感じたので、軽量の Web フレームワークに切り替えて遊んでみようと思いました。 Web.py の作者が亡くなり、プロジェクトは長い間更新されていないため、私はそれを使用するつもりはありません。 Flask は成熟した軽量 Web フレームワークでもあり、github には多くのスターとフォークがあり、ドキュメントや拡張機能も非常に充実しています。
フレームワークを学ぶ最良の方法は、フレームワークを使用してプロジェクトを実行し、実際の戦闘でフレームワークを理解し、習得することです。ここでは、Flask フレームワークと Mysql データベースを使用してフォーラム システムを構築します。スズメは小さいですが、すべての臓器を備えています。 フォーラムのレンダリングは次のとおりです:
フォーラム システムのスクリーンショット
以下は、フォーラムの基本機能です:
完全なユーザー モジュール (登録、ログイン) 、変更、パスワードの取得、情報変更、サイトメッセージ通知) 豊富なフォーラムモジュール (作成、トピックへの返信、サイト検索、マークダウンサポート、@ユーザーリマインダー); 強力なバックグラウンド管理、ユーザー、トピック、コメント、およびサポートのブロックをサポートします。さまざまな条件でトピックやコメントを検索できます。
このブログでは、Web 開発を始めたばかりの学生に役立つことを願って、フォーラム システムの構築プロセスを記録する一連の記事を使用します。
Django や Flask などの Python の Web フレームワークについてよく聞きますが、フレームワークとは正確には何ですか? Web フレームワークと Web サーバー (Nginx、Apache など) の違いは何ですか?フレームワークなしで Web サイトを構築できますか? これらの質問を解決するには、Web サーバーの動作原理と Web フレームワークの性質を理解する必要があります。
Web サーバー
ブラウザに URL を入力すると、ブラウザはまず DNS サーバーに要求して、要求されたサイトの IP アドレスを取得します。次に、IP を使用して HTTP リクエストをホストに送信し、レンダリング後にサーバーから HTTP レスポンスを受信すると、ブラウザはより良い効果でそれを表示します。このプロセスにおいて、舞台裏で静かに貢献するのは Web サーバーです。
簡単に言えば、Web サーバーは物理サーバー上で実行されるプログラムであり、クライアント (主に Chrome や Firefox などのブラウザ) がリクエストを送信するのを待ちます。リクエストを受信すると、対応するレスポンスを生成してクライアントに返します。 Web サーバーは HTTP プロトコルを通じてクライアントと通信するため、HTTP サーバーとも呼ばれます。
Webサーバー
Webサーバーの動作原理は複雑ではなく、通常、接続の確立、要求プロセス、応答プロセス、接続の終了の4つのステップに分けることができます。
接続の確立: クライアントは、TCP/IP プロトコルを通じてサーバーへの TCP 接続を確立します。 要求プロセス: クライアントは、HTTP プロトコル要求パケットをサーバーに送信して、サーバー内のリソース ドキュメントを要求します。 応答プロセス: サーバーは、HTTP プロトコル応答パケットをクライアントに送信します。要求されたリソースに動的言語コンテンツが含まれている場合、サーバーは動的言語解釈エンジンを呼び出して「動的コンテンツ」を処理し、処理されたデータをクライアントに返します。 HTML ドキュメントはクライアントによって解釈され、グラフィック結果がクライアント画面に表示されます。 接続を閉じる: クライアントはサーバーから切断されます。
次に、単純な Web サーバーを実装します。サンプルプログラムを実行するとローカルポート 8000 をリッスンし、ブラウザで http://www.php.cn/:8000 にアクセスすると応答内容を確認できます。また、私たちのプログラムは、以下に示すように、クライアントによって送信されたリクエストの内容を出力することもできます:
Simple Web Server
ここでのリクエストとレスポンスは両方とも HTTP プロトコルに準拠する必要があります。HTTP プロトコルの詳細については、こちらをご覧ください。 、「HTTP の決定版ガイド」を読むか、私がまとめた HTTP コンテンツを読むことができます。
Web サーバーの主な仕事はリクエストに基づいて応答を返すことですが、次のような考慮すべき要素が多すぎるため、実際の Web サーバーは上記の例よりもはるかに複雑です。
キャッシュ メカニズム: トーク応答速度を向上させるために、頻繁にアクセスされる一部のページがキャッシュされます。 セキュリティ: SYN フラッド攻撃など、ハッカーによるさまざまな攻撃を防ぎます。 同時処理: 異なるクライアントによって同時に開始されたリクエストに応答する方法。 , これにより、いくつかのことを便利に分析できるようになります。
現在、UNIX および LINUX プラットフォームで最も広く使用されている無料の Web サーバーは、Apache と Nginx です。
ウェブアプリケーション
Web サーバーは HTTP リクエストを受け入れ、レスポンスを返します。多くの場合、レスポンスは静的ファイルではないため、アプリケーションはリクエストに基づいて対応するレスポンスを生成する必要があります。ここでのアプリケーションは主に、関連するビジネス ロジックを処理し、データベースを読み取りまたは更新し、さまざまなリクエストに従って対応する応答を返すために使用されます。これを行うのは Web サーバー自体ではないことに注意してください。これは、HTTP プロトコル レベルと、同時処理、セキュリティ、ログなどの一部の関連事項のみを担当します。
このアプリケーションはさまざまな言語 (Java、PHP、Python、Ruby など) で作成できます。このアプリケーションは、Web サーバーからクライアントのリクエストを受け取り、処理が完了した後、レスポンスを返します。 Web サーバーに送信され、最終的に Web サーバーがクライアントにそれを返します。全体のアーキテクチャは次のとおりです:
Web アプリケーション
Python を例に挙げると、Python を使用して Web を開発する最も独創的で直接的な方法は、1998 年に非常に普及した CGI 標準を使用することです。 。まず、Web サーバーが CGI をサポートし、CGI ハンドラーが設定されていることを確認してから、CGI ディレクトリを設定し、対応する Python ファイルをディレクトリに追加します。次に示すように、各 Python ファイルは対応する入力を処理して HTML ファイルを生成します。例:
# !/usr/bin/python # -*- coding: UTF-8 -*- print "Content-type:text/html" print # 空行,告诉服务器结束头部 print '<html>' print '<head>' print '<meta charset="utf-8">' print '</head>' print '<body>' print '<h2>Hello Word! 我是一个CGI程序</h2>' print '</body>' print '</html>'
このようにして、ブラウザでファイルにアクセスすることで、単純な Hello World Web ページのコンテンツを取得できます。 CGI を介して Web アプリケーションを直接作成することは簡単に思えます。各ファイルが入力を処理し、HTML を生成します。しかし、実際に開発を行ってみると、様々な不都合に遭遇する可能性があります。例:
各独立した CGI スクリプトは、データベース接続と終了コードを繰り返し記述する可能性があり、バックエンド開発者には、Web フレームワークに関係のない Content-Type などの多数の HTML ページ要素が表示されます。開発 その後、サイトでは重複を減らし、複雑でわかりにくいコードの作成を避けるために、Web 開発の主要なプロセスを抽出し、さまざまな Web フレームワークを開発しました。フレームワークを使用すると、データベース接続などの繰り返しの作業を心配することなく、明確で保守しやすいコードの作成に集中できます。
より古典的な Web フレームワークの 1 つは、以下の図に示すように、MVC アーキテクチャを採用しています。MVC アーキテクチャ
ユーザーが URL を入力し、クライアントがリクエストを送信し、コントローラー (コントローラー)まず request を取得し、次にモデル (Model) を使用してデータベースから必要なデータをすべて取得し、必要な処理を実行し、処理された結果をビュー (View) に送信します。ビューは取得したデータを使用してレンダリングと生成を行います。 HTML 応答を作成してクライアントに返します。
Python Web フレームワーク flask を例に挙げます。フレームワーク自体は、アプリケーションの編成に使用するアーキテクチャを制限しませんが、flask は MVC 方式でのアプリケーションの編成を十分にサポートできます。 コントローラー: flask 次のように、デコレーターを使用してルーティング項目を追加できます:@app.route('/') def main_page(): pass
@app.route('/') def main_page(): """Searches the database for entries, then displays them.""" db = get_db() cur = db.execute('select * from entries order by id desc') entries = cur.fetchall() return render_template('index.html', entries=entries)
{% for entry in entries %} <li> <h2>{{ entry.title }}</h2> <p>{{ entry.text|safe }}</p> </li> {% else %} <li><em>No entries yet. Add some!</em></li> {% endfor %}
Python の Web サーバーと Web サイト構築のための Web フレームワークに関連するその他の記事については、PHP 中国語 Web サイトに注目してください。