6

次のステップがどうあるべきかを理解するのに少し苦労しています。私は Tastypie を使用して Web アプリケーションの API を作成しています。

別のアプリケーション、具体的には ifbyphone.com から、次のようなヘッダーのない POST を受信して​​います。

post data:http://myapp.com/api/
callerid=1&someid=2&number=3&result=Answered&phoneid=4

今、サーバー ログで、これがサーバーにヒットしていることがわかります。しかし、tastypie は POST の形式について不平を言っています。

{"error_message": "'application/x-www-form-urlencoded' で示されている形式には、利用可能なデシリアライズ方法がありませんでした。お使いのシリアライザーを確認formatscontent_typesてください。", "traceback": "Traceback (最新の最後の呼び出し):\ n\n ファイル \"/usr/local/lib/python2.7/dist-packages/tastypie/resources.py\"

curl を使用して生データを POST しようとすると、同じメッセージが表示されます。これは、ifbyphone の POST メソッドで使用されているのと同じ基本プロセスであると「信じています」。

curl -X POST --data 'callerid=1&someid=2&number=3&duration=4&phoneid=5' http://myapp.com/api/

それで、私の問題が実際にエラーメッセージで指定されているものであり、逆シリアル化方法がないと仮定すると、どのように記述すればよいでしょうか?

#### アップデート ######

このコミット ( https://github.com/toastdriven/django-tastypie/commit/7c5ea699ff6a5e8ba0788f23446fa3ac31f1b8bf ) の助けを借りて、ドキュメントから基本的なフレームワークをコピーして、独自のシリアライザーを作成して遊んでいます ( https://django -tastypie.readthedocs.org/en/latest/serialization.html#implementing-your-own-serializer )

import urlparse
from tastypie.serializers import Serializer

class urlencodeSerializer(Serializer):
    formats = ['json', 'jsonp', 'xml', 'yaml', 'html', 'plist', 'urlencode']
    content_types = {
        'json': 'application/json',
        'jsonp': 'text/javascript',
        'xml': 'application/xml',
        'yaml': 'text/yaml',
        'html': 'text/html',
        'plist': 'application/x-plist',
        'urlencode': 'application/x-www-form-urlencoded',
        }
    def from_urlencode(self, data,options=None):
        """ handles basic formencoded url posts """
        qs = dict((k, v if len(v)>1 else v[0] )
            for k, v in urlparse.parse_qs(data).iteritems())
        return qs

    def to_urlencode(self,content): 
        pass
4

2 に答える 2

14

作成したシリアライザー クラスを実際に使用するようにリソース モデルを編集したところ、これは期待どおりに機能しました。これはドキュメントでは明確ではありませんでした。

class urlencodeSerializer(Serializer):
    formats = ['json', 'jsonp', 'xml', 'yaml', 'html', 'plist', 'urlencode']
    content_types = {
        'json': 'application/json',
        'jsonp': 'text/javascript',
        'xml': 'application/xml',
        'yaml': 'text/yaml',
        'html': 'text/html',
        'plist': 'application/x-plist',
        'urlencode': 'application/x-www-form-urlencoded',
        }
    def from_urlencode(self, data,options=None):
        """ handles basic formencoded url posts """
        qs = dict((k, v if len(v)>1 else v[0] )
            for k, v in urlparse.parse_qs(data).iteritems())
        return qs

    def to_urlencode(self,content): 
        pass

MyModelResource(ModelResoucre):
    class Meta:
        ...
        serializer = urlencodeSerializer() # IMPORTANT
于 2012-12-28T20:34:20.050 に答える