2016-07-17 2 views
2

私はapp.yamlファイルで約100個のURLを指定してウェブサイトを稼働させています。 app.yamlは100個のURLに制限されているため、app.yaml指定のルーティング手順をmain.pyに転送する方法を解明しようとしています。 app.yamlファイルを変更してmain.pyにすべてのリクエストを送信したいのですが、app.yamlが現在行っているようにmain.pyがリクエストをルーティングするようにします。私は以下の3つのファイルを試していますが、/ test1以外のURLを要求すると、 "Hello from MainHandler from test1.py"の応答を得ることができません。なぜ私はブラウザの応答を "mainHandler from test1.pyで"取得していないのですか?/ xyzのURLを要求しますか?Q:Google Apps Engine app.yaml main.py内からURLを処理する方法は?

試験1:

リクエスト:/ TEST1

応答:こんにちはMainHandlerから

test1.py試験2:

リクエスト:/例

応答:こんにちはExampleHandler from main.py

テスト3:

要求:/ XYZ

応答:こんにちはMainHandler

はなぜTest3は上記にも "こんにちはtest1.pyでMainHandlerから" とどのようにすることができますが、応答にはなりませんmain.pyに私はこれを起こさせる?

main.py:

#!/usr/bin/env python 
import webapp2 

class MainHandler(webapp2.RequestHandler): 
    def get(self): 
     self.response.write('Hello MainHandler in main.py<br>') 
     import test1 
     test1.app 

class ExampleHandler(webapp2.RequestHandler): 
    def get(self): 
     self.response.write('Hello from ExampleHandler in main.py<br>') 

app = webapp2.WSGIApplication([ 
    ('/example', ExampleHandler), 
    (r'.*', MainHandler)], 
    debug=True) 

test1.py:

import webapp2 

class MainHandler(webapp2.RequestHandler): 
    def get(self): 
     self.response.write('Hello from MainHandler in test1.py') 

app = webapp2.WSGIApplication([(r'.*', MainHandler)], debug=True) 

if __name__ == "__main__": 
    app 

app.yamlを:

application: test-for-rr 
version: 1 
runtime: python27 
api_version: 1 
threadsafe: yes 

handlers: 
- url: /favicon\.ico 
    static_files: favicon.ico 
    upload: favicon\.ico 

- url: /test1 
    script: test1.app 

- url: .* 
    script: main.app 

libraries: 
- name: webapp2 
    version: "2.5.2" 

答えて

0

優先階層はapp.yamlをから行く - に指定された>ハンドラプログラム。 test1.app

  • あなたが/test1を打つ、app.yamlルートリクエスト(それは/test1ルートと一致したため)そのtest1.MainHandlerへのルートリクエストを。
  • /test3にヒットした場合、app.yamlはにリクエストをルーティングするmain.app.*ルートと一致するため)にリクエストをルーティングします。
+0

私が/ xyzをリクエストした3番目のテストでは、このURLに特定の一致がないため、app.yamlの正規表現と一致し、main.pyにルーティングされます。 main.pyでは、MainHandlerにルーティングされます。私がまだ理解していないのは、MainHandlerの下でtest1をインポートし、それをtest1.appという行で実行しようとしたときです。なぜなら、それが実行されず、 "Hello from MainHandler from test1.py"というメッセージが返されます。このメッセージは返されませんが、main.py内からtest1.appを実行すると予想されます。 – carson

+0

@carson - 'WSGIApplication'のインスタンスを参照するだけでは、' WSGIApplication'にルーティング要求が与えられてから、その要求を適切なハンドラにルーティングする必要があるため、実際には何も実行されません。実際には、ハンドラの内部から、リクエストをさらにルーティングするための最善の方法は何であるべきかはっきりしていません...一般的には、 'WSGIApplication'の中ですべてのルーティングをしたいとします。 – mgilson

+0

解決策の1つは、上記のmain.pyのapp = webapp2.WSGIApplication行にタプル( '/ xyz'、test1.MainHandler)を追加することです。ただし、最初にtest1をインポートする必要があります。私の問題は、app.yamlファイルの100のURL制限です。私は100以上のファイルをmain.pyに無作為にリクエストできるようにする必要はないので、まずmain.pyでリクエストされたURLを特定する方法を見つけようとしています。一連のif文。私はその後、特定の要求に必要なモジュールのみをインポートし、別のファイルのハンドラに指示します。 – carson

関連する問題