Собираюсь ответить на мой собственный вопрос.Я не уверен, что это лучший способ, но он сработал для меня.Вместо того, чтобы создавать новый URL для загрузки изображений, я создал условные операторы внутри asset_detail_view, чтобы перехватить форму, которая была отправлена через шаблон.Я думаю, что это то, что делают большинство других ответов, как это, но это не очень хорошо объяснено (по моему мнению), поэтому я был очень смущен, когда другие размещали эту логику.Это нарушило процесс локально, потому что он должен открыть URL-адрес, а urllib не знает, как обрабатывать локальные пути.
Шаблон HTML:
<div>
<form>
<input type="text" name="path" value="{{ **object url** }}" hidden>
<input class="btn btn-primary" type="submit" value="Download">
</form>
</div>
Здесь вам нужно найти способчтобы получить URL файла, я использовал django-filer, так что это было легко.Я удалил дополнительные вызовы, которые я должен был сделать, чтобы получить его, потому что это свойственно моему коду и не будет работать для других.После отправки он был отправлен в то же представление, в котором он уже находился, но теперь к нему была прикреплена переменная path
.
views.py
from urllib.request import Request, urlopen
def asset_detail_view(request, slug, *args, **kwargs):
obj = get_object_or_404(Asset.objects.prefetch_related('file_set'), slug=slug)
context = {
'object': obj,
}
if request.GET:
query = request.GET
filepath = query.get('path','0')
filename = os.path.basename(os.path.normpath(filepath))
hdr = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
'Accept-Encoding': 'none',
'Accept-Language': 'en-US,en;q=0.8',
'Connection': 'keep-alive'}
req = Request(filepath, headers=hdr)
with urlopen(req) as f:
response = HttpResponse(f.read(), content_type='application/octet-stream')
response['Content-Type'] = 'application/octet-stream'
response['Content-Disposition'] = 'attachment; filename={0}'.format(filename)
print (response['Content-Disposition'])
return response
return render(request, 'detail_view.html', context)
переменная hdr
была странной для меняи мне пришлось покопаться, чтобы найти его.Из того, что я понимаю, вы по существу убеждаете сервер, что вы браузер, а не блок кода, пытающийся получить доступ к серверу.Вы можете просто скопировать и вставить это.
Если кому-то еще есть что добавить, или есть более простой способ справиться с этим, не стесняйтесь комментировать или отвечать.Надеюсь, это поможет кому-то еще!