4

次の app.yaml ファイルがあります

application: gtryapp
version: 1
runtime: python27
api_version: 1
threadsafe: yes

handlers:

- url: /images/(.*\.(gif|png|jpg))
  static_files: static/img/\1
  upload: static/img/(.*\.(gif|png|jpg))

- url: /css/(.*\.css)
  mime_type: text/css
  static_files: static/css/\1
  upload: static/css/(.*\.css)

- url: /js/(.*\.js)
  mime_type: text/javascript
  static_files: static/js/\1
  upload: static/js/(.*\.js)

- url: /(.*\.html)
  mime_type: text/html
  static_files: static/\1
  upload: static/(.*\.html)

- url: .*
  script: main.app


libraries:

- name: webapp2
  version: "2.5.2"

そしてファイル app.py:

import webapp2

class MainPage(webapp2.RequestHandler):
def get(self):
    if self.request.url.endswith('/'):
        path = '%sindex.html'%self.request.url
    else:
        path = '%s/index.html'%self.request.url

    self.redirect(path)


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

展開する必要があるファイルは、html ファイル、js、または画像だけです。アプリのコンパイル後に次のエラーが発生します。

raise ImportError('%s has no attribute %s' % (handler, name)) ImportError: has no attribute app


解決済み: 「アプリケーション」ではなく「アプリ」と呼ばなければなりませんでした。

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

2 に答える 2

2

あなたが抱えている問題は、app.yamlファイルがコードを適切に記述していないことです。問題のあるビットは次のとおりです。

- url: .*
  script: main.app

これは、以前のエントリと一致しなかったすべての URL をモジュールのappオブジェクトで処理する必要があることを示しています。モジュールのオブジェクトはmain、WSGI アプリケーション オブジェクト (WSGI 標準を参照) である必要があります。

コードの設定が異なるため、これは機能しません。プライマリ モジュールはindex.py(indexモジュール) にあり、サーバーとのインターフェイスは CGI 標準を介しています (内部では WSGI が使用されます)。

ですから、何かを変える必要があります。app.yamlアプリの説明、またはコードの構成のいずれかです。

コードを CGI スタイルのプログラムとして機能させるのは簡単です。スクリプトとしてapp.yaml指すように変更するだけです。index.pyこの場合の.py部分はファイル拡張子で、ファイルはスクリプトとして実行されます。

代わりに、より新しい WSGI 互換のスタイル (おそらくこれが最適なオプションです) を使用する場合は、ドキュメントで次の形式が提案されています。

import webapp2

class MainPage(webapp2.RequestHandler):
    def get(self):
        self.response.headers['Content-Type'] = 'text/plain'
        self.response.out.write('Hello, webapp World!')

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

あなたのコードはすでにほとんどこのようになっています。mainそれを機能させるには、関数とif __name__ == "__main__"ボイラープレートを取り除きます。それを次のように置き換えます。

app = webapp.WSGIApplication([('/.*', IndexHandler)],
                              debug=False)

これにより、appモジュールの最上位にオブジェクトが作成されます。ここで、index.pyファイルの名前を に変更するか、を指すようにmain.py変更します。今回はこの部分が違います。ファイル拡張子ではなく、Python メンバー アクセス (この場合は、モジュール内のグローバル変数へのアクセス) を表します。app.yamlindex.app.app

于 2013-03-30T20:46:46.480 に答える