Python Pyramid 模板

Python Pyramid 模板

默认情况下,视图函数的响应内容类型是纯文本。为了渲染HTML,响应体的文本可能包含HTML标签,如下面的示例所示:

示例

from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.response import Response

def hello_world(request):
   return Response('<h1 style="text-align:center;">Hello World!</h1>')

if __name__ == '__main__':
   with Configurator() as config:
      config.add_route('hello', '/')
      config.add_view(hello_world, route_name='hello')
      app = config.make_wsgi_app()
   server = make_server('0.0.0.0', 6543, app)
   server.serve_forever()

输出

启动服务器(运行上面的代码)后,访问以下链接: http://localhost:6543/ ,浏览器会呈现以下输出:

Python Pyramid 模板

然而,这种将HTML呈现出来的方法,特别是当它可能包含某些可变数据时,非常繁琐。为此,Web框架使用模板库。模板库将可变数据与其他静态的HTML代码合并,以动态生成和呈现网页。

模板绑定

Pyramid通过与流行的模板库(如jinja2、Mako和Chameleon)进行绑定,提供了模板支持。

Template Language Pyramid Bindings Default Extensions
Chameleon pyramid_chameleon .pt, .txt
Jinja2 pyramid_jinja2 .jinja2
Mako pyramid_mako .mak, .mako

首先,我们需要安装相应的Python库以使用所需的模板库。例如,要使用jinja2模板,使用PIP安装程序安装 pyramid_jinja2

pip3 install pyramid_jinja2

然后我们需要将它包含在应用程序配置中。

config.include('pyramid_jinja2')

The pyramid.renderers模块定义了render_to_response()函数。它使用以下参数 –

render_to_response(renderer_name, value, request)

renderer_name是模板网页,通常保存在应用程序目录的模板子文件夹中,value参数是作为上下文传递给模板的字典,并从WSGI环境中获取请求对象。

将以下HTML脚本保存为hello.jinja2文件,放在templates文件夹中。

<html>
   <body>
      <h1>Hello, {{ name }}!</h1>
   </body>
</html>

Jinja2模板库

在这里,’name’是一个jinja2模板变量。jinja2模板语言使用以下语法将变量和编程结构插入到HTML脚本中 −

表达式

  • {{ ... }}用于输出表达式到模板输出。

  • {% ... %} 用于语句。

  • {# ... #} 用于在模板输出中不包含的注释。

条件语句

  • {% if expr %}

  • {% else %}

  • {% endif %}

循环

  • {% for var in iterable %}

  • {% endfor %}

在hello.jinja2中,{{ name }}中的值是动态渲染为视图响应中的’name’上下文变量。

渲染模板

hello_world() 视图函数通过调用 render_to_response() 函数直接呈现此模板。它还向模板发送上下文值。

from pyramid.renderers import render_to_response

def hello_world(request):
   return render_to_response('templates/hello.jinja2',{'name':'Tutorialspoint'},
request=request)

示例

和往常一样,这个视图被添加到hello路由中,指向/ URL。完整的应用代码如下:

from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.response import Response
from pyramid.renderers import render_to_response

def hello_world(request):
   return render_to_response('templates/hello.jinja2', {'name':'Tutorialspoint'}, request=request)

if __name__ == '__main__':
   with Configurator() as config:
      config.add_route('hello', '/')
      config.include('pyramid_jinja2')
      config.add_view(hello_world, route_name='hello')
      app = config.make_wsgi_app()
   server = make_server('0.0.0.0', 6543, app)
   server.serve_forever()

输出

运行服务器并访问 http://localhost:6543/ 。浏览器将显示以下结果−

Python Pyramid 模板

每个视图必须返回一个响应对象。 render_to_response() 函数是一个快捷函数,实际上返回一个响应对象。 这使得上面的 hello_world 视图可以直接返回其对 render_to_response() 调用的结果。

另一方面, pyramid.renderers.render() 函数将模板呈现为字符串。 我们可以直接制作一个响应对象,并使用该字符串作为响应的主体。

让我们将 hello_world() 视图函数更改如下 –

from pyramid.renderers import render

def hello_world(request):
   retval = render('templates/hello.jinja2',
   {'name':'Tutorialspoint'}, request=request)
   return Response(retval)

代码保持不变,浏览器也会显示与上述相同的输出。

通过配置进行渲染

如前所述,Pyramid视图可调用的HTTP响应的content_type为text/plain。然而,如果@view_config装饰器的渲染器参数被赋予任何这些值之一,它可以被修改为字符串、JSON或JSONP。因此,Pyramid提供了以下内置的渲染器:

  • JSON

  • String

  • JSONP

示例

在下面的示例中,hello_world()视图函数被配置为渲染JSON响应。

from pyramid.view import view_config

@view_config(route_name='hello',renderer='json')
def hello_world(request):
   return {'content':'Hello World!'}

输出

将渲染器类型设置为 JSON 同时也将 HTTP 响应的 content_type 标头设置为 application/json 。浏览器显示的 JSON 响应如下图所示 −

Python Pyramid 模板

@view_config()装饰器的renderer参数可以设置为模板网页(必须存在于templates文件夹中)。前提条件是必须安装模板库的适当Python绑定,并且应用配置必须包含该绑定。

我们已经安装了python_jinja2包,这样我们就可以使用jinja2模板通过hello_world()视图函数进行渲染,使用@view_config()装饰器的renderer参数进行装饰。

hello.jinja2模板HTML代码如下:

<html>
   <body>
      <h1>Hello, {{ name }}!</h1>
   </body>
</html>

装饰的hello_world()函数如下所示:

from pyramid.view import view_config

@view_config(route_name='hello', renderer='templates/hello.jinja2')
def hello_world(request):
   return {'name':'Pyramid!'}

示例

在这种情况下,视图函数返回一个字典对象。它作为上下文数据可用于模板,并且可以通过模板语言语法元素插入到HTML文本中。

渲染jinja2模板的完整代码如下所示 −

from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.response import Response
from pyramid.view import view_config

@view_config(route_name='hello', renderer='templates/hello.jinja2')
def hello_world(request):
   return {'name':'Pyramid!'}

if __name__ == '__main__':
   with Configurator() as config:
      config.include('pyramid_jinja2')
      config.add_route('hello', '/')
      config.scan()
      app = config.make_wsgi_app()
   server = make_server('0.0.0.0', 6543, app)
   server.serve_forever()

输出

由视图函数提供的可变数据,生成的模板网页如下所示−

Python Pyramid 模板

添加/更改渲染器

模板只不过是由模板语言语法插入的网页。尽管Pyramid将jinja2模板的默认扩展名设为”.jinja2″,但已有的惯例是使用”.html”扩展名来表示网页。

我们可以改变应用程序配置,以便除了”.jinja2″外还可以使用”.html”扩展名。这可以通过 add_jinja2_renderer 来实现。

config.add_jinja2_renderer(".html")

hello.jinja2 模板现在改名为hello.html。为了能够使用这个模板,让我们将视图函数的定义更改为以下代码-

from pyramid.view import view_config

@view_config(route_name='hello', renderer='templates/hello.html')
def hello_world(request):
   return {'name':'Pyramid!'}

同时,我们通过添加“.html”渲染程序来修改Configurator对象的属性。

if __name__ == '__main__':
   with Configurator() as config:
      config.include('pyramid_jinja2')
      config.add_jinja2_renderer(".html")
      config.add_route(hello, '/')
      config.scan()
      app = config.make_wsgi_app()
   server = make_server('0.0.0.0', 6543, app)
   server.serve_forever()

来自matchdict的模板上下文

如前所述,如果路由配置中的URL模式包含一个或多个占位符参数,它们在请求URL中的值将作为 matchdict 对象随请求一起传递,并且可以作为上下文数据传递给要渲染的模板。

对于我们的下一个示例, hello.html - jinja2模板保持不变。

<html>
   <body>
      <h1>Hello, {{ name }}!</h1>
   </body>
</html>

我们知道上下文变量’name’的值是由视图函数传递的。然而,与之前的例子不同,它的值不是硬编码的,而是从 matchict 对象中获取的。这个对象由URL字符串中的路径参数填充。

from pyramid.view import view_config

@view_config(route_name='index', renderer='templates/hello.html')
def index(request):
   return {'name':request.matchdict['name']}

示例

修改后的应用程序代码如下:

from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.response import Response
from pyramid.view import view_config

@view_config(route_name='index', renderer='templates/hello.html')
def index(request):
   return {'name':request.matchdict['name']}
if __name__ == '__main__':
   with Configurator() as config:
      config.include('pyramid_jinja2')
      config.add_jinja2_renderer(".html")
      config.add_route('index', '/{name}')
      config.scan()
      app = config.make_wsgi_app()
   server = make_server('0.0.0.0', 6543, app)
   server.serve_forever()

输出

启动服务器,打开浏览器并输入URL http://localhost:6543/Tutorialspoint 。尾部的字符串成为’matchdict’中键’name’的值。它被jinja2模板使用,并渲染以下输出。

Python Pyramid 模板

条件和循环在模板中

jinja2 模板语言允许在 HTML 脚本中包含条件语句和循环结构。这些编程元素的 jinja2 语法如下所示 −

条件

{% if expr %}
HTML
{% else %}
HTML
{% endif %}

循环

{% for var in iterable %}
HTML
{% endfor %}

可以看出,jinja2语法非常类似于Python的if和for语句。不同的是,jinja2不使用缩进来标记块,而是对每个if语句都要有一个endif语句,对每个for语句都要有一个endfor语句。

示例

下面的示例演示了如何使用模板的条件语句和循环语句。首先,Pyramid代码使用students作为一个包含字典对象的列表,每个字典包含学生的id、姓名和百分比。这个列表对象作为上下文传递到marklist.html模板中。

from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.response import Response
from pyramid.view import view_config

students = [
   {"id": 1, "name": "Ravi", "percent": 75},
   {"id": 2, "name": "Mona", "percent": 80},
   {"id": 3, "name": "Mathews", "percent": 45},
]

@view_config(route_name='index', renderer='templates/marklist.html')

def index(request):
   return {'students':students}
if __name__ == '__main__':
   with Configurator() as config:
      config.include('pyramid_jinja2')
      config.add_jinja2_renderer(".html")
      config.add_route('index', '/')
      config.scan()
   app = config.make_wsgi_app()
   server = make_server('0.0.0.0', 6543, app)
   server.serve_forever()

将这个程序保存为marklist.py。现在,以下HTML脚本必须保存为marklist.html。它遍历从视图函数接收到的学生列表对象,并以HTML表格的形式呈现学生数据。 第四列使用jinja2 if语句语法显示通过/不通过的结果。

<html>
<body>
   <table border=1>
      <thead> 
         <tr>
            <th>Student ID</th> <th>Student Name</th>
            <th>percentage</th>
            <th>Result</th>
         </tr> 
      </thead>
      <tbody>
         {% for Student in students %}
            <tr> 
               <td>{{ Student.id }}</td> 
               <td>{{ Student.name }</td>
               <td>{{ Student.percent }}</td>
               <td>
                  {% if Student.percent>=50 %}
                  Pass
                  {% else %}
                  Fail
                  {% endif %}
               </td> 
            </tr>
         {% endfor %}
      </tbody>
   </table>
</body>
</html>

输出

运行 marklist.py 代码。链接 http://localhost:6543/ 将呈现以下表格结果-

Python Pyramid 模板

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程