【问题标题】:Using FileField/ImageField with Swagger UI and drf-spectacular将 FileField/ImageField 与 Swagger UI 和 drf-spectacular 一起使用
【发布时间】:2021-05-13 15:11:35
【问题描述】:

我有一个 Django REST 框架项目,它使用 ModelViewSet 为包含 FileField 的模型创建 API。

我已经分享了一个 Django 项目的完整示例来演示这个问题here。但总结一下关键组件:

models.py

from django.db import models


class Profile(models.Model):
    image = models.FileField(upload_to='uploads/%Y/%m/%d/')

views.py

from rest_framework import (
    viewsets,
    serializers,
    parsers,
)

from sample import models


class ProfileSerializer(serializers.ModelSerializer):

    class Meta:
        model = models.Profile
        fields = ['id', 'image']
        read_only_fields = ['id']


class ProfileViewSet(viewsets.ModelViewSet):
    serializer_class = ProfileSerializer
    queryset = models.Profile.objects.all()

urls.py

from drf_spectacular.views import (
    SpectacularAPIView,
    SpectacularSwaggerView,
)

from django.contrib import admin
from django.urls import path, include
from django.conf.urls.static import static
from django.conf import settings

from rest_framework.routers import DefaultRouter

from sample import views


router = DefaultRouter()
router.register('profile', views.ProfileViewSet)


urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/schema/', SpectacularAPIView.as_view(), name='api-schema'),
    path(
        'api/docs/',
        SpectacularSwaggerView.as_view(url_name='api-schema'),
        name='api-docs',
    ),
    path('', include(router.urls)),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

settings.py(仅限REST_FRAMEWORK 配置):

REST_FRAMEWORK = {
    'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema',
}

requirements.txt

Django==3.2.3
djangorestframework==3.12.4
drf-spectacular==0.16.0

我正在使用 drf-spectacular 生成可浏览的 Swagger-UI 文档来记录 API。

问题在于 Swagger-UI 中的 FileField 输入是 string 输入,并且没有提供设置文件的选项:

我想要一个文件输入,我可以在其中选择一个将发送到 API 的文件。

我的问题是:如何配置 DRF 或 drf-spectacular 以显示该字段?

【问题讨论】:

    标签: django-rest-framework swagger-ui openapi drf-spectacular


    【解决方案1】:

    在浏览了 drf-spectacular docs 和 GitHub 问题后,我发现 FileField 可以通过在 settings.py 中添加以下内容来设置为 binary

    SPECTACULAR_SETTINGS = {
        'COMPONENT_SPLIT_REQUEST': True
    }
    

    【讨论】:

    • @JPG 感谢更新...对我来说,它正在与REST_FRAMEWORK 合作。改成SPECTACULAR_SETTINGS的原因是什么?
    • 顺便说一句,官方DRF settings 不包含COMPONENT_SPLIT_REQUEST 而是在drf-spectacular 设置中
    • @JPG 刚刚在我的项目上进行了测试,如果我将 COMPONENT_SPLIT_REQUESTS 放入 REST_FRAMEWORK 中,它肯定会起作用。在文档中没有看到任何内容,但我的猜测是,如果未定义 SPECTACULAR_SETTINGS,它会退回使用 REST_FRAMEWORK 设置。但是文档确实声明它应该放在SPECTACULAR_SETTINGS 中,所以我认为您的编辑确实改善了答案。谢谢!
    • 这很奇怪。我想深入研究一下这个问题。你能分享一下这个最小的项目或者在this repo创建另一个分支来仔细看看吗?
    猜你喜欢
    • 1970-01-01
    • 2022-12-17
    • 2021-02-09
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 2016-07-14
    • 2022-08-14
    • 2023-01-15
    相关资源
    最近更新 更多