0

これは非常に奇妙です。タイトルはそのほとんどを示していますが、残りは私のコードで説明する必要があります。これが私のmain.pyファイルです:

from google.appengine.api import urlfetch
import webapp2
import jinja2

import json
import os

jinja_environment = jinja2.Environment(
    loader=jinja2.FileSystemLoader(os.path.dirname(__file__)))


class MainPage(webapp2.RequestHandler):
    def get(self):
        response = urlfetch.fetch("http://localhost:8080/api/helloworld?name=totty", method=urlfetch.GET)
        if response.status_code == 200:
            result = json.loads(response.content)

        template_values = {'response': result['msg']}
        template = jinja_environment.get_template('index.html')
        self.response.out.write(template.render(template_values))


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

これが私のapi.pyファイルです:

import webapp2
import json

class HelloWorld(webapp2.RequestHandler):
    def get(self):
        name = self.request.get('name') or 'world'
        msg = "Hello {}!".format(name)
        payload = json.dumps({'msg': msg})
        # payload = json.dumps({'dir': str(dir(self.request)), 'body': str(self.request.body), 'name': str(self.request.arguments())})

        self.response.headers['Content-Type'] = 'application/json'
        self.response.write(payload)

app = webapp2.WSGIApplication(
    [('/api/helloworld', HelloWorld)],
    debug=True)

そして、私のapp.yamlファイルが役立つ場合:

application: stacksort
version: 1
runtime: python27
api_version: 1
threadsafe: true

handlers:
- url: /api/.*
  script: api.app
- url: /.*
  script: main.app

libraries:
- name: webapp2
  version: latest
- name: jinja2
  version: latest

通話に追加deadline=30しても何も変わりません。JQuery をurlfetch使用して API をテストしたところ、完全に正常に動作し、5 秒以内に戻りました。httpie

私は他の質問を見ましたが、私はまだ暗闇につまずいています. ヘルプ、ヒント、またはリファクタリングをいただければ幸いです。

StackEchange Search API への呼び出しを追加する予定なので、その際にも問題が発生するのではないかと思います。これを行うためのより良い方法があれば、教えてください。ありがとう。

4

2 に答える 2

1

アプリケーションとの間で URL を取得しようとしていますが、これは Google App Engine では強く推奨されていません。

開発サーバーは一度に 1 つの要求しか処理しないため、ローカルで開発サーバーを呼び出すことはできません。マルチスレッドは観察されません。

注: 新しい実験的開発サーバーは、一度に複数のリクエストを処理できるようになりました。

複雑なアプリケーションのパフォーマンスを向上させるマルチスレッド サービングと、より正確なセマンティクス (例: urlfetch を介して独自のアプリケーションにアクセスする) は、もはやデッドロックしません。

実稼働環境では、GAE はフェッチ サービスが同じアプリケーションを呼び出すのを防ぎます。

アプリがリクエストの無限の再帰を引き起こすのを防ぐために、リクエスト ハンドラーは独自の URL を取得することを許可されていません。他の手段で無限再帰を引き起こす可能性は依然としてあるため、ユーザーが提供する URL のリクエストをアプリで取得できる場合は注意が必要です。

于 2013-04-05T07:24:39.590 に答える