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

Can I return a different Django Response based on whether or not the view is invoked from swagger?

我正在为我的 API 使用 Django-Rest-Framework。我正在记录 API w/ swagger using drf_yasg。我的观点之一 returns Django FileResponse.

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

Unrecognized response type; displaying content as text.

这是 b/c of this issue in swagger 本身。正如该票证中所建议的,如果我将“Content-Disposition”响应 header 从“内联”更改为“附件”,问题就会消失。但是,我不想总是下载文件。

我的问题是:我能否在视图中判断请求是否由 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 url。