2012-07-02 2 views
5

파이썬 피라미드 애플리케이션에 HTML 폼이 있습니다. JavaScript가 활성화되어 있고 JavaScript가 비활성화되어있을 때 AJAX를 통해 작업하길 원합니다. 이제 AJAX 및 일반 양식 게시물에 대해 서로 다른보기를 사용하지만 코드는 응답을 제외하고 이러한 기능에 대해 거의 동일하게 보입니다. 이 클래스 (클래스 몸체)와 같은 뷰 클래스를 사용합니다.Python을 통합하는 방법 Ajax/html 폼을 처리하기위한 Pyramid 뷰

def ajax_ok(self, msg): 
    return Response(body=msg) 

def ajax_error(self, msg): 
    return HTTPInternalServerError(body=msg) 

@action(xhr=True, renderer='json', name='ftp') 
def ftp_ajax(self): 
    log.debug('View: %s', 'ftp (ajax)') 
    if 'form.submitted' in self.params: 
     try: 
      self.config.save(self.params) 
     except: 
      return self.ajax_error('some error') 
     else: 
      return self.ajax_ok('ok') 

@action() 
def ftp(self): 
    if 'form.submitted' in self.params: 
     try: 
      self.config.save(self.params) 
     except: 
      self.request.session.flash('error; ' + msg) 
     else: 
      self.request.session.flash('success; ' + msg) 
    return {'content': render('templates/ftp.pt', {'ftp': 
                self.config.ftp})} 

오류가있는 경우이를 처리하고 html로 표시해야합니다. 어쩌면 finished_callback 또는 다른 요청 유형에 대해 다른 응답을 보낼 내 자신의 렌더러를 사용해야합니까 ??

+0

4 코드 경로 중 1 개만 같아 보이는 것처럼 보이므로 통합하려는 내용이 확실하지 않습니다. 공통된 장소에서 모든 'save'기능을 처리하고 독립적으로 오류 처리를 수행하는 것이 좋다고 말하고 싶습니다. –

답변

4

당신은 그런 일 할 수있는 :

@action(name='ftp', renderer='templates/ftp.pt') 
@action(xhr=True, renderer='json', name='ftp') 
def ftp_ajax(self): 
    log.debug('View: %s', 'ftp (ajax)') 

    # CODE 

    if request.is_xhr: 
     return JSON 
    else: 
     return something for template 

을하지만 당신은 정말 좋은한다면 당신은 같은 것을 할 수 :

@action(name='ftp', renderer='templates/ftp.pt') 
@action(xhr=True, renderer='json', name='ftp') 
def ftp_ajax(self): 
    log.debug('View: %s', 'ftp (ajax)') 
    my_values = dict() 

    # Code 

    return my_values 

을하지만 현재 코드, 코드 ISN에 정직하게 당신이 똑같은 것을 돌려주지 않았기 때문에 매우 유사합니다. 한 가지 경우에, 당신은 어떤 정보를 깜박이고 두 번째로 당신은 어떤 것을 돌려줍니다.

그런 경우 모든 것을 하나로 병합하는 것보다 분리 된 상태로 유지하는 것이 좋습니다. 그러나 동일한 데이터를 분리하여 반환 할 수 있다면 @action을 함께 쌓을 수 있습니다.

+0

당신의 솔루션을 좋아하지만 지금은 2 가지 문제가 있고 두 번째는 뷰에서 예외를 관리하는 방법입니다 (동일한 상황 - html 및 AJAX 양식 게시시). – marcinpz

+0

예외를 발생 시키거나 예외를 반환하는 대신 이와 비슷한 것을 사용할 수 있습니다. 오류가 있고'dict (ok = True, content = dict (...)) '일 때'dict (ok = False, message = "오류 메시지")'라고 말합니다. –

+0

json 렌더러가 검사 할 수 있으며 템플릿에서도 이러한 값을 사용할 수 있습니다. ok 및 is.xhr을 검사하는 beforerender 이벤트를 추가하고 필요한 경우 메시지가 포함 된 경우 예외를 throw 할 수 있다고 확신합니다. 그것은 최선은 아니지만 거기에 할 수 있습니다. –

0

올바른 오류/응답을 렌더링하려면 이 true인지 여부를 확인하는 데 하나의 메서드 ftp 만있을 수 있습니다.