Pyramid 模板

2023-03-30 17:32 更新

默认情况下,一个视图函数的响应的内容类型是纯文本的。In order to render HTML, the text of the response body may include HTML tags, as in the following example −

例子

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的方法,尤其是当它可能包含某些变量数据时,是非常麻烦的。为此,网络框架使用模板库。模板库将变量数据与原本静态的HTML代码合并起来,动态地生成和呈现网页。

模板绑定

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

模板语言Pyramid绑定默认扩展
Chameleonpyramid_chameleon.pt, .txt
Jinja2pyramid_jinja2.jinja2
Makopyramid_mako.mak, .mako

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

pip3 install pyramid_jinja2

然后我们需要将其纳入应用程序的配置中。

config.include('pyramid_jinja2')

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

render_to_response(renderer_name, value, request)

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

将下面的HTML脚本作为 hello.jinja2 保存在 templates 文件夹中。

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

Jinja2模板库

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

表达式

  • {{ …}}表示要打印到模板输出的表达式。
  • {% … %} 用于语句。

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

条件式

  • {% if expr %}{% else %}

  • {% else %}

  • {% endif %}{% endif %}

循环

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

  • {% 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的view callable返回的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() 装饰器的渲染器参数可以设置为模板网页(必须存在于模板文件夹中)。前提条件是必须安装模板库的适当的Python绑定,并且应用程序的配置必须包括该绑定。

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

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 “扩展。

我们可以改变应用程序的配置,让.html扩展名在”.jinja2 “之外被使用。这是由 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模式由一个或多个占位符参数组成,它们的值会随着请求以 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代码将学生作为一个字典对象的列表,每个字典都有一个学生的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 代码。The http://localhost:6543/ link renders the following tabular result −

Python Pyramid - 模板



以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号