99re热这里只有精品视频,7777色鬼xxxx欧美色妇,国产成人精品一区二三区在线观看,内射爽无广熟女亚洲,精品人妻av一区二区三区

Pyramid 模板

2023-03-30 17:32 更新

默認(rèn)情況下,一個(gè)視圖函數(shù)的響應(yīng)的內(nèi)容類型是純文本的。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()

輸出

啟動(dòng)服務(wù)器后(通過(guò)運(yùn)行上述代碼),訪問(wèn) http://localhost:6543/ ,瀏覽器顯示以下輸出 –

Python Pyramid - 模板

然而,這種渲染HTML的方法,尤其是當(dāng)它可能包含某些變量數(shù)據(jù)時(shí),是非常麻煩的。為此,網(wǎng)絡(luò)框架使用模板庫(kù)。模板庫(kù)將變量數(shù)據(jù)與原本靜態(tài)的HTML代碼合并起來(lái),動(dòng)態(tài)地生成和呈現(xiàn)網(wǎng)頁(yè)。

模板綁定

Pyramid通過(guò)與流行的模板庫(kù)(如jinja2、Mako和Chameleon)的綁定來(lái)提供模板支持。

模板語(yǔ)言Pyramid綁定默認(rèn)擴(kuò)展
Chameleonpyramid_chameleon.pt, .txt
Jinja2pyramid_jinja2.jinja2
Makopyramid_mako.mak, .mako

首先,我們需要安裝相應(yīng)的Python庫(kù)來(lái)使用所需的模板庫(kù)。例如,為了使用jinja2模板,使用PIP安裝程序安裝 pyramid_jinja2 。

pip3 install pyramid_jinja2

然后我們需要將其納入應(yīng)用程序的配置中。

config.include('pyramid_jinja2')

pyramid.renderers模塊定義了render_to_response()函數(shù)。它與以下參數(shù)一起使用 –

render_to_response(renderer_name, value, request)

renderer_name 是模板網(wǎng)頁(yè),通常保存在應(yīng)用程序目錄下的templates子文件夾中,value參數(shù)是作為上下文傳遞給模板的字典,以及從WSGI環(huán)境獲得的請(qǐng)求對(duì)象。

將下面的HTML腳本作為 hello.jinja2 保存在 templates 文件夾中。

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

Jinja2模板庫(kù)

這里,’name’是一個(gè)jinja2模板變量。jinja2模板語(yǔ)言在HTML腳本中插入變量和編程結(jié)構(gòu),使用以下語(yǔ)法—-。

表達(dá)式

  • {{ …}}表示要打印到模板輸出的表達(dá)式。
  • {% … %} 用于語(yǔ)句。

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

條件式

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

  • {% else %}

  • {% endif %}{% endif %}

循環(huán)

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

  • {% endfor %}

在hello.jinja2 {{ name }}中,’name’上下文變量的值在視圖響應(yīng)中被動(dòng)態(tài)渲染。

渲染模板

hello_world() 視圖函數(shù)通過(guò)調(diào)用 render_to_response() 函數(shù)直接渲染這個(gè)模板。它還向模板發(fā)送了一個(gè)上下文值。

from pyramid.renderers import render_to_response

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

例子

像往常一樣,這個(gè)視圖被添加到hello路由中,指向/URL。完整的應(yīng)用代碼如下

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()

輸出

運(yùn)行服務(wù)器并訪問(wèn) http://localhost:6543/ 。瀏覽器顯示以下結(jié)果 –

Python Pyramid - 模板

每個(gè)視圖都必須返回一個(gè)響應(yīng)對(duì)象。 render_to_response() 函數(shù)是一個(gè)快捷函數(shù),實(shí)際上返回一個(gè)響應(yīng)對(duì)象。這使得上面的 hello_world 視圖可以簡(jiǎn)單地直接返回它對(duì) render_to_response() 的調(diào)用結(jié)果。

另一方面, pyramid.renderers.render() 函數(shù)將一個(gè)模板渲染成一個(gè)字符串。我們可以直接制造一個(gè)響應(yīng)對(duì)象,并使用該字符串作為響應(yīng)的主體。

讓我們把 hello_world() 的視圖函數(shù)修改如下

from pyramid.renderers import render

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

剩余的代碼是一樣的,瀏覽器也顯示了與上面相同的輸出。

通過(guò)配置進(jìn)行渲染

如前所述,Pyramid的view callable返回的HTTP響應(yīng)的content_type是text/plain。然而,如果@view_config裝飾器的渲染器參數(shù)被指定為這些值中的任何一個(gè),它可以被改變?yōu)樽址SON或JSONP。因此,Pyramid有以下內(nèi)置的呈現(xiàn)器 –

  • JSON
  • String
  • JSONP

例子

在下面的例子中,hello_world()視圖函數(shù)被配置為渲染JSON響應(yīng)。

from pyramid.view import view_config

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

輸出

將渲染器類型設(shè)置為JSON,也將HTTP響應(yīng)的 content_type 頭設(shè)置為 application/json。 瀏覽器會(huì)顯示JSON響應(yīng),如下圖所示。

Python Pyramid - 模板

@view_config() 裝飾器的渲染器參數(shù)可以設(shè)置為模板網(wǎng)頁(yè)(必須存在于模板文件夾中)。前提條件是必須安裝模板庫(kù)的適當(dāng)?shù)腜ython綁定,并且應(yīng)用程序的配置必須包括該綁定。

我們已經(jīng)安裝了python_jinja2包,這樣我們就可以使用jinja2模板被hello_world()視圖函數(shù)渲染,通過(guò)@view_config()的渲染器參數(shù)進(jìn)行裝飾。

hello.jinja2模板的HTML代碼如下所示

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

裝飾后的hello_world()函數(shù)寫成–

from pyramid.view import view_config

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

例子

在這種情況下,視圖函數(shù)返回一個(gè)字典對(duì)象。它被提供給模板作為上下文數(shù)據(jù),可以在模板語(yǔ)言語(yǔ)法元素的幫助下插入HTML文本中。

渲染一個(gè)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()

輸出

帶有由 視圖 函數(shù)提供的變量數(shù)據(jù)的模板網(wǎng)頁(yè)看起來(lái)如下 –

Python Pyramid - 模板

添加/改變渲染器

模板只不過(guò)是穿插了模板語(yǔ)言語(yǔ)法的網(wǎng)頁(yè)。盡管Pyramid將jinja2模板的默認(rèn)擴(kuò)展名為”.jinja2″,但既定做法是使用網(wǎng)頁(yè)的”.html “擴(kuò)展。

我們可以改變應(yīng)用程序的配置,讓.html擴(kuò)展名在”.jinja2 “之外被使用。這是由 add_jinja2_renderer .

config.add_jinja2_renderer(".html")

hello.jinja2 模板現(xiàn)在被重新命名為hello.html。為了能使用這個(gè)模板,我們把視圖函數(shù)的定義改成下面的代碼 ?

from pyramid.view import view_config

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

同時(shí),我們通過(guò)添加”.html “渲染器來(lái)修改Configurator對(duì)象的屬性。

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()

來(lái)自matchdict的模板上下文

如前所述,如果路由配置中的URL模式由一個(gè)或多個(gè)占位符參數(shù)組成,它們的值會(huì)隨著請(qǐng)求以 matchdict 對(duì)象的形式傳遞,而這又可以作為上下文數(shù)據(jù)傳遞給要渲染的模板。

對(duì)于我們下一個(gè)例子, hello.html - jinja2模板保持不變。

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

我們知道,上下文變量’name’的值是由視圖函數(shù)傳遞的。然而,它不是傳遞一個(gè)硬編碼的值(如前面的例子),而是從 matchict 對(duì)象中獲取其值。這個(gè)對(duì)象是由URL字符串中的路徑參數(shù)填充的。

from pyramid.view import view_config

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

例子

修改后的應(yīng)用程序代碼如下

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()

輸出

啟動(dòng)服務(wù)器,打開(kāi)瀏覽器并輸入U(xiǎn)RL http://localhost:6543/Tutorialspoint 。尾部的字符串成為 matchdict 中’name’鍵的值  它被jinja2模板所利用,并呈現(xiàn)出以下輸出。

Python Pyramid - 模板

模板中的條件和循環(huán)

jinja2模板語(yǔ)言允許將條件語(yǔ)句和循環(huán)結(jié)構(gòu)包含在HTML腳本中。這些編程元素的jinja2語(yǔ)法如下—-。

條件語(yǔ)句

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

循環(huán)

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

可以看出,jinja2的語(yǔ)法與Python的if和for語(yǔ)句非常相似。除了,jinja2不使用縮進(jìn)來(lái)標(biāo)記塊。相反,每個(gè)if都必須有一個(gè)endif語(yǔ)句。同樣,對(duì)于每個(gè)for語(yǔ)句,也必須有一個(gè)endfor語(yǔ)句。

例子

下面的例子演示了模板條件和循環(huán)語(yǔ)句的使用。首先,Pyramid代碼將學(xué)生作為一個(gè)字典對(duì)象的列表,每個(gè)字典都有一個(gè)學(xué)生的ID、名字和百分比。這個(gè)列表對(duì)象被作為上下文傳遞給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()

將這個(gè)程序保存為marklist.py?,F(xiàn)在,下面的HTML腳本必須被保存為marklist.html。它遍歷了從視圖函數(shù)收到的學(xué)生列表對(duì)象,并以HTML表格的形式顯示學(xué)生數(shù)據(jù)。第四列顯示通過(guò)/失敗的結(jié)果,使用jinja2的if語(yǔ)句語(yǔ)法。

<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>

輸出

運(yùn)行 marklist.py 代碼。The http://localhost:6543/ link renders the following tabular result ?

Python Pyramid - 模板



以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)