【问题标题】:use url parameter to specify how python handles the request使用url参数指定python如何处理请求
【发布时间】:2012-06-30 03:03:37
【问题描述】:

好的,所以这看起来应该很基本,但我就是无法让它工作。我收到一个 404 错误,提示找不到资源,但我被定向到正确的地址,例如 www.url.com/sea?s='1' 用于航行。我有一个具有不同查询参数的链接列表,我希望我的 python 代码对它们进行不同的处理。我正在使用带有 python 和 jinja2 模板系统的谷歌应用引擎。

这是我的 HTML:

  <h3><a href="/" class="center-it">Quick Navigation</a></h3>
    <div class="span1">
    <div class="span1">
      <h4><a href="/sea">Sea</a></h4>
        <ul>
            <li><a href="/sea?s='1'">Sailing</a></li>
            <li><a href="/sea?s='2'">Diving</a></li>
            <li><a href="/sea?s='3'">Surfing</a></li>
            <li><a href="/sea?s='4'">Kite Boarding</a></li>
            <li><a href="/sea?s='5'">Kayaking</a></li>
        </ul>
   </div>

这里是蟒蛇:

class Sea(BlogHandler):
    def get(self, s):
        s = self.request.get('s')
        if s == '1':
            posts = posts = db.GqlQuery("select * from Post where sport=:1 order by created desc limit 30", "sailing")
        elif s == '2':
            posts = posts = db.GqlQuery("select * from Post where sport=:1 order by created desc limit 30", "diving")
        elif s == '3':
            posts = posts = db.GqlQuery("select * from Post where sport=:1 order by created desc limit 30", "surfing")
        elif s == '4':
            posts = posts = db.GqlQuery("select * from Post where sport=:1 order by created desc limit 30", "kiteboarding")
        elif s == '5':
            posts = posts = db.GqlQuery("select * from Post where sport=:1 order by created desc limit 30", "kayaking")
        else:
            posts = posts = db.GqlQuery("select * from Post where element=:1 order by created desc limit 30", "sea")

        global visits
        user = users.get_current_user()
        logout = users.create_logout_url(self.request.uri)        
        self.render('sport.html', user = user, posts=posts, visits = visits, logout=logout)

更新: 问题实际上不在于我的 URL 处理的代码。这是正确的:

app = webapp2.WSGIApplication([('/', MainPage),
                               (r'/sea', Sea)]

【问题讨论】:

  • Python 中没有“不起作用”这样的错误消息,你得到了什么,你期望什么?
  • 哈哈非常正确,我刚刚添加了它,但我得到了 404

标签: python html google-app-engine url query-parameters


【解决方案1】:

出现 404 错误并不是因为您的页面有任何问题,而是因为您的路由或 app.yaml 文件有问题。如果您使用的是 webapp2,您只需要定义一个具有 url r'/air' 的路由,它应该可以工作。 (例如webapp2.Route(r'/sea/', handler=Sea)

顺便说一句,您可以将它们作为 route kwargs 放入并做更好的事情,而不是在 get 请求中使用查询字符串,例如(语法是&lt;KEYWORDNAME:REGULAREXPRESSION&gt;,当没有给出关键字名称时(如&lt;:/?&gt;),它只匹配正则表达式,不会传递任何东西给你)

webapp2.Route(r'/sea<:/?><activity:[a-zA-Z]*?>', defaults={"activity":""}, handler=Sea, name="sea")

然后您可以将您的网址更改为,例如:

<a href="/sea/sailing">Sailing</a>

您需要进行的唯一其他更改是在您的 Handler 函数中。它需要接受 kwargs。 (因此您实际上可以稍微更改您的 get 请求):

get(self, *args, **kwargs):
    activity = kwargs.get("activity")
    if activity in ("sailing", "kayaking", "hiking", "kiteboarding", "surfing", "diving")
       posts = db.GqlQuery("select * from Post where sport=:1 order by created desc limit 30", activity)
    elif activity:
       self.error(404)
    else:
       posts = db.GqlQuery ... etc

这将大大简化您的代码并使其更加灵活。此外,如果您的网站不经常更新,您可以做一些缓存以使查询更快捷,等等。

【讨论】:

  • @clifgray 刚刚添加了一个建议,以简化您的大量代码并使您的网址更漂亮
  • 好的,我真的很想这样做,我几乎拥有它,但在第 0 行它给了我一个内部错误 java.nullpointerexception。知道这在 python 中是如何发生的吗?
  • 日志说这一行:(r'/sea<:>', defaults={"activity":""} , name="sea") 语法无效
  • @clifgray 我犯了两个愚蠢的错误:我忘了把处理程序放在那里(你需要一个handler=Sea,而且我还把原始字符串放在了错误的地方。除此之外,它应该可以工作。我刚刚在我的设置上试了一下,一切正常。你是否也包括了 webapp2.Route( 部分?它需要是 Route 构造函数的关键字参数
  • 好的,漂亮,我刚刚开始工作,看起来干净多了
猜你喜欢
  • 1970-01-01
  • 2015-01-23
  • 2015-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-01
  • 1970-01-01
相关资源
最近更新 更多