【问题标题】:Q: google app engine app.yaml how to handle urls from within main.py?问:谷歌应用引擎 app.yaml 如何处理 main.py 中的 url?
【发布时间】:2023-03-11 04:09:01
【问题描述】:

我有一个网站启动并运行,在我的 app.yaml 文件中指定了大约 100 个网址。因为 app.yaml 限制为 100 个 url,所以我想弄清楚如何将 app.yaml 指定的路由指令传输到 main.py 中。我想修改(缩短)app.yaml 文件以将所有请求发送到 main.py,然后我希望 main.py 像 app.yaml 当前那样路由请求。我一直在试验下面的三个文件,但如果我请求除 /test1 之外的任何 url,则无法得到“来自 test1.py 中 MainHandler 的 Hello”的响应。为什么我没有收到“Hello from MainHandler in test1.py”的浏览器响应请求 /xyz 的 url?

测试 1:

请求:/test1

响应:来自 test1.py 中 MainHandler 的您好

测试 2:

请求:/示例

响应:来自 main.py 中的 ExampleHandler 的您好

测试3:

请求:/xyz

响应:你好 main.py 中的 MainHandler

为什么上面的 Test3 也不会导致“Hello from MainHandler in test1.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"

【问题讨论】:

    标签: python url-routing app.yaml


    【解决方案1】:

    优先级层次来自 app.yaml -> 程序中指定的处理程序。

    • 当您点击 /test1 时,app.yaml 会将您的请求路由到 test1.app(因为它与 /test1 路由匹配)将您的请求路由到 test1.MainHandler
    • 当您点击 /test3 时,app.yaml 会将您的请求路由到 main.app(因为它与 .* 路由匹配)将您的请求路由到 main.MainHandler

    【讨论】:

    • 对于我的第三个测试,在我请求 /xyz 的地方,这个 url 没有特定的匹配,所以它被 app.yaml 中的正则表达式匹配并被路由到 main.py。在 main.py 中,它被路由到 MainHandler。我仍然不明白的是,当我在 MainHandler 下导入 test1 并尝试使用 test1.app 行运行它时,为什么它不运行并返回消息“Hello from MainHandler in test1.py”?我没有收到此消息,但希望在我从 main.py 中执行 test1.app 时收到。
    • @carson -- 仅仅引用WSGIApplication 的实例并没有真正任何事情,因为应该给WSGIApplication 一个路由请求,然后它应该路由对适当处理程序的请求。实际上,从处理程序内部,并不清楚进一步路由请求的最佳方式应该是什么......一般来说,您希望在 WSGIApplication 内完成所有路由。
    • 一种解决方案是将元组 ('/xyz', test1.MainHandler) 添加到上面 main.py 中的 app = webapp2.WSGIApplication 行;但是,这首先需要导入 test1。我的问题是 app.yaml 文件的 100 个 url 限制。我不想将 100 多个文件导入 main.py 以允许处理随机请求,所以我现在试图弄清楚如何首先确定 main.py 中请求的 url,以便我可以将导入语句包装在一系列 if 语句。然后,我将只导入特定请求所需的模块并将其定向到单独文件中的处理程序。
    • @carson -- 从根本上说,这比预先导入它们有什么好处?您仍在将它们全部导入 main.py 内的某个地方...
    • @carson -- 此外,FWIW、webapp2 确实 支持延迟导入处理程序:webapp2.readthedocs.io/en/latest/guide/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-05
    • 1970-01-01
    • 1970-01-01
    • 2015-05-30
    • 2016-07-14
    • 1970-01-01
    相关资源
    最近更新 更多