• Python web 框架:web.py 【函数】


    函数-$def

    函数定义也是与在python中类似,用def,只是也要在前面加$,代码也要注意$的使用和缩进:

    1 $def hello(name=""):
    2 Hello $name!

    函数调用也是用$加函数名的形式:

    1 $hello("Lisa")

    当然,定义函数时也可以与html代码混编:

    1 $def hello(name=""):
    2 <strong/>Hello $name!</strong>

    但是调用的时候需要在函数名前用$:前缀,否则html代码将以plain text形式打印到页面上。

    1 $:hello("Lisa")

    输出程序代码-$code块

    如果想在模板里输入写一段python代码而又不想被$所烦恼,那么可以用到$code块。

    页面上输出一段代码而不希望被系统理解为模板程序代码,就需要用到$code命令,比如在模板文件中写入下面一段:

    1 $code:
    2     x=10
    3     def print_num(num):
    4     return "num is %d" % num

    然后再加上下面代码:

    1 $print_num(x)
    2 <br/>
    3 $x

    这里就用在$code块中定义的print_num函数以x变量为参数在页面上输出一行:num is 10

    然后下一行直接引用x变量,直接在页面上输出数字10。

    $var

    $var命令可以在模板中定义变量,在其他地方引用此模板对象的时候可以访问此定义的变量。
    比如我们可以在index.html中添加如下一行:$var vara: this is vara
    表示定义了一个名为vara的变量,变量值是字符串this is vara。
    把index的GET函数改为:

    1 def GET(self):
    2     render=web.template.render("templates")
    3     return render.index("Lisa", "Hayes").vara

    那么结果显示在页面上的就是this is vara这句话。要注意一点的是,这种变量是字符串,即便如下定义变量:$var vara: 0

    Vara也并不是数字0,如果把GET函数最后改成:return render.index(“Lisa”, “Hayes”).vara+1

    会导致程序出错。如果希望得到期望中的结果1,则需要如下形式代码:return int(render.index(“Lisa”, “Hayes”).vara)+1

    builtins and globals

    在模板中,用户可以直接使用python的内建函数和变量,写函数变量包括range, min, max 以及 True 和 False等。 除此之外,如果希望在模板中使用其他的非内建功能,就需要一点特殊操作。要在创建render的时候显式指定所需要的功能函数。

    1 import web
    2 import markdown
    3  
    4 globals = {'markdown': markdown.markdown}
    5 render =web.template.render('templates', globals=globals)

    这样,在模板中就可以用$markdown来引用markdown.markdown了。同样,也可以用这种办法来禁用builtins

    1 # disable all builtins
    2 render = web.template.render('templates', builtins={})

    模板复用

    当多个页面有着相同的结构框架的时候,为每一个页面单独维护一个模板就显得比较麻烦,web.py提供了一种简易的解决方法。
    这时候就要用到创建render时使用base参数:

    1 render=web.template.render("templates",base="layout")
    2 return render.index("Lisa", "Hayes")

    这个layout表示要以templates下的layout.html模板为通用模板框架。因此我们还要在templates目录下新建一个layout.html文件,写下如下代码:

     1 $def with (content)
     2     <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
     3     <html xmlns="http://www.w3.org/1999/xhtml">
     4     <head>
     5         <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     6         <title>Layout</title>
     7     </head>
     8     <body>
     9         $:content
    10     </body>
    11 </html>

    可以看到,这个模板文件必须是有一个参数content。然后修改index.html,只保留如下代码,其他删掉:

    1 $def with(gname, fname)
    2     Hi, $(gname) $(fname)

    运行程序,页面上打印Hi, Lisa Hayes,查看代码会发现最终代码就是index.html和layout.html合并在一起的结果,index.html中的内容被嵌入到layout.html中的$:content处。
    在layout.html模板中还可以引用index.html中定义的var变量,这为程序带来了更多的灵活性,比如我们希望在不同的页面在使用同一个layout模板的时候能有不同的title,可以在使用layout的模板中定义如下一个var变量:$var title:This is index.html
    然后在layout.html中的title处修改为:<title>$content.title</title>
    这样,访问index.html时显示在浏览器上的title就是This is index.html,而不是原来的Layout了。

    在模板中使用python代码模块

    在默认状态下,在模板中是不能直接调用其他python代码模块文件中的程序的,必须做一些额外的操作。
    首先,我们新建一个模块,叫module1.py,在里面写一个函数:

    1 def hello_from_m1(name=""):
    2     return "hello %s, this is module1" % name

    在main.py里导入module1:import module1

    并且修改GET函数中创建render的代码为:

    1 def GET(self):
    2     render=web.template.render("templates",base="layout",globals={"m1":module1})
    3     return render.index("Lisa")

    globals参数中传递的是一个字典,key以字符串表示模块在模板中使用时的名称,value部分就是这个要在模块中使用的模块或对象的真实名称了。
    最后在要使用此模块的模板中就可以用$m1来引用此模块了。比如在index.html中添加下面一行代码:$m1.hello_from_m1(gname)
    就会调用module1中的hello_from_m1函数,在页面上打印出:hello Lisa, this is module1

    在web.py模板中使用jQuery

    1 <script type="text/javascript">
    2 $(document).ready(function()
    3 {
    4     alert("It works.");
    5 });
    6 </script>
  • 相关阅读:
    POJ 1019 组合计数
    POJ 3252 组合计数
    SPJ 与 Student 数据库的创建于数据插入
    POJ 1496 POJ 1850 组合计数
    Java常用类库--大数处理类
    POJ 2492 并查集应用的扩展
    POJ 3268 双向Dijkstra
    线段树(带删除节点)
    西工大10级保研机试 柱状图
    KMP专场 POJ
  • 原文地址:https://www.cnblogs.com/chidao/p/12957983.html
Copyright © 2020-2023  润新知