在GAE中实现URL slugs

时间:2013-01-16 03:29:04

标签: python google-app-engine slug

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

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

我的代码是:

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并用它做一些事情。

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

3 个答案:

答案 0 :(得分:1)

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

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处理程序),它返回主脚本并跟随那里的hanlder路径。指向.js.的链接现在会返回您的index.html而非.js文件,这会导致错误(类似于here)。

答案 1 :(得分:0)

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

WebApp2 Routing

答案 2 :(得分:0)

经过与RocketDonkey的广泛讨论后,我尝试了一些有效的方法。

我从

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

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

RocketDonkey对工作解决方案的解释:当你使用正斜杠时,你会说'从root获取这个URL路径'。但没有它,它就当前位置而言

这解释了为什么原始代码在我的网址只是localhost:8081/1234时有效,但在我有第二个目录的第二个方案中没有

注意:此处描述的解决方案与rocketDonkey的原始提案一起使用