Как настроить прокси-сервер для SFTP с помощью Django-storages?

Я пытаюсь найти решение моей текущей проблемы. У меня есть приложение Django, которое позволяет пользователям загружать файлы на удаленный сервер с помощью SFTP. Это работает без проблем. У меня возникли проблемы с тем, чтобы указать приложению скачать эти файлы с сервера после того, как они были загружены.

Я потратил время на изучение этой темы, но не нашел многого. Хотя я нашел эту тему и она оказалась полезной, мне все еще не хватает последнего элемента и того, как связать все вместе.

Я создал промежуточное ПО в своем приложении, основываясь на вышеупомянутой теме, и я убедился, что обновил промежуточное ПО в своих настройках. Я не уверен, нужно ли вызывать промежуточное ПО где-то еще в приложении или нужно добавить какой-то другой элемент поверх него. Любая помощь будет оценена по достоинству, спасибо.

middleware.py

import mimetypes

from storages.backends.sftpstorage import SFTPStorage
from django.http import HttpResponse



class SFTPMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):

        SFS = SFTPStorage()
        
        response = self.get_response(request)

        path = request.get_full_path()

        if SFS.exists(path):
            file = SFS._read(path)
            type, encoding = mimetypes.guess_type(path)
            response = HttpResponse(file, content_type=type)
            response['Content-Disposition'] = u'attachment; filename="{filename}"'.format(filename=path)

        return response

settings.py

MIDDLEWARE = [
    "django.middleware.security.SecurityMiddleware",
    "django.contrib.sessions.middleware.SessionMiddleware",
    "django.middleware.common.CommonMiddleware",
    "django.middleware.csrf.CsrfViewMiddleware",
    "django.contrib.auth.middleware.AuthenticationMiddleware",
    "django.contrib.messages.middleware.MessageMiddleware",
    "django.middleware.clickjacking.XFrameOptionsMiddleware",
    "simple_history.middleware.HistoryRequestMiddleware",
    "myproject.middleware.SFTPMiddleware"
]

models.py

class Document(SafeDeleteModel, TimeStampedModel):

    _safedelete_policy = SOFT_DELETE_CASCADE

    SFS = SFTPStorage()

    choices = tag.Tag.objects.all().values_list('name','name')
    choice_list = []

    for item in choices:
        choice_list.append(item)

    document = models.FileField(storage=SFS)
    user = ForeignKey(User, null=True, blank=True, related_name='documents', on_delete=CASCADE)
    description = CharField(max_length=255, null=True)
    tag = CharField(max_length=255, null=True, blank=True, choices=choice_list)
    history = HistoricalRecords(User)

    class Meta:
        verbose_name_plural = 'Documents'

documents.html

<!-- Documents card -->
<div class="card my-3">
  <h5 class="card-header">Documents
    <span class="i-link float-right text-primary">
      <i class="create-doc fas fa-plus" data-toggle="modal" data-target="#modal"></i>
    </span>
  </h5>
  <div class="card-body">
    {% if user.documents.all %}
    <table class="table table-sm">
      <thead>
        <th>Name</th>
        <th class="nowrap">Date</th>
        <th><small class="text-secondary">Description</small></th>
      </thead>
      <tbody>
        {% for doc in user.documents.all %}
          <tr>
            <td>
              <a href="{{ doc.document.url }}" download>{{ doc.document.name }}</a>
            </td>
            <td>{{doc.created}}</td>
            <td>{{ doc.description }} </td>
            <td>
              <span class="i-link float-right text-primary">
                <i class="update-doc far fa-edit" data-toggle="modal" data-target="#modal" data-id="{% url 'users:update-doc' user.username doc.pk %}"></i>
              </span>
            </td>

            <td>
              <span class="i-link float-right text-secondary">
                <i class="delete-doc  far fa-trash-alt" data-toggle="modal" data-target="#modal" data-id="{% url 'users:delete-doc' user.username doc.pk %}"></i>
              </span>
            </td>

          </tr>
        {% endfor %}

      </tbody>
    </table><!-- document table -->
    {% else %}
    <p class="small text-secondary">No documents found</p>
    {% endif %}
  </div>
</div><!-- documents card -->

SFTP config:

SFTP_STORAGE_HOST = 'ip'
SFTP_STORAGE_ROOT = 'dir'
SFTP_STORAGE_PARAMS = {
    'username': 'test_user',
    'password': 'test_password',
    'allow_agent': False,
    'look_for_keys': False,
}
SFTP_STORAGE_INTERACTIVE = False
Вернуться на верх