使用Sphinx的RESTful Web服务API文档

dec*_*eze 31 documentation rest python-sphinx

使用ReST/Sphinx标记RESTful Web服务的方法/ URL的最佳方法是什么?是否存在适合使用可能的参数,HTTP方法,标题和正文内容标记URL的默认域?

有点像:

.. rest:method:: GET /api/foo

   :param bar: A valid bar
   :extension: json or xml

   Retrieve foos for the given parameters. E.g.::

      GET /api/foo.json?bar=baz
Run Code Online (Sandbox Code Playgroud)

这样的事情是否已经存在或者是可用的默认扩展之一,还是我必须自己编写一个?

Vik*_*aag 25

狮身人面像的Contrib项目也似乎有一个HTTP域包记录的RESTful HTTP的API.您可以在Python包站点上找到它的文档.我不能说它的适应性:我只是刚刚开始研究Sphinx,我也需要记录RESTful API,并注意到这个贡献包.

  • 我现在可以评论我们已经在生产中使用Sphinx(使用_HTTP Domain_包)一年,并且它正在完成这项工作.我已经根据我们的特殊需求进行了一些局部更改,但总的来说,我对结果非常满意. (4认同)

dec*_*eze 18

由于似乎没有任何现有的解决方案,我已经实现了一个非常简单的HTTP域,我可以使用它来标记API方法:

import re

from docutils import nodes

from sphinx import addnodes
from sphinx.locale import l_, _
from sphinx.domains import Domain, ObjType
from sphinx.directives import ObjectDescription


http_method_sig_re = re.compile(r'^(GET|POST|PUT|DELETE)?\s?(\S+)(.*)$')

class HTTPMethod(ObjectDescription):

    def handle_signature(self, sig, signode):
        m = http_method_sig_re.match(sig)
        if m is None:
            raise ValueError

        verb, url, query = m.groups()
        if verb is None:
            verb = 'GET'

        signode += addnodes.desc_addname(verb, verb)
        signode += addnodes.desc_name(url, url)

        if query:
            params = query.strip().split()
            for param in params:
                signode += addnodes.desc_optional(param, param)

        return url


class HTTPDomain(Domain):
    """HTTP language domain."""
    name = 'http'
    label = 'HTTP'
    object_types = {
        'method':    ObjType(l_('method'),    'method')
    }
    directives = {
        'method':       HTTPMethod
    }

def setup(app):
    app.add_domain(HTTPDomain)
Run Code Online (Sandbox Code Playgroud)

它允许我标记这样的方法,并且它们在视觉上有点风格:

.. http:method:: GET /api/foo/bar/:id/:slug

   :param id: An id
   :param slug: A slug

   Retrieve list of foobars matching given id.
Run Code Online (Sandbox Code Playgroud)

这是我第一次涉足Sphinx和Python,所以这应该被认为是非常基本的代码.如果有人有兴趣充实这个,请在Github上分享这个项目!