我有一个在django中运行的网站,并希望在第三方网站上提供。
在这些网站中,他们通过标记提供我的内容。
当我在iframe中请求我的网站时,我想修改内容(删除标题,过滤数据等)。
最好的方法是什么?
有没有办法知道请求是从iframe发出的?
Multiples网站会请求相同的网址,我可以根据请求网站更改内容吗?
谢谢!
PS:抱歉我的英文不好:/
1-如何告诉我的页面链接(a href)附加“thirdparty”sufix?最好将我的所有链接更改为“相对”路径?
2-我希望某些页面只需要全局更改(删除页眉/页脚),而其他页面需要特殊内容。有办法在我的上下文处理器中执行此操作吗?
谢谢!
答案 0 :(得分:2)
您可以做的一件事是有两个映射的URL:一个供第三方使用,另一个供独立的Django站点使用。
这两个网址都会映射到相同的django视图,但会传递一个不同的参数,表明您希望视图的完整版本模板或受限制的模板没有页眉,页脚和模板的其他部分,第三方不会感兴趣的。
使用模板inheritance或组合(有些人会嘲笑使用include tag,但我总是提到它,因为它是一个选项)来创建适当的模板 - 一个包含您所有组件的模板 - 独立的django网站和仅有第三方内容感兴趣的网站;并根据映射网址传入的参数使您的视图使用其中一个。
因此,第三方会使用http://blah.com/thirdparty/abc/12
之类的网址,其中/thirdparty/abc
是第三方的网址;而您的主django网站将使用http://blah.com/abc/12
,其中/abc
是独立网站的网址。您可以同时映射到同一视图,并使用extra-options将参数传递给视图,指示要使用的模板。
我认为通过确定请求来自何处来尝试解决问题是一个失败的主张。
希望有所帮助。
PS。你的英语完全可以理解。
编辑:
建议使用StackOverflow:如果您希望有人详细说明他们的答案,请在答案中添加评论。这将使StackOverflow在页面顶部的小电子邮件图标中注明用户应该检查的答案。我只注意到你对这个问题的编辑,因为我正在检查我的回复中的拼写错误。 :-)应该对问题进行编辑以澄清问题,当然,但总是认为澄清是通用的还是对答案的评论 - 有时你需要同时做两件事!澄清您的问题并在答案中添加注释,以提醒受访者注意变更。
回到手头的问题:
您的urls.py
应该是这样的:
from django.conf.urls.defaults import *
urlpatterns = patterns('app.views',
(r'^standalone/(?P<template>\w+)/(\d{4})/$', 'view_callable'),
)
因此,捕获并发送到视图可调用的参数之一(我想象中称为view_callable)是“模板”,其中包含要使用的模板的指示。
现在您有两个选择:
a)使用继承构建两个模板 - 因此一个没有页眉/页脚,第二个继承自第一个,添加必要的附加内容 - 并让视图根据来自{{的模板参数决定呈现哪个模板1}}。使用此机制,每个模板都知道在它构建的URL中添加适当的模板类型。因此,包含标题的模板会构建将“完整”或“inapp”指示符作为“模板”参数传递给urls.py
的网址。
b)使用合成构建一个模板 - 因此模板有条件地包括页眉和页脚,具体取决于从视图传入的参数,而参数又决定根据urls.py
中的模板参数设置参数。使用此机制,模板知道通过查看视图设置的参数在其构建的URL中添加适当的模板类型。
a)的优点是您可以为独立模板和第三方模板构建完全不同的外观。此外,如果您要使用两个模板,则每个视图中两个网址中的urls.py
可能会有利;像:
urls.py
这样,您就可以在视图中进行reverse()次调用,在模板中进行url次调用,并动态构建链接。
b)的优点是您只需要维护一个模板。没有更新一个而忘记另一个的风险。
要回答你的第二个子问题,我想我需要一个例子来理解你的意思......
请注意,可能还有其他方法可以做到这一点。这就是我想到的方式。
答案 1 :(得分:2)
对于使用不同网址不是一个选项的情况,我可能有另一种选择(例如,当使用灯箱在iframe中打开链接时,但在新标签页中打开时,相同的链接已修改内容)。
我通过将以下脚本添加到可能在iframe中加载的页面的模板来解决了我的问题:
<script type="text/javascript">
function inIframe () {
try {
return window.self !== window.top;
} catch (e) {
return true;
}
}
if(inIframe()) {
$('header').css('display', 'none');
$('footer').css('display', 'none');
// or anything else you may want to do
}
</script>