我有一个包含相对网址的模型,例如“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
答案 0 :(得分:1)
我可以在这里看到你的方法有几个问题,所以让我指出我能做什么,看看能不能提出一些建议来帮助你。
看起来asset_path
指向您要返回的服务器上的文件,并且引用的文件存储在名为asset的目录中。如果你想直接提供文件,你需要与Django分开。在开发时,您可以告诉django直接提供这些文件,确保它们位于settings.py中STATIC_URL
设置指定的网址下方。在生产Web服务器上,您需要配置该Web服务器以处理这些URL本身而不是将它们发送到django。
由于django处理文件的方式,您不应该配置视图来响应STATIC_URL
目录下的URL。因此,如果您直接从/assets/
提供文件,则不应将视图配置为响应/assets/manage/
(例如)。在您的示例和注释中,视图正在处理:
并且您要求浏览器将其与:
结合使用../ assetrepository / asset1.html
产生:
哪个不起作用,因为django不是直接提供文件,而是试图找到与该网址匹配的视图(并且失败)。
以下是我建议如何进行设置,并提供一些解释。
通常在这样的应用程序中维护类文件资源的记录时,文件的位置由(至少)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时,它将为您节省各种麻烦减少应用服务器的负担。
如果我误解了你的问题,请告诉我。希望这有所帮助。
答案 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。