0

さて、これはかなり基本的なはずのように見えましたが、私はそれを機能させることができません。正しいアドレス(たとえば、セーリングの場合はwww.url.com/sea?s= '1')に転送されていますが、リソースが見つからないという404エラーが発生します。さまざまなクエリパラメータを持つリンクのリストがあり、それらをPythonコードで異なる方法で処理したいと考えています。私はPythonとjinja2テンプレートシステムでGoogleAppEngineを使用しています。

これが私の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>

そしてここにPythonがあります:

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)]
4

1 に答える 1

1

404エラーは、ページに問題があるためではなく、ルートまたはapp.yamlファイルに問題があるために発生しています。webapp2を使用している場合は、URLを持つルートを定義するだけで、r'/air'機能するはずです。(例えばwebapp2.Route(r'/sea/', handler=Sea)

ちなみに、getリクエストでクエリ文字列を使用する代わりに、それらをルートkwargsとして入れて、より良いことを行うことができます。たとえば、(構文は<KEYWORDNAME:REGULAREXPRESSION>、キーワード名が指定されていない場合(のように<:/?>)、正規表現と一致し、一致しません。 tあなたに何かを渡す)

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

次に、URLを次のように変更できます。

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

あなたがする必要がある他の唯一の変更はあなたのハンドラー関数にあります。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

これにより、コードがかなり単純化され、より柔軟になります。さらに、サイトがあまり頻繁に更新されない場合は、少しキャッシュしてクエリをより高速にすることができます。

于 2012-06-30T06:22:13.337 に答える