Python — Django Делитесь файлами между двумя аутентифицированными пользователями

Я работаю над проектом с использованием Python (3.7) и Django (2.5), в котором я создаю приложение, похожее на сайт для фрилансеров, но я застрял в какой-то момент при реализации части отправки доставки.

Пользователь создаст услугу для продажи, а затем покупатель закажет свою услугу, после чего продавец должен выполнить оговоренную работу и передать работу покупателю в качестве поставки.

Доставка будет в виде файла, может быть текстовым файлом, файлом изображения, аудио, видео или файлом кода, проблема в том, что я не знаю, как реализовать это в Django, поэтому пользователь может отправить файл другому пользователю в частном порядке, поэтому только оба этих пользователя смогут получить доступ к этому файлу.

Вот что у меня есть на данный момент для заказа между покупателем и продавцом:

class Order(models.Model):
    status_choices = (
        ('Active', 'Active'),
        ('Completed', 'Completed'),
        ('Late', 'Late'),
        ('Short', 'Short'),
        ('Canceled', 'Canceled'),
        ('Submitted', 'Submitted')
    )
    gig = models.ForeignKey('Gig', on_delete=models.CASCADE)
    seller = models.ForeignKey(User, on_delete=models.CASCADE, related_name='selling')
    buyer = models.ForeignKey(User, on_delete=models.CASCADE, related_name='buying')
    created_at = models.DateTimeField(auto_now=timezone.now())
    charge_id = models.CharField(max_length=234)
    days = models.IntegerField(blank=False)
    status = models.CharField(max_length=255, choices=status_choices)

    def __str__(self):
        return f'{self.buyer} order from {self.seller}'

Любая идея реализовать обмен файлами как доставку между двумя аутентифицированными пользователями?

Заранее спасибо!


person Abdul Rehman    schedule 26.02.2019    source источник
comment
Логический доступ к сущностям не связан ни с какими аспектами Django. Я вижу FK здесь в черновике вашей модели Order, так что вы знаете, как разделить объекты и соединить их. Какой у Вас вопрос? Я предполагаю, что вы застряли из-за того, что пытаетесь представить все сразу. Частный и общий доступ не являются частью фреймворка Django. Нарисуйте объекты и отношения, затем добавьте точки безопасности. Если вы не пишете код, контролирующий доступ к объектам и моделям, то каждый может получить доступ к чему угодно, например, путем замены/брутфорсинга URL-адресов.   -  person Ivan Starostin    schedule 26.02.2019
comment
Меня больше всего беспокоил подход, как мне реализовать эту вещь? Следует ли сохранить файл на стороннем сервере, а затем поделиться ссылкой с обоими пользователями или с кем-то еще?   -  person Abdul Rehman    schedule 26.02.2019
comment
Это слишком широкое, основанное на мнении, общее понятие, не связанное с каким-либо языком программирования.   -  person Ivan Starostin    schedule 26.02.2019
comment
Я говорю об этой реализации в контексте Django.   -  person Abdul Rehman    schedule 26.02.2019


Ответы (1)


Есть много способов реализовать это.

Вы можете просто добавить поле для пользователей, которые имеют доступ к файлу, и позволить им загружать файл всякий раз, когда они запрашивают загрузку, если они аутентифицированы и им разрешено загружать этот конкретный файл.

С вашей моделью вы можете сделать что-то вроде этого:

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

Вы можете позволить пользователю загрузить файл, используя X-Sendfile, который поможет вам проверить, разрешено ли пользователям загружать файл или нет. Пример здесь, в stackoverflow

Пример кода:

def download_file_view(request, file_id):
    if not request.user:
        # Redirect user or ...
    if not request.user.is_authenticated:
        # Redirect user or ...

    # Check if this user has any orders with that file linked to it:
    if Order.objects.filter(buyer=request.user, gig__pk=file_id).exists():
        # User has bought this file already and the download should be allowed.

Там можно проверить срок годности и все такое.

person Navid Zarepak    schedule 26.02.2019