我们定期在主页的日历提要中显示损坏的图像,http://cnr.foo.edu 。问题似乎是我们将提要拉入主页的脚本前置 http://events.foo.edu到所有图像 URL 上,当相关图像托管在远程服务器而不是日历网络服务器上时,这会导致失败。如何调整脚本,以便在图像 URL 已包含 http 的情况下它不会添加根日历 URL?
这是我需要修改的 python 脚本片段:
<div class="campus-calendar-event">
<div class="image-left" style="width: 40px;" tal:condition="python: event['Image']">
<a tal:attributes="href python:'http://events.foo.edu/index.php/calendar/sn/coe.html?event_ID=%s' % event['ID'];
title python: event['Title']">
<img tal:condition="python: event['Image']"
tal:attributes="src python: 'http://events.foo.edu%s' % event['Image']['URL'];
alt python: event['Title'];
width string:40px " /></a>
</div>
如果“URL”已经包含“http”(远程服务器的链接),如何添加“if”语句以省略“http://events.foo.edu”部分?感谢您的帮助!
最佳答案
作为权宜之计,这可能会起作用(未经测试 - 我家里没有安装):
<img tal:define="url python: event['Image'] and event['Image']['URL'];"
tal:condition="python: event['Image']"
tal:attributes="src python: url if url.startswith('http') else 'http://events.foo.edu%s' % (url,);
alt python: event['Title'];
width string:40px " /></a>
(请注意,您的代码无法处理没有条目 URL
的 event['Image']
,我的代码也不会。)
不过,使用 urlsplit
/urljoin
可能有一个更优雅的解决方案,它将您的 url 分解为协议(protocol)、服务器、路径、查询、片段和您可以从那里重新组装它。
具体来说,我们定义了一个变量 url
来节省我们的打字时间——我们首先必须再次检查 event['Image']
是否存在。整个标记受执行此操作的 tal:condition
保护,但执行顺序始终为 define
、condition
、repeat
、内容
/替换
、属性
、省略
;这样您就可以定义一个变量并在条件子句中使用它。我们可以将其命名为 URL
,但我通常不会用全大写来命名变量。 python 中的 x 和 y 如果为假则生成 x 的值,如果为真则生成 y 的值,所以在通常情况下,我们将从您的对象中获取 url-ish 字符串。
新的属性子句可能会令人困惑,因为它的括号不足:更详细地说,它是
url if url.startswith('http') else ('http://events.foo.edu%s' % (url,));
所以这是通常的字符串格式。看看 %s
的结尾,我们可能会说 'http://events.foo.edu'+url
,但是“不要连接常量和用户数据在一起”触发了我的“这是否是一个可能的命令注入(inject)漏洞”反射。
关于python - Plone CMS 日历源中的图像损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23303075/