我只是似乎无法让多个处理程序正常工作。我正在将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/