我只是似乎无法让多个处理程序正常工作。我正在将Google App Engine与Python配合使用。基本URL像预期的那样返回“ Hello world!”,但是当我尝试访问“ / girl”时,我始终收到404错误。

据我所知,我正在做文档中指定的内容:

https://cloud.google.com/appengine/docs/python/config/appconfig

在这个类似的问题中:

YAML file url and script in GAE python

但是尝试在这些模型上想到的所有变体并不能解决我的404问题。我是一个初学者,并不真正了解app.yaml文件的工作方式,因此,我很确定我没有正确指定处理程序。但是我不知道如何解决。

app.yaml

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

handlers:

- url: ./girl/.*
  script: girl.app

- url: .*
  script: main.app

libraries:
- name: webapp2
  version: "2.5.2"


main.py

import webapp2

class MainHandler(webapp2.RequestHandler):
    def get(self):
        self.response.write('Hello world!')

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


女孩

import webapp2

class MainHandler(webapp2.RequestHandler):
        def get(self):
            self.response.write('Hey girl!')

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


补充:项目的不同组织肯定可以避免解决此问题,但是我也想知道为什么设置这些多个处理程序从一开始就行不通。

最佳答案

我知道这是一个旧线程,并且您已经得到了答案,但是我想对发生的事情给出更好的解释,因为我刚刚找到了您的基本问题的答案:如何将处理程序拆分为不同的文件?

关键问题是在声明WSGIApplication时都使用正则表达式

app = webapp2.WSGIApplication([
    ('/', MainHandler),
    ('/girl/', GirlHandler)
], debug=True)


并在您的Yaml文件中

handlers:

- url: ./girl/.*
  script: girl.app

- url: .*
  script: main.app


yaml url: regex中的路径必须是来自Webapp域的完整路径。因此,如果您的域名是localhost:8080,则应在yaml文件中添加从localhost:8080开始的URL。如果键入url: /girl/.*
您要让浏览器匹配domain + regex:localhost:8080/girl/.*

这意味着:


完全匹配此部分:localhost:8080 / girl /
匹配第一部分之后的任何字符(因为这就是“。*”
在正则表达式中表示)


因此,以下yaml语句:

handlers:

- url: /girl/.*
  script: girl.app


意味着对于domain / girl /形式的任何URL,任何(或不做任何事情)请使用girl.py文件app = webapp2.WSGIApplication(...)中的app变量

这样做的第一个含义是,没有编写针对girl.py永远不会处理的url的处理程序的目的,例如在编码时:

女孩

import webapp2

class MainHandler(webapp2.RequestHandler):
        def get(self):
            self.response.write('Hey girl!')

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


您将永远不会使用此主处理程序,因为它只会在浏览domain /时“激活”,但是您在yaml文件中说过,您只希望girl.py可以处理domain / girl / something形式的处理程序网址。这是一个矛盾

这意味着要使设置正常工作,在girl.py中,您只应为与Yaml中的正则表达式匹配的网址编写处理程序。在这种情况下,/girl/.*也接受的任何正则表达式。

附带说明一下,如果您想让girlHandler在domain / girl和domain / girl /上工作,则应在yaml文件中使用此正则表达式:

handlers:

- url: ./girl(?:/.*)?
  script: girl.app

- url: .*
  script: main.app


因为这使得/.*部分是可选的

希望这可以帮助任何遇到此问题的人,以了解webapp2如何根据给定的URL调用每个处理程序

关于python - 使用Python App Engine设置多个处理程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31319344/

10-12 12:45