2

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

当我尝试使用上述 slugged URL 格式访问该页面时,我收到一个错误并且(在 Chrome 中,错误显示 - 意外令牌 <)。/<post_title>如果我从 URL 中删除,页面加载正确。具体来说,我注意到一旦在 之后有一个“正斜杠” <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,它应该post-id从 URL 中提取并用它做一些事情。

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

4

3 回答 3

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 中的其他 's 和项目。

根据我们随后的对话,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文件,这会导致错误(类似于可以在此处找到的内容)。

于 2013-01-16T04:57:39.137 回答
0

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

WebApp2 路由

于 2013-01-16T12:05:51.187 回答
0

在与 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 的原始提案一起使用

于 2013-01-17T03:47:53.530 回答