如何配置 swagger UI 以允许用户为查询字符串参数输入多个值
how to configure swagger UI to allow user to entry multiple values for query string parameter
我正在使用 django-rest-swagger==2.1.2
和 djangorestframework==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.Document
和 coreapi.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
会更容易。
我正在使用 django-rest-swagger==2.1.2
和 djangorestframework==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.Document
和 coreapi.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
会更容易。