Я вижу здесь несколько проблем с вашим подходом, поэтому позвольте мне указать, что я могу, и посмотреть, смогу ли я дать какой-нибудь совет, чтобы помочь вам.
Похоже, asset_path
указывает на файл на вашем сервере, который вы хотите вернуть, и что указанные файлы хранятся в каталоге с именем asset. Если вы хотите передать файл напрямую, вам нужно будет сделать это отдельно от Django. При разработке вы можете указать django обслуживать эти файлы напрямую, убедившись, что они находятся под URL-адресом, указанным параметром STATIC_URL
в вашем файле settings.py. На рабочем веб-сервере вы захотите настроить этот веб-сервер так, чтобы он сам обрабатывал эти URL-адреса, а не отправлял их в django.
Из-за того, как django обрабатывает файлы, у вас не должно быть настроено представление для ответа на URL-адреса в каталоге STATIC_URL
. Таким образом, если у вас есть файлы, обслуживаемые напрямую из /assets/
, у вас не должно быть представления, настроенного для ответа на /assets/manage/
(например). В вашем примере и комментариях видно, что представление обрабатывает:
http://127.0.0.1:8000/assets/something/
и что вы просите браузер объединить это с:
.. / assetrepository / asset1.html
Который производит:
http://127.0.0.1:8000/assets/assetrepository/asset1.html
Что не сработает, потому что вместо непосредственного обслуживания файла django пытается найти представление, соответствующее этому URL (и терпит неудачу).
Вот как я бы порекомендовал настроить его, с некоторыми пояснениями.
Обычно при ведении записей файловых ресурсов в таком приложении местоположение файла состоит из (как минимум) трех частей:
- Сервер или хост, на котором расположен файл
- Путь к местоположению файла
- Название самого файла
По моему опыту, когда пришло время масштабировать, вы, вероятно, будете менять # 1 и # 2, но почти никогда не # 3. Поскольку дело обстоит именно так, обычно рекомендуется сохранить ссылку на само имя файла в базе данных, но сохранить другую информацию в файле конфигурации или иметь возможность получить ее другим способом во время выполнения (возможно, из запроса. объект).
рассмотрим этот подход:
#models.py
class Asset(models.Model):
name = models.CharField(max_length=100)
asset_filename = models.CharField(max_length=4096)
creation_date = models.DateTimeField(auto_now=True)
def __unicode__(self):
return self.name
#views.py
from urlparse import urljoin
def detail(request, asset_id):
asset = get_object_or_404(Asset, pk=asset_id)
asset_url = build_asset_url(request.get_host(), settings.ASSET_URL, asset.asset_filename)
return render_to_response('html/detail.html', {'asset': asset, 'url': asset_url})
def build_asset_url(host, path, filename):
""" Builds an absolute url to an asset located on the current server """
url = "http://" % host
url = urljoin(url, path)
return urljoin(url, filename)
#settings.py
STATIC_URL = '/static/'
ASSET_URL = '/static/assets/assetrepository/'
Мало того, что это должно работать нормально (если вы поместите файлы активов в каталог /static/assets/assetrepository/
), но это избавит вас от всех видов головной боли, когда вам нужно переместить файлы на выделенный файловый сервер или S3, чтобы уменьшить нагрузка на сервер приложений.
Дайте мне знать, если я неправильно понял вашу проблему. Надеюсь, это помогло.