模板在已有的编程语言中是一项相当健康的业务,但有哪些好的可以在JavaScript中处理?
"模板"是指接受数据对象作为输入的文档,将数据插入某种序列化标记语言,并输出标记.众所周知的例子是JSP,原始的PHP,XSLT.
"好",我的意思是HTML作者的声明和容易编写,它是健壮的,并且它也支持其他语言.比我所了解的选项更好.一些"不好"的例子:
字符串数学:
element.innerHTML = "<p>Name: " + data.name
+ "</p><p>Email: " + data.email + "</p>";
Run Code Online (Sandbox Code Playgroud)
显然太笨重,HTML结构不明显.
XSLT:
<p><xsl:text>Name: </xsl:text><xsl:value-of select="//data/name"></p>
<p><xsl:text>Email: </xsl:text><xsl:value-of select="//data/email"></p>
Run Code Online (Sandbox Code Playgroud)
//结构上这很好用,但是让我们面对它,XSLT会混淆HTML开发人员.
Trimpath:
<p>Name: ${data.name}</p><p>Email: ${data.email}</p>
Run Code Online (Sandbox Code Playgroud)
//这很好,但处理器仅在JavaScript中受支持,并且该语言有点原始(http://code.google.com/p/trimpath/wiki/JavaScriptTemplateSyntax).
我很想看到一个JSP或ASP或PHP的子集移植到浏览器,但我还没有找到.
现在人们在JavaScript中使用什么来模仿它们?
几个月后,这里发布了大量可行的模板语言,但大多数语言都不能用于任何其他语言.大多数这些模板无法在JavaScript引擎之外使用.
例外是微软 - 您可以在浏览器或任何其他ASP引擎中处理相同的ASP.由于您已经绑定到Microsoft系统,因此它有自己的一组可移植性问题.我已经将其标记为答案,但我仍然对更便携的解决方案感兴趣.
感谢所有输入到目前为止!
Jython在带有安全管理器的JVM中运行.安全管理器不应该阻止Jython引擎本身完成它的工作,但它不应该允许在Jython中运行的python脚本执行任何特权操作.完成此任务的最低Java安全策略是什么?
这个问题是关于使用Java的安全机制来沙箱不受信任的python脚本.(我不想讨论沙盒python的其他方法.)如果这种安全方法存在根本性的错误,请说明.
不受信任的python代码将调用受信任的Java对象上的方法,并将作为PyObject嵌入Java中.这在Jythonbook的例子中有解释,我们将使用该示例中的代码.这是Java 1.6上的Jython 2.5.2.
我们需要向安全管理器提供一些非常具体的指令,因为Jython会执行自己的一些特权操作,但它也会执行不受信任的python代码,这些代码不应具有任何特权.
首先,为了安全起见,我们在Java VM中安装了一个SecurityManager:
/home/me% export CLASSPATH=.:jython.jar
/home/me% javac ./org/jython/book/interfaces/BuildingType.java ./org/jython/book/Main.java ./org/jython/book/util/BuildingFactory.java
/home/me% java org.jython.book.Main
Building Info: null BUILDING-A 100 WEST MAIN
Building Info: null BUILDING-B 110 WEST MAIN
Building Info: null BUILDING-C 120 WEST MAIN
Run Code Online (Sandbox Code Playgroud)
大.但对我们来说,Building.py是不受信任的代码,所以我们锁定了JVM.问题是,这使Jython陷入瘫痪:
/home/me% java -Djava.security.manager org.jython.book.Main
Jul 23, 2013 7:07:17 PM org.python.google.common.base.internal.Finalizer getInheritableThreadLocalsField
INFO: Couldn't access Thread.inheritableThreadLocals. Reference finalizer threads will inherit thread local values.
Exception in thread "main" java.security.AccessControlException: access denied (java.util.PropertyPermission user.dir read)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323) …Run Code Online (Sandbox Code Playgroud) PyYAML可以处理常规python对象中的循环图.例如:
片段#1.
class Node: pass
a = Node()
b = Node()
a.child = b
b.child = a
# We now have the cycle a->b->a
serialized_object = yaml.dump(a)
object = yaml.load(serialized_object)
Run Code Online (Sandbox Code Playgroud)
此代码成功,因此显然有一些机制可以在加载序列化对象时阻止无限递归.当我编写自己的YAML构造函数时,如何利用它?
例如,假设Node是具有瞬态域的一类foo和bar,以及intransient场child.只child应将其纳入yaml文档.我希望这样做:
小片#2.
def representer(dumper, node):
return dumper.represent_mapping("!node", {"child": node.child})
def constructor(loader, data):
result = Node()
mapping = loader.construct_mapping(data)
result.child = mapping["child"]
return result
yaml.add_representer(Node, representer)
yaml.add_constructor("!node", constructor)
# Retry object cycle a->b->a from earlier code snippet
serialized_object = …Run Code Online (Sandbox Code Playgroud)