在iframe中显示相对网址

时间:2012-01-05 23:30:37

标签: python django

我有一个包含相对网址的模型,例如“abc.html”。

我想在视图的iframe中显示该相对网址。网址可以是动态的,它们来来去去,所以我认为我不能通过静态文件来解决这个问题。

但是,我无法让它工作,我想它可能是我的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尝试解析文件而不是我的app-directory的结构方式。在我的应用程序中,我有大多数资产所在的资产文件夹,但我无法引用它。我想我不能使用collectstatic,因为这些文件会在运行时更改,我也无法将其作为静态文件工作。

你能帮帮我吗?我刚开始学习Django,这种行为让我很困惑。我想这与URLConf有关。

也许有办法从iframe src的相对网址中获取绝对网址。

修改

模型的代码(它真的很苗条)

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 个答案:

答案 0 :(得分:1)

我可以在这里看到你的方法有几个问题,所以让我指出我能做什么,看看能不能提出一些建议来帮助你。

看起来asset_path指向您要返回的服务器上的文件,并且引用的文件存储在名为asset的目录中。如果你想直接提供文件,你需要与Django分开。在开发时,您可以告诉django直接提供这些文件,确保它们位于settings.py中STATIC_URL设置指定的网址下方。在生产Web服务器上,您需要配置该Web服务器以处理这些URL本身而不是将它们发送到django。

由于django处理文件的方式,您不应该配置视图来响应STATIC_URL目录下的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不是直接提供文件,而是试图找到与该网址匹配的视图(并且失败)。

以下是我建议如何进行设置,并提供一些解释。

通常在这样的应用程序中维护类文件资源的记录时,文件的位置由(至少)3个部分组成:

  1. 文件所在的服务器或主机
  2. 文件位置的路径
  3. 文件本身的名称
  4. 根据我的经验,当需要扩展时,你可能会改变#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时,它将为您节省各种麻烦减少应用服务器的负担。

    如果我误解了你的问题,请告诉我。希望这有所帮助。

答案 1 :(得分:0)

如果要提供静态html文件(在本例中为asset1.html),请在静态文件目录下创建“assets”文件夹:

yourproject/yourapp/static/assets/

将django.contrib.staticfiles添加到settings.py中的INSTALLED_APPS目录中。更改db字段中的assets_path条目以表示如下内容:

/static/assets/asset1.html

完成。有关详细信息,请阅读django documentation on static files