如何配置 swagger UI 以允许用户为查询字符串参数输入多个值

how to configure swagger UI to allow user to entry multiple values for query string parameter

我正在使用 django-rest-swagger==2.1.2djangorestframework==3.7.7,我的视图如下所示:

class PendingRequests(generics.GenericAPIView):
    ...
    filter_backends = (PendingRequestsFilter,)

    def get(self, request):
        ...
        request_status = request.GET.getlist('status')
        request_start_date = request.GET.get('start_date')
        request_end_date = request.GET.get('end_date')
        ...

并且我定义了一个过滤器,如下所示:

class PendingRequestsFilter(BaseFilterBackend):
    def get_schema_fields(self, view):
        fields = [
            coreapi.Field(name="status", description="Statuses of the Requests", required=False, location='query', example='active'),
            coreapi.Field(name="status", description="Statuses of the Requests", required=False, location='query', example='pending'),
            coreapi.Field(name="status", description="Statuses of the Requests", required=False, location='query', example='inactive'),
            coreapi.Field(name="start_date", description="Start Date of the Request (YYYY-MM-DD)", required=False, location='query', example='2525-12-25'),
            coreapi.Field(name="end_date", description="End Date of the Request (YYYY-MM-DD)", required=False, location='query', example='2525-12-26'),
        ]
        return fields

这导致我大摇大摆地 UI 这个视图看起来像这样:

但是当我像这样进入不同的状态时...

... 然后单击 'try it out' 我收到一个请求 URL,如下所示:

http://myserver:4800/api/v1/sudorequests/requests/?status=pending&status=pending&status=pending

注意status=pending重复了3次。我想要一个看起来更像这样的请求 URL:

http://myserver:4800/api/v1/sudorequests/requests/?status=inactive&status=active&status=pending

我有一些见解可能会对您有所帮助。

Swagger Spec 在段落 5.2.4 Parameter Object

中提到 allowMultiple 设置

allowMultiple Another way to allow multiple values for a “query” parameter. If used, the query parameter may accept comma-separated values. The field may be used only if paramType is "query", "header" or "path".

这可能是你想要的

我试着把它传递给 coreapi.Field 这样:

coreapi.Field(name="status", description="Statuses of the Requests", required=False, location='query', example='active', allowMultiple=True)

但是没用

接下来我搜索 swagger-ui.js 并发现了这一行

var isArray = paramType.toLowerCase() === 'array' || param.allowMultiple;

对我们来说幸运的是 coreapi.Field 只是一个 namedtuple,它将所有必要的参数传递给 swagger up。它看起来像这样:

Field = namedtuple('Field', ['name', 'required', 'location', 'schema', 'description', 'type', 'example'])
Field.__new__.__defaults__ = (False, '', None, None, None, None)

我的想法是扩展它并使用它而不是 coreapi.Field。我正在使用 monkeypatching,因为某些 coreapi.Documentcoreapi.Link 逻辑迫使我们这样做。

coreapi.Field = namedtuple('Field', coreapi.Field._fields + ('allowMultiple',))
coreapi.Field.__new__.__defaults__ = (False, '', None, None, None, None, False)

然后像这样使用它:

coreapi.Field(name="status", description="Statuses of the Requests", required=False, location='query', example='active', allowMultiple=True)

不幸的是仍然有错误,但我还是决定post它。也许我们可以一起想办法。 我还在努力,感觉我快到了。

编辑

我试图克服这个错误,但慢慢地变得很明显,如果你真的需要那个功能,那么像我上面显示的那样,分叉 coreapi 库并编辑 Field 会更容易。