2010-05-26 2 views
3

GAE 및 Python에서 친숙한 URL 조회 방법을 구축하려고합니다. 아무도하지 않았습니까?Google App Engine의 친숙한 URL

나는 작동하고 있지만 매우 불안정합니다. 그것이 작동하는 방법은 경로를 취하고 (/ foo/bar /라고 가정 해 봅시다) 목록으로 분할하는 것입니다. 목록의 마지막 요소를 가져 와서 데이터베이스에서 일치하는 항목을 쿼리합니다. 이제 두통이 온다.

다른 '바'가있을 수 있지만 다른 페이지 아래에 '바'가 더 있다면, 어떻게 구별 할 수 있습니까? 지금, 내 솔루션은 '바'의 결과를 반복하고 부모 페이지의 참조 속성을 살펴 보는 것입니다. 부모 'foo'는 한 번 이상 발생할 수 있으므로 지금까지 반복해야합니다. 이 클라우드가 다수의 for 루프에 쉽게 추가되는 것을 보는 것은 어렵지 않습니다.

그냥 조금 더 악화하면 한 페이지 이상이 언어로 표시 될 수 있으며 URL은 제공 언어와 일치해야합니다.

나의 현재 데이터 저장소 설정이 있습니다 :

## Class to store pages. 
class Pages(db.Model): 
    name = db.StringProperty() 
    ## Some more properties for storing content 
    parentKey = db.SelfReferenceProperty() 

## Class to store friendly url path segments 
class UrlProvider(db.Model): 
    name = db.StringProperty() 
    path = db.StringProperty() 
    langCode = db.StringProperty() 
    page = db.ReferenceProperty(Pages) 

그리고 친근 URL을 사용하여 페이지를 가져 오지 : 그것이 무엇

pageFromUrl = UrlProvider.gql('WHERE path = :path AND langCode = :lang', path = path, lang = templateObject.lang).fetch(100) 

for pageUrl in pageFromUrl: 
    parentFromUrl = UrlProvider.gql('WHERE page = :page AND langCode = :lang', page = pageUrl.page.parentKey, lang = templateObject.lang).fetch(100) 
    for parentUrl in parentFromUrl: 
     if parentUrl.path == templateObject.path[-2]: 
      templateObject.url = parentUrl.path + '/' + path 
      page = pageUrl.page 

, 그것의 마지막 항목과 일치 UrlProvider 모든 것을에서 반입을 templateObject.path리스트. 반복하고 모든 부모를 가져 와서 일치 시키려고합니다.

지금까지는 하나의 루트 페이지와 하나의 서브 페이지에서만 작동합니다. 더 동적 인 방법과 여러 단계를 지원하는 방법을 모르겠습니다.

누구나 직접 작성했거나 좋은 제안이 있으십니까? = 말한다 섹션

+0

가능한 중복 (http://stackoverflow.com/questions/2297056/pretty-urls-in을 가질 수 있습니다 -google-app-engine-url-rewriting) – ceejayoz

+0

불행히도 없습니다. 내 질문에 대한 자세한 내용을 저장하고 올바르게 데이터를 얻으려면 오히려 어떻게 URL을 얻을 수 있습니다. – fredrik

+0

여기에 정확히 목적이 무엇입니까? 직접 조회 만하는 경우 키 이름에 URL 경로를 지정하지 않는 이유는 무엇입니까? –

답변

1

http://code.google.com/appengine/docs/python/tools/webapp/running.html#URL_Mappings

체크 아웃 URL 매핑

이 전체 코드입니다하지만 난 당신이 생각

이 처음 PARAM = 내 요청 처리기 parama입니다 paramb을 얻을 희망 내 두 번째 PARAM

클래스 testPath (webapp.RequestHandler를) 데프 취득 (자기, parama, paramb) : # 유의 사항이 추가 PARAMS 아니라 자기 self.response.out.w 의식 (parama) self.response.out.write (paramb)

... # 당신은 내가 'urlmapping'전에 ""/ 테스트// 고지은 "R을 요청 아무것도 매핑을 참조 아래

응용 프로그램 = webapp.WSGIApplication ([ (r '/ test/(. )/(.) ', testPath), ('/ 로그 아웃 MyApp를 'LogoutHandler) , 디버그 = TRUE)는

는 그래서 난에 갈 때'.

녹색

parama 녹색 COM/테스트/과일/= 과일 paramb = D

1

이 당신이 찾고있는 무엇인가? 대신 http://test.com/browse?category=book&productid=A209http://code.google.com/appengine/docs/python/tools/webapp/running.html#URL_Mappings

당신은 [구글 앱 엔진/URL 재 작성에 예쁜 URL을]의 http://test.com/browse/book/A209

class BrowseHandler(webapp.RequestHandler): 

def get(self, category, product_id): 
    # Display product with given ID in the given category. 


# Map URLs like /browse/(category)/(product_id) to BrowseHandler. 
application = webapp.WSGIApplication([(r'/browse/(.*)/(.*)', BrowseHandler) 
           ], 
           debug=True) 

def main(): 
    run_wsgi_app(application) 

if __name__ == '__main__': 
    main()