如何在CherryPy中定义HTTP OPTIONS方法?

2 投票
1 回答
1628 浏览
提问于 2025-04-17 10:39

我的目标是使用CherryPy (wsgi) + uWSGI + Nginx来定义一个RESTful API。我想知道如何处理OPTIONS这个请求方法,这是在#python频道有人建议我的。他们告诉我,给这个方法实现一个处理器会帮助调用我这个API的人了解支持哪些方法,哪些方法不支持。

这是我目前的进展:


#!/usr/bin/env python

import cherrypy

# modules used for data access
import nosql
import dao

class Product(object):

    exposed = True

    def GET(self, key, *args, **kwargs):
        try:
            p = Product(nosql.get(key))
            return p.json
        except:
            # return 500 error with traceback if debug
            pass

    def POST(self, *args, **kwargs):
        try:
            p = dao.Product(*args, **kwargs)
            k = nosql.generate_key(Product.__name__)
            nosql.set(k,str(p))
        except:
            # return 500 error with traceback if debug
            pass

    def OPTIONS(self, *args, **kwargs):
        """
        The question is, what to return here?  I'm looking 
        at the following rfc:

        http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html
        """
        return "GET, POST"

conf = {
    '/': {
        'request.dispatch':cherrypy.dispatch.MethodDispatcher(),
    },
}

application = cherrypy.tree.mount(Product, config=conf)

1 个回答

2

OPTIONS响应的主体部分其实没那么重要,肯定也没有头部信息那么严格。正如你提到的,大多数客户端其实只关心支持哪些方法。这些方法会在“Allow”这个响应头里列出来,而CherryPy在你使用MethodDispatcher的时候会自动帮你加上这个头部。至于你想在主体部分返回什么,完全可以根据客户端的需求来决定。

撰写回答