【问题标题】:Implementing URL slugs in GAE在 GAE 中实现 URL slug
【发布时间】:2012-12-30 07:55:10
【问题描述】:

我正在尝试在我的应用程序中实现 URL slugs(基于 python)。我希望 slugged URL 的格式为 myhost/{post_id}/{post_title}

当我尝试使用上述 slugged URL 格式访问页面时,我收到一个错误并且(在 Chrome 中,错误显示 - 意外令牌 /<post_title>,页面会正确加载。具体来说,我注意到一旦我在&lt;post_id&gt; 之后有一个“正斜杠”,我就会遇到问题。没有额外的斜线(额外目录),一切正常

我的代码是:

class mainhandler(webapp.RequestHandler):
    def get(self):
        if (self.request.path == '/test'):
            path = os.path.join (os.path.dirname (__file__), 'test.htm')
            self.response.headers ['Content-Type'] = 'text/html'
            self.response.out.write (template.render (path, {}))
        else:                       
            path = os.path.join (os.path.dirname (__file__), 'index.htm')            
            self.response.headers ['Content-Type'] = 'text/html'                 
            self.response.out.write (template.render (path, {}))

    application = webapp.WSGIApplication( [('/.*', mainhandler)],  debug=True) 

基本上,我想加载 index.htm 文件,在该文件上,我有 JavaScript,它应该从 URL 中提取 post-id 并用它做一些事情。

有人知道我在这里做错了什么吗?

【问题讨论】:

    标签: python google-app-engine slug


    【解决方案1】:

    在与 RocketDonkey 进行了广泛的讨论后,我尝试了一些可行的方法。

    我从

    更改了我的脚本文件
    <script src="include/load.js" type="text/javascript"></script>
    

    <script **src="/include/load.js"** type="text/javascript"></script>
    

    RocketDonkey 对工作解决方案的解释:当您使用正斜杠时,您是在说“从根目录获取此 URL 路径”。但是没有它,就目前的位置而言

    这解释了为什么当我的 url 只是 localhost:8081/1234 时原始代码有效,但在我有第二个目录的第二种情况下无效

    注意:此处描述的解决方案与 RocketDonkey 的原始提案结合使用

    【讨论】:

      【解决方案2】:

      您需要修改 application 中的 URL 路径。如果我理解正确,你会想做这样的事情:

      application = webapp.WSGIApplication(
          [('/(.*)/(.*)', mainhandler),
           ('/.*', mainhandler)],
          debug=True)
      

      然后将您的mainhandler 定义为:

      class mainhandler(webapp.RequestHandler):
          def get(self, post_id=None, post_title=None):
      

      虽然目前您似乎没有对它们做任何事情,但一旦进入您的mainhandler,您就可以使用这些变量。您的第一个映射不起作用的原因是它没有设置为处理 URL 中的其他 / 和项目。

      根据我们随后的对话,syntaxError(这是一个与 JavaScript 相关的错误)的原因是因为 include/load.js 前面缺少 /。如果没有该前缀,则路径是相对于当前位置的。在localhost:8080/1234/a-test-case 的情况下,它变为/1234/a-test-case/include/load.js,它不会映射到app.yaml 中的任何特定内容,因此属于.* 处理程序(并且不是您的Javascript 处理程序已定义),它会将您返回到主脚本并遵循那里的处理程序路径。指向您的 .js. 的链接现在返回您的 index.html 而不是您的 .js 文件,这会导致错误(类似于可以找到的 here)。

      【讨论】:

      • 我尝试了您的建议,但没有任何改变(即仍然出现错误)。在萤火虫中,错误是SyntaxError: syntax error &lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//E
      • @N.P 嗯,您尝试访问的确切 URL 是什么?
      • 一个例子是 localhost:8081/1234/a-simple-example
      • @N.P 该错误出现在 GAE 日志中还是仅出现在 Chrome/Firefox 中?另外,当你只做localhost:8081/1234 时它工作正常吗?似乎这可能是模板文件本身的问题 - 作为测试,如果您从模板中删除 JavaScript 会发生什么?
      • 如果我只做 localhost:8081/1234 并且 javascript 工作正常。如果我将查询参数添加到 url 也可以正常工作
      【解决方案3】:

      我会考虑使用支持扩展路由和 Python 2.7 的 webapp2。

      WebApp2 Routing

      【讨论】:

        猜你喜欢
        • 2012-10-02
        • 2011-04-21
        • 2017-05-22
        • 2015-06-19
        • 1970-01-01
        • 2022-12-05
        • 2014-11-06
        • 2023-03-17
        • 2015-11-28
        相关资源
        最近更新 更多