Как настроить прокси-сервер для 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