Pythonコアプログラミングノート--Webプログラミング:CGIとWSDi(一)

5938 ワード

文書ディレクトリ
  • Webサーバによるクライアントデータの処理を支援する
  • CGI概要
  • CGIアプリケーション
  • cgiモジュール
  • cgitbモジュール
  • CGIアプリケーションの構築
  • 静的フォームページ
  • ダイナミックフォームページ
  • 完全にインタラクティブなテキストサイト
  • Webサーバによるクライアントデータの処理を支援
    CGIの概要
    .Webの最初の目的は、世界中でドキュメントをオンラインで保存し、アーカイブすることです(多くは教育と科学研究に使用されています).これらのファイルは通常静的テキストで表され、一般的にHTMLである.インターネットとWebサービスの発展に伴い,閲覧のほかにユーザの入力を処理する必要がある.現在のサーバの処理過程は一般的に、第1ステップのWebサーバがクライアントから要求(GETまたはPOST)を受信し、対応するプログラムを呼び出す.そしてHTMLページを待つと同時にクライアントも待っています.アプリケーションの処理が完了すると、動的に生成されたHTMLページがサーバ側に返されます.その後、サーバはこの結果をユーザーに返します.HTMLを作成するCGIアプリケーションは、通常、高度なプログラミング言語で実現され、ユーザーデータを受け入れ、処理し、サーバ側にHTMLページを返すことができます.CGIに触れる前に、一般的な生産環境のWebアプリケーションではCGIは使用されなくなったことを警告する必要があります.現在、Webサーバの典型的なコンポーネントには、Apacheと統合されたデータベース・アクセス・コンポーネント(MySQLまたはPostgreSQL)、Java(Tomcat)、PHP、PythonやRubyなどのさまざまな動的言語モジュール、SSL/securityがあります.
    CGIアプリケーション
    .CGIアプリケーションと典型的なアプリケーションは少し異なり、主な違いは入力、出力、およびユーザーとプログラムのインタラクションにある.CGIアプリケーションの入力は、サーバまたはハードディスクからではなく、Webクライアントから取得したユーザが提供するフォームデータである.CGIアプリケーションの出力は、画面、GUIウィンドウ、またはハードディスクに送信するのではなく、接続されたWebクライアントに送信されます.これらの返されるデータは、一連の有効なヘッダファイルを有するHTMLタグデータでなければならない.CGIアプリケーションでは、ユーザーとスクリプトの間には何のインタラクションもありません.すべてのインタラクションは、Webクライアント(ユーザの動作ベース)、Webサーバ側、およびCGIアプリケーション間で発生します.
    cgiモジュール
    .cgiモジュールには、すべての作業を完了するFieldStorageクラスという主要なクラスがあります.Python CGIスクリプトが起動されると、このクラスがインスタンス化されます.インスタンス化が完了すると、辞書のようなオブジェクトが含まれます.このオブジェクトには、フォームを介して入力されたフォームエントリの名前であり、値には対応するデータが含まれます.これらの値は、次の3つのオブジェクトのいずれかです.1.FieldStorageオブジェクト;  2.ファイルアップロードまたはmulitple-part形式のデータがない場合に使用される、MiniFieldStorageクラスという別の類似のインスタンス.  3.これらのオブジェクトのリストであってもよい.このオブジェクトは、フォーム内のフィールドに複数の入力値がある場合に生成されます.
    cgitbモジュール
    ・Webサーバは、理解できない応答を受信すると、その応答を破棄して「500エラー」を返す.500は、内部サーバエラーが発生したことを示すHTTP応答符号化である.一般的に、サーバが実行するアプリケーションにエラーが発生しました.ブラウザで提示されたプロンプトメッセージは、空白または内部サーバエラーなどのメッセージが表示されます.Pythonプログラムがコマンドラインまたは統合開発環境(IDE)で実行されると、発生したエラーはトレースバックメッセージを生成し、エラーが発生した場所を示し、ブラウザにトレースバックメッセージは表示されません.ブラウザで「内部サーバエラー」ではなくWebアプリケーションの遡及情報を表示するには、cgitbモジュールを使用します.次のコードをCGIプログラムに挿入して呼び出すだけです.
    import cgitb
    cgitb.enable()
    

    CGIアプリケーションの構築
    .PythonでCGI開発を行うためには、まず、Python CGIリクエストを処理し、WebサーバからCGIスクリプトにアクセスできるようにするWebサーバをインストールする必要があります.本番環境のサーバ.本格的なWebサーバが必要な場合は、Apache、ligHTTPD、thttpdをダウンロードしてインストールできます.ApacheにはPython CGIを処理できるプラグインやモジュールがたくさんあります.開発者サーバ.学習目的または小型Webサイトを構築するには、Python自身のWebサーバを使用するだけで十分であり、Python 3で構築する手順は以下の通りである.作成したフォルダの下でcmdウィンドウを開き、pythonコマンドウィンドウの下に入力します.
    python -m http.server --cgi
    

    . 2.このフォルダの下に新しいフォルダを作成し、cgi-binと名前を付けます.  3.pythonスクリプトをフォルダの下に置くと、ブラウザにhttp://localhost:8000/cgi-bin/xxx.pyと入力して表示できます.
    静的フォーム・ページ
    .次の例は、静的なページを作成し、ユーザーの入力を取得し、インタラクティブな動作を後のpythonスクリプトに渡し、処理結果を得た後に表示します.最初のステップ:静的ページを作成します.ポートを開いたフォルダディレクトリの下にfriendを作成します.htmlファイルは次のとおりです.
    
    friends CGI demon
    
    

    Friends list for:NEW user

    Enter Your Name:

    How Many Friends Do You Have? 0 10 20 30 40


    .第2のステップでは、cgi-binディレクトリの下にfriendsを作成する.pyスクリプト:
    import cgi
    
    reshtml = '''Content-Type: text/html
    Friends CGI demon (dynamic)

    Friend list for:%s

    Your name is: %s

    you have %sfriends. ''' form = cgi.FieldStorage() who = form['person'].value howmany = form['howmany'].value print(reshtml % (who,who,howmany))


    .ステップ3では、ブラウザ検索バー入力:http://localhost:8000/friend.htm lで静的ページを開いた後、対応するオプションを入力し、submitボタンをクリックするとpythonスクリプト生成結果ページが呼び出されます.
    ダイナミックフォームページ
    .次の例ではhtmlファイルを破棄し、フォームページと結果にpythonスクリプトが生成されます.
    import cgi
    
    header = 'Content-Type: text/html

    ' formhtml = ''' Friends CGI demon

    Friends list for :new user

    enter your name:

    how many friends do you have? %s

    ''' fradio = '%s
    ' def showForm(): friends = [] for i in (0,10,20,30,40): checked = '' if i == 0: checked = 'CHECKED' friends.append(fradio % (str(i),checked,str(i))) print('%s%s' % (header,formhtml % ''.join(friends))) #join friends '' reshtml = ''' Friends CGI demon

    Friends list for:%s

    your name is: %s

    you have %s friends. ''' def doresult(who,howmany): print(header + reshtml % (who,who,howmany)) def process(): form = cgi.FieldStorage() if 'person' in form: who = form['person'].value else: who = 'new user' if 'howmany' in form: howmany = form['howmany'].value else: howmany = 0 if 'action' in form: doresult(who,howmany) else: showForm() if __name__ == '__main__': process()


    完全にインタラクティブなテキストサイト
    .最後の例はコードに対してもっと完備して、ただ論理的で、新しい知識がありません:
    import cgi
    import urllib
    
    header = 'Content-Type: text/html

    ' url = "/cgi-bin/friendsc.py" errhtml = '''html> Friends CGI demon

    Error

    %s