Вы можете запутать URL-адреса таким образом, что их будет довольно сложно угадать; это совсем не безопасно, но это остановит случайного покера. Вам также необходимо убедиться, что все, что вы используете для обслуживания статических носителей в производстве, не настроено на отображение списков каталогов.
Если вам нужно что-то более безопасное, вот что я делал в прошлом:
In models.py:
my_storage = FileSystemStorage(location=settings.MY_FILES_ROOT, base_url='DO_NOT_USE')
class Resource (models.Model):
//...snip...
resource_file = models.FileField(storage = my_storage)
где settings.MY_FILES_ROOT
- это путь вне того места, где вы обычно храните статические файлы.
Тогда в views.py:
def get_file(request, whatever_id):
//check if the user is allowed to access the file here
resource = Resource.objects.get(id=resid)
response = HttpResponse(resource.resource_file.read(), mimetype='text/whatever')
response['Content-Disposition'] = 'attachment; filename=whatever.ext'
return response
Конечно, этот подход работает только в том случае, если вы знаете тип MIME и расширение файла, независимо от того, всегда ли он одинаков (приложение, в котором я делал это, всегда обслуживал PDF-файлы) или вы извлекаете его из файла.