falconry/falcon

Different behaviour between suffixed responders and "normal" ones

Open

#2,167 建立於 2023年8月10日

在 GitHub 查看
 (7 留言) (0 反應) (0 負責人)Python (9,293 star) (925 fork)batch import
buggood first issue

描述

I'm developing a generic resource with all the API operations (GET/POST collection, GET/PUT/PATCH/DELETE element). The idea is to reuse this component by passing a DAO object to make it truly generic. The idea is that all the methods should be disabled by some resources, and I did this with this kind of code (minimal reproduction):

import falcon

class GenericResource:
    def __init__(self, on_get_collection=True):
        if on_get_collection:
            self.on_get_collection = self._on_get_collection

    def _on_get_collection(self, req, resp):
        resp.media = {'message': 'on_get_collection'}


app = falcon.App()
res1 = GenericResource()
res2 = GenericResource(on_get_collection=False)

As I start gunicorn server, my app crashes:

falcon.routing.util.SuffixedMethodNotFoundError: No responders found for the specified suffix

At this point, the resource "res2" is useless because it has no methods, I know... but this happens when I disable all "collection" methods. If I remove the suffix='collection' I only get 405s on every request, like this:

import falcon

class NoneResource:
    pass


app = falcon.App()
app.add_route('/res3', NoneResource())
# the next route crashes...
# app.add_route('/res4', NoneResource(), suffix='collection')

The issue is easy to bypass by removing the "collection" add_route, but I still think that both routes /res3 (normal route) and /res4 (suffixed route) should behave the same way, with no methods available...

貢獻者指南