0

タイトルはかなり自明なので、これまでに試したコードをいくつか示します。

https://stackoverflow.com/a/713950から、

import cherrypy
from cherrypy import expose

cherrypy.config.update({'server.socket_port': 80})

class Test:
    @expose
    def test_call(self):
        return "Testing"

cherrypy.quickstart(Test())

また、別の SO 投稿から、次の 2 つのバリアント:

cherrypy.config.update({
    'server.socket_port': 80,
    '/': {
        'request.dispatch': cherrypy.dispatch.MethodDispatcher(),
        'tools.trailing_slash.on': False
    }
})

class Test:
    def test_call(self, *args):
        return json.dumps(args)
    test_call.exposed = True

class API:
    def __init__(self):
        self.Test = Test()

class Root:
    def __init__(self):
        self.API = API()


cherrypy.tree.mount(Root())
cherrypy.quickstart(Root())

ここで提案されたバリエーション: Path Not Found in CherryPy

cherrypy.quickstart(cherrypy.Application(Root(), '/', {}))

これらを実行してhttp://mysite.com/test_callまたは mysite.com/api/test/test_call にアクセスしましたが、どちらも 404 を返す以外には何もしていないようです。

JSON をダンプするためのいくつかの関数呼び出しを公開できるのであれば、別のフレームワークを試すことに完全にオープンです派手なものやクールなものは必要ありません。ただ機能しているだけです。

編集:どうやら私の問題は、サーバーがデフォルトでlocalhostであることを期待していたことでした。これは基本的に私を馬鹿にします。追加cherrypy.server.socket_host = "mydomain.com"するとこれが修正されます。

4

2 に答える 2

1

タイトルは例と一致せず、リンクされた回答のコメントで、CRUD 制限されたリソースの観点から逸脱するすべてを「RPC」と呼ぶ傾向がある REST の達人によって誤解された可能性があることを伝えています。JSON RPC は、要求と応答の JSON 構造を定義する特定の仕様です。このように見えます。

--> {"jsonrpc": "2.0", "method": "subtract", "params": [42, 23], "id": 1}
<-- {"jsonrpc": "2.0", "result": 19, "id": 1}

あなたの例は、RESTと同様にそれとは何の関係もありません。主題を理解せずにコピペです。少し整理してみましょう。

  1. CherryPy にはいくつかのディスパッチオプションがあります。デフォルトのディスパッチャー/API/Testは、2 番目の例のように、リクエスト URL セグメントを Python オブジェクト ツリーにマップroot.API.Testします。その一般的な用途は、通常の GET/POST Web フローです。
  2. RESTful API を実装する場合は、専用のマニュアル ページを参照してください: CherryPy での RESTful アプリケーションの作成。のスタイルと使い方を簡単に説明しますMethodDispatcher
  3. python-jsonrpc実際の JSON RPC が必要な場合は、CherryPy アダプターを含むパッケージを確認できます。
  4. ただし、適切な content-type ヘッダーを含む JSON 文字列を返すことだけを達成したい場合、CherryPy には専用のツールがあるため、手動で行う必要はありません。

#4 の例を次に示します。

#!/usr/bin/env python
# -*- coding: utf-8 -*-


import cherrypy


config = {
  'global' : {
    'server.socket_host' : '127.0.0.1',
    'server.socket_port' : 8080,
    'server.thread_pool' : 8
  }
}

class Api:

  @cherrypy.expose
  @cherrypy.tools.json_out()
  def oneway(self):
    '''Just open http://127.0.0.1:8080/api/oneway'''
    return {
      'foo' : 'bar',
      'baz' : 'another one'
    }

  @cherrypy.expose
  @cherrypy.tools.json_in()
  @cherrypy.tools.json_out()
  def twoway(self):
    '''You can call it like:
    curl -X POST -H "Content-Type: application/json" \
      -d '{"foo":123,"bar":"baz"}' http://127.0.0.1:8080/api/twoway
    '''

    data = cherrypy.request.json
    return data.items()


if __name__ == '__main__':
  cherrypy.quickstart(Api(), '/api', config)
于 2014-11-29T17:38:27.440 に答える