2012-07-02 23 views
5

我的Python Pyramid應用程序中有一些HTML表單。我希望他們在啓用JavaScript和禁用JavaScript時通過AJAX工作。現在我對AJAX和常規表單帖子使用不同的視圖,但除了響應之外,這些函數的代碼看起來幾乎相同。我使用這樣的視圖類(類體):如何統一處理Ajax/html表單POST的Python 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

它看起來好像現在只有四條代碼路徑中的一條是相同的,所以我不確定你希望合併的是什麼。我想說,在一個普通的地方處理所有'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 = false,message =「error message」)''當你有錯誤和'dict(ok = True,content = dict(...))' –

+0

請注意,json渲染器會正確渲染一個Object,可以檢查,模板也可以使用這些值。我很確定你可以添加一個beforerender事件來檢查ok和is.xhr,如果需要的話包含消息的話會拋出一個異常。它可能不是最好的,但可以在那裏做 –

0

您可以只使用一種方法ftp並在其中檢查request.is_xhr是否爲true以呈現正確的錯誤/響應。