带目录路由的简单Python App Engine服务器

时间:2014-08-19 05:49:07

标签: python google-app-engine

我对app引擎和python都很陌生。我已经完成了这些教程,但是我们还没有找到一个简单/优雅的解决方案来满足我的需求。

我想创建一个包含多个目录的网站:

/home
   /index.html
/stuff
   /index.html
/otherstuff
   /index.html

我知道如果在我的app.yaml文件中,我可以轻松完成此操作:

- url: /otherstuff
    script: account/otherstuff.py

- url: /stuff
    script: game/stuff.py

- url: .*
    script: home.py

我的问题是它不是一个优雅的解决方案,因为我将有3个python文件来提供简单的html文件。相反,我希望只有一个python文件将我的get请求路由到相应的目录。由于我是应用引擎和python的新手 - 我希望有人愿意阐明如何做到这一点。

非常感谢!

3 个答案:

答案 0 :(得分:0)

如果你的html文件是静态文件,那么你不需要通过Python提供它们。 (正如Paul Collingwood指出的那样)

但是,如果你坚持使用Python可能是因为它的学习因素,或者你的html文件是动态的。 这是一个建议。

在app.yaml文件中,您可以声明:

handlers:
- { script: main.app, url: /.* }

其中main是你的python文件名,app是python文件中的变量名。

创建一个包含内容的main.py文件:

import webapp2

class HomeHandler(webapp2.RequestHandler):
    def get(self):
        self.response.out.write("<h1>Hello</h1>")
        return

class StuffHandler(webapp2.RequestHandler):
    def get(self):
        self.response.out.write("<h1>Stuff</h1>")
        return

app = webapp2.WSGIApplication(
    [
        ('/', HomeHandler),
        ('/stuff/', StuffHandler)
    ],
    debug=True
)

这应该会给你一个想法。

您应该通过模板提供html页面,以便将您的html与您的python代码分开。 您可以使用jinja2库来执行此操作。

简单的html jinja2模板结帐示例:http://www.stefanolocati.it/blog/?p=1338

希望有所帮助。 欢呼声。

<强>更新

如果您希望动态捕捉名称,可以执行以下操作:

class DynamicHandler(webapp2.RequestHandler):
    def get(self, stuff):
        self.response.write('This is the DynamicHandler. '
           'The string is %s' % stuff)

app = webapp2.WSGIApplication(
    [
      (r'/', HomeHandler),
      (r'/(.*)', DynamicHandler)
    ],
    debug=True
)

这可以让您了解如何处理目录名称。

关于处理404,通常可以在最后添加此行。 (在app = webapp2之后....)

def handle_404(request, response, exception):
    response.write('This is not the droid you are looking for')
    response.set_status(404)

app.error_handlers[404] = handle_404

但是由于我们的正则表达式非常广泛,你必须处理DynamicHandler中的所有内容(即如果有人输入/ droid,如果满足正则表达式),你必须在DynamicHandler中提出自己的异常

请参阅此页面以了解webapp2异常处理

https://webapp-improved.appspot.com/guide/exceptions.html

作为一个建议,我不会像上面的例子那样广泛/充满活力,但希望能帮助你做你想做的事。

欢呼声。

答案 1 :(得分:0)

由于我没有足够的声誉来评论,我正在使用答案来回答罗比的后续问题(应该单独询问)。在main.py中,特别是在:

app = webapp2.WSGIApplication(
    [
        ('/', HomeHandler),
        ('/stuff/', StuffHandler)
    ],
    debug=True
)

此部分使用正则表达式,并在第一次匹配时退出。这是关于正则表达式的一个很好的,虽然简短的入门... Regex in 15 minutes 以下是关于URI routing in webapp2的一些很好的文档,最后,在上述文档中有一些关于异常处理的文档。

答案 2 :(得分:0)

Flask-FlatPages或多或少地做了你想要的,但实际上,你没有理由在App Engine上托管静态网站。