我可以根据是否从 swagger 调用视图来返回不同的 Django 响应吗?

问题描述

我的 API 使用 Django-Rest-Framework。我正在使用 drf_yasg 用 swagger 记录该 API。我的一个视图返回一个 Django FileResponse

当我直接在“http://localhost:8000/api/my_documents/1”访问视图时,它成功显示了(PDF)文件。但是当我通过 swagger 访问它时,它成功返回了 200 但给出了以下消息:

无法识别的响应类型;将内容显示为文本。

这是 this issue 的 b/c 本身。正如那张票中所建议的那样,如果我将“Content-disposition”响应标头从“inline”更改为“attachment”,问题就会消失。但是,我不想总是下载文件

我的问题是:我可以在视图中判断请求是否是swagger发出的并有条件地改变headers吗?类似的东西:

class MyDocumentView(GenericAPIVIew):

  def get(self,request,pk):
    my_document = MyDocument.objects.get(pk=pk)
    response = FileResponse(my_document.file)  # (file is a FileField)

    # WHAT DO I PUT HERE ?!?
    if request.is_from_swagger:
      response.headers["Content-disposition"] = response.headers["Content-disposition"].replace("inline","attachment")

    return response

谢谢。

解决方法

您可以通过选中 request.headers.get('referer') 来执行此操作。那里应该有您的 swagger 网址。