2012-06-30 3 views
0

오케이 이것은 꽤 기본적인 것처럼 보이지만 작동하도록 할 수는 없습니다. 나는 정확한 주소, www.url.com/sea?s='1 '로 예를 들어 항해를 지시하고 있지만 자원을 찾을 수 없다는 404 오류가 표시됩니다. 서로 다른 쿼리 매개 변수가있는 링크 목록이 있는데 파이썬 코드에서 다르게 처리해야합니다. 파이썬과 jinja2 템플릿 시스템으로 구글 앱 엔진을 사용하고 있습니다.url 매개 변수를 사용하여 python이 요청을 처리하는 방법을 지정하십시오.

여기 내 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) 

UPDATE : 문제는 내 URL 처리에 있던 코드를 실제로하지 않았다.

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

어떻게 실패합니까? –

+0

파이썬에는 "작동하지 않는다"라는 오류 메시지가 없습니다. 무엇을 얻고 있으며 무엇을 기대 했습니까? – stark

+0

하하는 사실입니다. 방금 추가했지만 404가 있습니다. – clifgray

답변

1

가 404 오류 때문이 아니라 페이지에서 잘못된 아무것도에오고,하지만 무언가가 당신의 경로 또는 애플리케이션 제목을 파일에 이상이 오히려 때문에이 올바른 것입니다. webapp2를 사용하는 경우 URL이 r'/air' 인 경로를 정의하기 만하면됩니다. (예 : 그런데 webapp2.Route(r'/sea/', handler=Sea)

, 대신 GET 요청에 쿼리 문자열을 사용하여, 당신은 경로 kwargs로로 그에 넣어 더 좋은 일을 할 수 있습니다를, 예를 들어 (구문이 어떤 키워드 이름이 <:/?>을처럼 (지정되지 않은 경우 <KEYWORDNAME:REGULAREXPRESSION>입니다) 그냥 정규식 일치하고 당신을 통해 무엇을 전달하지 않습니다)

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 

합니다. 또한 사이트가 자주 업데이트되지 않는 경우 캐싱을 수행하여 쿼리를 더욱 부드럽게 만들 수 있습니다.

+0

감사합니다. 감사합니다. 방금 업데이트 한 내용으로 업데이트했습니다. – clifgray

+0

@clifgray 기꺼이 도와 드리겠습니다! –

+1

@clifgray는 많은 코드를 함께 단순화하고 URL을 더 예쁘게 만드는 방법에 대한 제안을 추가했습니다. –

관련 문제