我正在尝试在我的应用程序中实现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
并用它做一些事情。
有人知道我在这里做错了吗?
答案 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。
答案 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的原始提案一起使用