2011-08-29 3 views
2

고객이 다른 모델의 데이터를 업로드하고 다운로드 할 수있게 해주는 서버를 만들고 있습니다. 어떤 우아한 방법으로 요청을 처리 할 수 ​​있습니까?비슷한 요청을 처리하는 AppEngine 우아한 방법

더 정확하게, 나는이 같은 뭔가를 내가 모두 같은 것 핸들러 내부에 무엇부터

app = webapp.WSGIApplication([ 
    ('/my_upload_and_download_url/ModelA/(.*)', MyRequestHandlerForA), 
    ('/my_upload_and_download_url/ModelB/(.*)', MyRequestHandlerForB), 
    ('/my_upload_and_download_url/ModelC/(.*)', MyRequestHandlerForC), 
]) 
run_wsgi_app(app) 

를 원하지 않는다. 예를 들어, 핸들러 중

class MyRequestHandlerForX(webapp.RequestHandler): 
    def get(self, key=None): 
     # return the instance with the designated key 
    def post(self, key=None): 
     # create/get the model instance 
     # iterate through the property list of the instance and set the values 

유일한 차이점은 다른 모델에 대한 인스턴스를 생성하는 것이다. URL은 비슷하며 핸들러는 거의 같습니다.

다른 핸들러에 대한 리디렉션 요청에 대해 this post을 확인했으며 클래스 이름으로 인스턴스를 만드는 몇 가지 방법을 읽었습니다. 그러나 나는 그들 중 누구도 좋다고 생각하지 않는다.

누구나 좋은 해결책이 있습니까?

p.s. 이것은 나의 첫 번째 게시물입니다. 부적절한 점이 있으면 알려주세요. 감사합니다.

답변

5

이 작업을 수행하는 방법 : 각 경로에 대한 동일한 클래스를 사용할 수 있습니다

import urlparse 

model_lookup = {'ModelA':ModelA,'ModelB':ModelB, 'ModelC':ModelC} 

class MyRequestHandler(webapp.RequestHandler): 
    def get(self): 
     url = urlparse.urlparse(self.request.uri) 
     path_model = url.path.replace('/my_upload_and_download_url/','') 
     model = model_lookup[path_model] 
     ... 

을 :

+0

감사합니다. 대단합니다! –

0

귀하의 경우에는 모든 URL을 동일한 URL 경로에 입력하고 매개 변수에 내용을 입력하십시오 (예 : /my_upload_and_download_url?model=modelA).

url 라우팅을 지원하는 webapp2 (http://webapp-improved.appspot.com/guide/app.html)를 사용할 수도 있습니다.

app = webapp.WSGIApplication([ 
    ('/my_upload_and_download_url/ModelA/(.*)', MyRequestHandler), 
    ('/my_upload_and_download_url/ModelB/(.*)', MyRequestHandler), 
    ('/my_upload_and_download_url/ModelC/(.*)', MyRequestHandler), 
]) 
run_wsgi_app(app) 
+0

이 문제는 실제로 해결되지 않습니다. Webapp는 이미이 작업을 완벽하게 수행 할 수 있습니다. –

+0

아 너무 그렇습니다. 나는 그것에 대해 완전히 잊었다. –

0

당신은 다음과 같이 찾아 볼 URL 경로를 구문 분석 할 수있는 요청 처리기의 코드 세부 정보에 크게 의존합니다. 다음과 같이 꽤 일반적인 것을 할 수 있습니다 :

class ModelHandler(webapp.RequestHandler): 
    def get(self, kind, key): 
    model = db.class_for_kind(kind) 
    instance = model.get(key) 
    # Do something with the instance - eg, print it out 

    def post(self, kind, key): 
    model = db.class_for_kind(kind) 
    instance = model.create_from_request(self.request) 

application = webapp.WSGIApplication([ 
    ('/foo/([^/]+)/([^/]+)', ModelHandler), 
]) 

def main(): 
    run_wsgi_app(application) 

if __name__ == '__main__': 
    main() 

이것은 각 모델 클래스에서 'create_from_request'클래스 메소드를 정의한다고 가정합니다. 모델 정의를 입력하는 데 사용되는 양식과 긴밀하게 연결하기 때문에이 방법으로 정확하게 수행하기를 원하지 않을 것입니다. 대신 클래스의 속성을 반영하여 종류 이름이나 클래스를 핸들러 함수에 매핑하거나 양식과 생성을 완전히 자동으로 저장하려고 할 수 있습니다. 이 작업을 수행하는 방법을 구체적으로 지정하지 않았으므로 확실하지 않으므로보다 구체적으로 설명하는 것이 어렵습니다.

위의 main() 및 기타 상용구가 포함되어 있습니다. App Engine 런타임이 모든 요청에 ​​대해 모듈을 평가할 필요가 없기 때문에 주를 추가하면 훨씬 효율적입니다.

+0

Webapp에는 경로의 일부를 추출하는 메커니즘이 내장되어 있습니다. urlparse를 사용하여 거기에 들어가서 하드 (단단한) 방법으로 할 필요가 없습니다. –

+0

와우, TIL에 관한 db.class_for_kind 및 경로 구성 요소를 매개 변수로 사용하는 방법 - 감사합니다! –

관련 문제