Pyramid框架教程:视图定义与模板配置详解

Pyramid框架教程:视图定义与模板配置详解

pyramid Pyramid - A Python web framework pyramid 项目地址: https://gitcode.com/gh_mirrors/py/pyramid

视图基础概念

在Pyramid框架中,视图(View)是处理HTTP请求并返回响应的核心组件。视图通常是一个Python可调用对象,它接收请求信息并返回响应内容。Pyramid支持两种视图函数签名:

  1. 双参数形式:def view(context, request)
  2. 单参数形式:def view(request)

在基于遍历(traversal)的应用中,我们通常使用双参数形式,因为context参数代表了通过URL解析得到的资源对象,这对于构建内容管理系统(CMS)或Wiki系统非常有用。

项目依赖配置

在开始定义视图前,我们需要确保项目依赖配置正确。编辑pyproject.toml文件,添加必要的依赖:

[tool.poetry.dependencies]
python = "^3.8"
docutils = "*"

添加依赖后,需要重新安装项目:

pip install -e .

视图函数实现

1. view_wiki视图

view_wiki是Wiki应用的入口视图,负责重定向到首页:

from pyramid.httpexceptions import HTTPSeeOther

@view_config(context=models.Wiki)
def view_wiki(request):
    return HTTPSeeOther(location=request.route_url('view_page', pagename='FrontPage'))

关键点:

  • 使用@view_config装饰器指定上下文为Wiki模型
  • 返回HTTPSeeOther实现重定向
  • 使用request.route_url生成目标URL

2. view_page视图

view_page负责显示单个Wiki页面:

@view_config(context=models.Page, renderer='templates/view.pt')
def view_page(context, request):
    page = context
    # 处理WikiWord链接转换
    wikiwords = re.compile(r"\b([A-Z]\w+[A-Z]+\w+)")
    page_text = publish_parts(page.data, writer_name='html')['html_body']
    page_text = wikiwords.sub(check, page_text)
    
    return {
        'page': page,
        'page_text': page_text,
        'edit_url': request.route_url('edit_page', pagename=page.__name__)
    }

功能说明:

  • 将reStructuredText内容转换为HTML
  • 使用正则表达式识别并转换WikiWord为链接
  • 返回包含页面数据的字典供模板渲染

3. add_page视图

add_page处理新页面创建:

@view_config(name='add_page', context=models.Wiki, 
             renderer='templates/edit.pt')
def add_page(context, request):
    pagename = request.subpath[0]
    if 'form.submitted' in request.params:
        body = request.params['body']
        page = models.Page(body)
        page.__name__ = pagename
        page.__parent__ = context
        context[pagename] = page
        return HTTPSeeOther(location=request.route_url('view_page', pagename=pagename))
    
    save_url = request.route_url('add_page', pagename=pagename)
    page = models.Page('')
    page.__name__ = pagename
    page.__parent__ = context
    
    return {
        'page': page,
        'save_url': save_url
    }

关键逻辑:

  • 处理表单提交和非提交两种场景
  • 创建新页面并设置名称和父级关系
  • 使用重定向实现Post/Redirect/Get模式

4. edit_page视图

edit_page处理页面编辑:

@view_config(name='edit_page', context=models.Page, 
             renderer='templates/edit.pt')
def edit_page(context, request):
    if 'form.submitted' in request.params:
        context.data = request.params['body']
        return HTTPSeeOther(
            location=request.route_url('view_page', pagename=context.__name__))
    
    return {
        'page': context,
        'save_url': request.route_url('edit_page', pagename=context.__name__)
    }

特点:

  • 与add_page共享edit.pt模板
  • 直接修改context对象的数据属性
  • 同样采用Post/Redirect/Get模式

模板系统配置

Pyramid默认使用Chameleon模板引擎,支持ZPT(Zone Page Templates)模板语法。

1. 基础布局模板(layout.pt)

<!DOCTYPE html>
<html metal:define-macro="layout">
  <head>
    <title>
      <span tal:condition="hasattr(page, '__name__')" 
            tal:replace="page.__name__"/>
      <span tal:condition="not:hasattr(page, '__name__')" 
            tal:replace="title"/>
    </title>
  </head>
  <body>
    <div metal:define-slot="content"></div>
    <div>
      <a href="${request.route_url('view_page', pagename='FrontPage')}">
        Return to Front Page
      </a>
    </div>
  </body>
</html>

2. 页面查看模板(view.pt)

<div metal:use-macro="load: layout.pt">
  <div metal:fill-slot="content">
    <div tal:replace="structure page_text"/>
    <a href="${edit_url}">Edit this page</a>
  </div>
</div>

3. 编辑页面模板(edit.pt)

<div metal:use-macro="load: layout.pt">
  <div metal:fill-slot="content">
    <form action="${save_url}" method="post">
      <textarea name="body" rows="10" cols="60" 
                tal:content="page.data"/>
      <input type="submit" name="form.submitted" value="Save"/>
    </form>
  </div>
</div>

最佳实践建议

  1. 视图组织:将相关视图分组到同一模块中,保持功能内聚
  2. 模板复用:通过宏和插槽机制实现模板复用,减少重复代码
  3. 响应处理:对于简单重定向可直接返回响应对象,复杂渲染返回字典
  4. 表单处理:遵循Post/Redirect/Get模式防止重复提交
  5. 资源定位:确保所有资源对象都有__name____parent__属性

通过本教程,您应该已经掌握了Pyramid框架中视图定义和模板配置的核心概念。这些知识是构建Pyramid应用的基础,可以灵活应用于各种Web开发场景。

pyramid Pyramid - A Python web framework pyramid 项目地址: https://gitcode.com/gh_mirrors/py/pyramid

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宗鲁宽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值