3

私はPythonPyramidプロジェクトを作成しており、jQueryとjquery.form.jsを使用しています。ビューでHTTPとAJAXの両方の投稿を処理したい(それが最善のアイデアかどうかはわかりませんが、これはおそらくここでの別の質問の内容です)。

現在self.request.session.flash()、HTTP POSTが送信され、エラーが発生したときのエラー通知に使用しています。しかし、Ajaxが投稿されると、HTTPOk()またはHTTPServerError()応答を返すので、ユーザーにエラーメッセージを簡単に表示できます。

$('.ajax_form').ajaxForm({
    error: function(xhr, textStatus, err){
        $('.ajax_messages>.alert').hide().siblings('.alert-error').show().children('p').text(xhr.responseText);
    },
    success: function(responseText, statusText, xhr){
        $('.ajax_messages>.alert').hide().siblings('.alert-success').show().children('p').text(xhr.responseText);
    }
});

しかし、LoïcFaure-Lacroixが提案したように、AjaxリクエストとHTTPリクエストの両方にdictを送信すると、コードが簡素化されます。

より良いアイデアは何ですか?例外がスローされたときにビューから何を返す必要がありますか?

4

1 に答える 1

5

アイデアは、json応答に必要な値を含むdictを返すことです。このdictは、jsonまたはテンプレートを介してレンダリングできます。エラー状態では、応答ステータスを500に設定できます。これは、実行しているすべてが同一である場合に機能します(jsonとhtmlに必要な同じデータ、同じ応答コード)。そうでなければあなたの人生は困難になり、それを分離するのが最善です。

@action(name='ftp', renderer='templates/ftp.pt')
@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:
            request.response.status = 500
            return {'status': 'error', 'error_msg': 'some error'}
        else:
            return {'status': 'success'}

    request.response.status = 400
    return {'status': 'error', 'error_msg': 'invalid request'}

テンプレートが「status」フィールドと「error_msg」フィールドを処理できることを確認するだけで、準備は完了です。繰り返しますが、これは、テンプレートの要件がjsonに返すもののサブセットである場合にのみうまく機能します。

于 2012-07-03T17:47:47.647 に答える