1

我已经尝试了所有方法,但似乎您无法获取所有网址...

- url: /.*
  script: not_found.py  

...处理基于静态目录路径的 url。例如。我可以输入 www.foobar.com/asdas/asd/asd/asd/ad/sa/das/d 并获得一个不错的自定义 404 页面。但是,如果我更改像 www.foobar.com/mydir/mydir/mypage.html 这样的静态路径 url,我只会得到可怕的通用 404 ....

Error: Not Found

The requested URL /mydir/mydir/mypage.html was not found on this server.

...我想更改在目录路径中捕获 url 并写入 404 的任何内容。这似乎是在 GAE Python 中获得一致的自定义 404 页面的唯一方法。

任何人都可以帮忙吗?我从头开始编写我的网站,并且对 Python 的了解非常有限。实现一致的自定义 404 是我似乎无法克服的唯一事情。

编辑/添加:好的,我已经添加了@Lipis 的善意建议,并完成了入门,幸运的是,这让我对课程有了更好的理解(遗憾的是,我还不能投票)。但!我正在使用在网上找到的 .py 脚本,我认为 NotFound 类干扰了提供我的索引页面的类,因为现在我的索引页面是 Jinja 指定的 404 页面!我对 MainHandler 了解很少,所以我现在可能不得不放弃。

import os
from google.appengine.ext import webapp
from google.appengine.ext.webapp import util
from google.appengine.ext.webapp import template
from google.appengine.ext.webapp.util import run_wsgi_app

import jinja2


class MainHandler(webapp.RequestHandler):
  def get (self, q):
    if q is None:
      q = 'index.html'

    path = os.path.join (os.path.dirname (__file__), q)
    self.response.headers ['Content-Type'] = 'text/html'
    self.response.out.write (template.render (path, {}))


class NotFound(webapp.RequestHandler):
      def post(self):
         # you need to create the not_found.html file
         # check Using Templates from Getting Started for more

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

         template = jinja_environment.get_template('404.html')
         self.response.out.write(template.render(template_values))


def main ():
  application = webapp.WSGIApplication ([('/(.*html)?', MainHandler),('/.*', NotFound)], 
                                      debug=True)

  util.run_wsgi_app (application)


if __name__ == '__main__':
  main ()
4

2 回答 2

4

为了更好地理解,我将对Getting Started示例进行一些修改,我假设您已经完成了它并用它做了一些实验。

为所有未找到的页面保留静态文件并不是一个好主意,app.yaml因为您很可能希望显示更动态的内容,并且通常- url: /.*应该在您的应用程序中处理。

在此示例中,我们RequestHandler将为所有未找到的页面添加一个新页面

import jinja2
import os
# more imports

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

class MainPage(webapp2.RequestHandler):
    def get(self):
         template = jinja_environment.get_template('index.html')
         self.response.out.write(template.render(template_values))

class NotFound(webapp.RequestHandler):
    def get(self):
         # you need to create the not_found.html file
         # check Using Templates from Getting Started for more
         template = jinja_environment.get_template('not_found.html')
         self.response.out.write(template.render(template_values))

application = webapp.WSGIApplication(
                                     [('/', MainPage),
                                      ('/.*', NotFound)], # <-- This line is important
                                      debug=True)

但是为了使 jinja2 模板正常工作,请仔细遵循入门中使用模板部分中需要进行的修改。

URL 映射中的顺序非常重要,因此这个 catch all 正则表达式 ( /.*) 应该始终是最后一个,否则将跳过所有其他规则。

于 2012-09-08T11:26:52.450 回答
0

如果要捕获所有 URL,则必须通过添加“/.*”来修改文件“not_found.py”中的主请求处理程序。

例如,您可以将文件“not_found.py”设置为:

from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app

class MainHandler(webapp.RequestHandler):
  def get(self):
    self.response.out.write("Hello, MAIN!")

application = webapp.WSGIApplication(
                                 [('/.*', MainHandler)], # <--- Add '/.*' here
                                 debug=True)

def main():
    run_wsgi_app(application)

如果您导航到 www.foobar.com/asd/ad/sa/das/d 或任何其他 URL,您将看到消息“Hello, MAIN!.

希望能帮助到你。需要时提问

于 2012-09-08T08:33:09.613 回答