2

メインのドキュメント ページでは、「Python 2.7 ランタイムは、下位互換性のために WSGI 標準と CGI 標準をサポートしている」と主張しています。

これは非常に明白な問題であるに違いありませんが、私には理解できません。私は Google App Engine を初めて使用し、それを使用して古い Python CGI アプリを実行しようとしています。Linux システムに SDK をインストールし、次のような app.yaml ファイルを作成しました。

application: your-app-id
version: 3
runtime: python27
api_version: 1
threadsafe: false

handlers:
- url: /.*
  script: members.py

スクリプトと必要なファイルは、google_appengine フォルダー内の sms-gae というフォルダーにあります。私が走るとき

./dev_appserver.py sms-gae/

localhost:8080 にアクセスするとプログラムが実行されますが、出力はブラウザーではなくターミナル コンソールに表示されます。ブラウザには何も出力されません。通常の Web サーバー CGI 環境では、同じアプリケーションが問題なく動作します。

主な GAE ドキュメントによると、「App Engine は、リクエスト ハンドラ スクリプトが標準出力ストリームに書き込むすべてのデータを収集し、スクリプトが戻るのを待ちます。ハンドラが完了すると、すべての出力データがユーザーに送信されます。 "

GAE 開発環境のドキュメント(詳細はこちら) を確認したところ、正しくセットアップできました。CGI スクリプトの使用に関するドキュメントはかなりまばらで、インターネット上でもこの問題について何も見つけることができません。

出力は次のとおりです。

INFO     2013-10-10 23:05:55,535 sdk_update_checker.py:245] Checking for updates to the SDK.
INFO     2013-10-10 23:05:56,838 sdk_update_checker.py:289] This SDK release is newer than the advertised release.
INFO     2013-10-10 23:05:57,181 api_server.py:138] Starting API server at: http://localhost:49954 
INFO     2013-10-10 23:05:57,225 dispatcher.py:168] Starting module "default" running at: http://localhost:8080
INFO     2013-10-10 23:05:57,241 admin_server.py:117] Starting admin server at: http://localhost:8000
Content-Type: text/html; charset= utf-8

[The Content-Type line comes from my script and is followed by its output]

INFO     2013-10-10 23:06:05,227 members.py:73] No userid or password supplied.
INFO     2013-10-10 23:06:05,262 module.py:599] default: "GET / HTTP/1.1" 200 -
4

1 に答える 1

2

ここでの調査といくつかの回答(何らかの理由で削除されたため)の後、GAEは実際にはCGIをサポートしていないようです(または少なくともバニラの「通常の」CGIはサポートしていません)。それらが意味しているように見えるのは、GAE が CGI アダプターで実行される WSGI コードを受け入れるということです (例については、こちらの説明を参照してください)。

ただし、CGI アプリを大雑把な方法で WSGI に変換するのは、ここで説明するトリックを使用して比較的簡単です。このコードをアプリの下部に追加すると、メイン コードが関数から実行され、mainfuncget 要求に応答すると仮定すると、それが実行されます (そうでない場合は、同様のpostメソッドを定義できます)。

import webapp2
import StringIO

class MainPage(webapp2.RequestHandler):
   def get(self):
     old_stdout = sys.stdout
     new_stdout = StringIO.StringIO()
     sys.stdout = new_stdout
     mainfunc()
     self.response.out.write(new_stdout.getvalue())
     sys.stdout = old_stdout

app = webapp2.WSGIApplication([('/', MainPage)],debug=True)

そして app.yaml をリダイレクトして、すべての URL のハンドラーとして "members.app" (私の場合) を指すようにします。

于 2013-10-10T18:34:27.070 に答える