Отобразить относительный URL в iframe - PullRequest
2 голосов
/ 06 января 2012

У меня есть модель, которая содержит относительный URL, что-то вроде "abc.html".

Я хочу отобразить этот относительный URL в iframe представления.URL-адреса могут быть динамическими, они приходят и уходят, поэтому я не думаю, что могу решить эту проблему с помощью статических файлов.

Однако я не могу заставить его работать, я думаю, что это может быть мой urlconf или что-то еще:

Вот мой взгляд:

def detail(request, asset_id):
    asset = get_object_or_404(Asset, pk=asset_id)
    relative_path = asset.asset_path
    return render_to_response('html/detail.html', {'asset': asset, 'url': relative_path})

Это мой взгляд:

<iframe src="{{ url }}" />

Но в iframe всегда будет отображаться 404, потому что Django пытается разрешить файлне то, как мой каталог приложений структурирован.В моем приложении есть папка ресурсов, в которой находится большинство ресурсов, но я не могу сослаться на нее.Я думаю, что не могу использовать collectstatic, потому что эти файлы будут меняться во время выполнения, и я не мог заставить его работать как статические файлы.

Не могли бы вы помочь мне?Я только начал изучать Джанго, и это поведение меня озадачивает.Я думаю, это связано с URLConf.

Может быть, есть способ получить абсолютный URL-адрес из относительного URL-адреса для iframe.

Редактировать:

Код для модели (этодействительно такой тонкий атм)

class Asset(models.Model):
    name = models.CharField(max_length=100)
    asset_path = models.CharField(max_length=4096)
    creation_date = models.DateTimeField(auto_now=True)

    def __unicode__(self):
        return self.name

Ответы [ 2 ]

1 голос
/ 06 января 2012

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

Похоже, 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. Название самого файла

По моему опыту, когда пришло время масштабировать, вы, вероятно, будете менять # 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, чтобы уменьшить нагрузка на сервер приложений.

Дайте мне знать, если я неправильно понял вашу проблему. Надеюсь, это помогло.

0 голосов
/ 06 января 2012

Если вы хотите использовать статический html-файл (в данном случае asset1.html), создайте папку «assets» в каталоге статических файлов:

yourproject/yourapp/static/assets/

Добавьте django.contrib.staticfiles в каталог INSTALLED_APPS в файле settings.py. Измените вашу запись assets_path в поле БД, чтобы она представляла что-то вроде этого:

/static/assets/asset1.html

Готово. Для получения дополнительной информации прочитайте документацию django для статических файлов .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...