python言語webの旅(python、modupython、pyamf、flex、apache)


この記事では主にpythonがウェブアプリケーションにどのように使われているかを紹介しています。(windows環境下)
 
一.apacheのmod_を利用するpythonモジュールは、pythonとウェブサーバ間の通信を実現します。
 
    1.apache 2.11をダウンロードしてインストールします。python 2.5バージョンは公式サイトからhttp://www.python.org/をダウンロードしてください。
 
    2.mod_python 3.3.1、をダウンロードしてインストールする最後にあなたのapacheのパスを選んでください。mod_pythonはPython解像器を組み込んだApacheモジュールです。mod_を通じてpythonはウェブベースのアプリケーションをpythonで書いてもいいです。
 
    3.appheのインストールディレクトリに入り、confディレクトリに入り、httpd.com nfファイルを開いて、その構成を修正します。大きな段のLoadModuleの下に、一行のLoadModule pythonを追加します。module modules/mod_python.so、Apacheにmod_をロードさせます。pythonモジュールです。Directoryノードを追加しました。以下の通りです。
 
<Directory "C:/Program Files/Apache Software Foundation/Apache2.2/htdocs/pyweb"> #   apache     
    AddHandler mod_python .py
    # SetHandler mod_python
    PythonHandler mod_python.publisher
    PythonDebug On
</Directory>
 
以下に説明します。Addhandler mod_python.pyこの文はApacheがpywebディレクトリにアクセスするすべての拡張子のpyという名前の要求をmod_に渡します。pythonモジュールで処理します。Pythonhandler mod_python.publisher、これはpythonを指定してお願いを処理するhandlerがmod_です。python.publisher(handlerはservletに似ています。publisherのようなhanderはmod_pythonマニュアルの87ページを参照してください。)
 
    4.ディレクトリpywebの下でファイルindex.pyを作成します。内容は以下の通りです。
 
def hello(req, name="anonymous"):
    return "Hello %s" % name
 
最初のパラメータreqはmod_です。pythonパッケージのrequestオブジェクト、具体的な使用方法は、mod_pythonマニュアル、の2番目のパラメータが要求パラメータであることを示しています。ブラウザで以下の二つのURLのテスト結果にアクセスしてください。
http://localhost/pyweb/index.py/hello(ハローアンソニーに戻る)
http://localhost/pyweb/index.py/hello?name=shane(ハローシャインに戻る)
私たちはmod_を見ることができます。pythonのルート規則です。index.pyはファイル名です。ハローはメソッド名です。
 
二.pythonとflexの通信(flex+Apache+modupython+wsgi+pyamf+python)
 
    1.pyamfをダウンロードしてインストールする。Adobeのflashとflexは、AMFを使用してアプリケーションとサーバ間の通信を行う。AMFは、通信メッセージを非常に密接なバイナリ形式でネットワーク上で送信するように順序付けする。pyamfは、pythonおよびflashまたはflexをサポートするクライアントと通信するために使用されます。pythonのインストールパスをwindowsの環境変数に参加して、pyamfを解凍して、そのディレクトリに入って、python setup.py install--disable-extを実行して、インストールを始めます。
 
    2.mod_pythonをベースに、wsgiを配置します。WSGIとは、ウェブサーバとアプリケーションとウェブフレームとの間の相互作用のために定義されたpython言語ベースのグループです。pyamfフレームとApacheのインタラクションはwsgi規格に準拠しているので、mod_pythonとpyamfの間には、wsgiブリッジが必要です。WSGI gateway for mod_python、pythonファイルをダウンロードします。
 
    3.ウェブアプリケーションのルートディレクトリを作成します。例えば、C:\pyweb。展開wsgi.rar、wsgi.pyをC:\pywebに入れます。ディレクトリの下にstartup.pyを作成します。内容は以下の通りです。
 
# -*- coding: UTF-8 -*-
from pyamf.remoting.gateway.wsgi import WSGIGateway

import logging

logging.basicConfig(
    level=logging.DEBUG,
    format='%(asctime)s %(levelname)-5.5s [%(name)s] %(message)s'
)

class EchoService(object):
    """
    Provide a simple server for testing.
    """
    def echo(self, data):
        """
        Return data with chevrons surrounding it.
        """
        return '<<%s>>' % data

services = {
   'echo': EchoService(),
   # Add other exposed functions here
}

application = WSGIGateway(services, logger=logging, debug=True)
 
    ここのファイル名はstartup.pyとファイル中の変数名アプリです。
 
    4.ApacheアクセスC:\pywebに権限を与える。httpd.co nfを開いて、下記のDirectoryノードを追加します。
 
<Directory "C:/pyweb">
        Order allow,deny
        Allow from all
</Directory>
 
    5.仮想ホストVitualHostを設定します。仮想ホストとは何か分からない場合は、Apacheの公式文書http://httpd.apache.org/docs/2.2/vhosts/を参照してください。httpd.com nfを開いて一番下に引いて、Include conf/extra/http-vhosts.comの前のコメントを抜きます。extra/httpd-vhosts.com nfファイルを開いて、次のように修正します。
 
NameVirtualHost *:80

<VirtualHost *:80>
    DocumentRoot "C:/Program Files/Apache Software Foundation/Apache2.2/htdocs"
    ServerName localhost
</VirtualHost>

<VirtualHost *:80>

        ServerName www.xiaying.com
        DocumentRoot "C:/pyweb"
	
	 CustomLog "logs/www.xiaying.com-access.log" combined
        ErrorLog "logs/www.xiaying.com-error.log"

        LogLevel warn
        ServerSignature Off

        # PyAMF gateway
        <Location /flashservices/gateway>
                SetHandler mod_python
                PythonPath "['C:/pyweb']+sys.path"
                PythonHandler wsgi
                PythonOption wsgi.application startup::application
                PythonOption SCRIPT_NAME /flashservices/gateway

                # Only enable the options below when you're debugging the
                # application. Turn them Off in a production environment.
                PythonDebug On
                PythonAutoReload On
        </Location>

</VirtualHost>
 
    これはドメイン名に基づく仮想ホストであり、www.xiaying.comというドメイン名でアクセスすると、C:/pywebディレクトリに指向されます。ドメイン名を設定します。system 32/drivers/etc/hostsを開いてください。一行を追加してください。    wwww.xiaying.com
    /flashservices/gatewayこれはPyAMFのgatewayを定義しています。flexというendpointです。リモートで呼び出すURLは:http://www.xiaying.com/flashservices/gateway。
    PythonOption wsgi.appication startup:appicationのうち、wsgi.pyファイルでは、モジュール名とモジュール名がそれぞれ対応しています。
 
    6.次は簡単にpythonクライアントを作ってテストします。コードは以下の通りです
 
from pyamf.remoting.client import RemotingService

gateway = RemotingService('http://www.xiaying.com/flashservices/gateway')
echo_service = gateway.getService('echo')
print echo_service.echo('Hello python')
 
    Appacheを再起動して、上記のコードを実行してください。を見たら、設定が成功しました。
 
    7.flexのクライアントを確立してテストします。コードは以下の通りです
 
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" 
	creationComplete="remoteObject.echo('Hello python')">
	
	<mx:RemoteObject id="remoteObject" destination="echo" endpoint="http://www.xiaying.com/flashservices/gateway" />
	
	<mx:TextInput text="{remoteObject.echo.lastResult}" x="30" y="20"/>
	
</mx:Application>
 
    main.swfファイルをコンパイルして作成して、フォルダC:\pywebの下に入れて、ブラウザでURLを入力します。http://www.xiaying.com/main.swfを選択します。テキストボックスに「ハローpython」が表示されます。成功しました。
 
三.pythonとflexの間のタイプマッピング
 
    1.タイプのオブジェクトでflexとpythonの間で通信すると、actioncriptタイプとpythonタイプの間でプログレッシブ逆プログレッシブマッピングの問題が発生します。次のコードを参照してください。
 
    Project.as
 
package {
	
	[Bindable]
	[RemoteClass(alias='com.project.Project')]
	public class Project {
		
		public var project_name:String;
		public function Project() { }
	}
}
 
    [RemoteClass(alias=comp.project.Project)]は、リモートのpythonクラスを指定しました。comがバッグしているプロジェクトモジュールのProject類は、Objectから引き継ぎます。
 
class Project(object):
    def __init__(self, project_name = None):
        self.project_name = project_name
 
    終了します