Pyramid框架教程:视图定义与模板配置详解
pyramid Pyramid - A Python web framework 项目地址: https://gitcode.com/gh_mirrors/py/pyramid
视图基础概念
在Pyramid框架中,视图(View)是处理HTTP请求并返回响应的核心组件。视图通常是一个Python可调用对象,它接收请求信息并返回响应内容。Pyramid支持两种视图函数签名:
- 双参数形式:
def view(context, request)
- 单参数形式:
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>
最佳实践建议
- 视图组织:将相关视图分组到同一模块中,保持功能内聚
- 模板复用:通过宏和插槽机制实现模板复用,减少重复代码
- 响应处理:对于简单重定向可直接返回响应对象,复杂渲染返回字典
- 表单处理:遵循Post/Redirect/Get模式防止重复提交
- 资源定位:确保所有资源对象都有
__name__
和__parent__
属性
通过本教程,您应该已经掌握了Pyramid框架中视图定义和模板配置的核心概念。这些知识是构建Pyramid应用的基础,可以灵活应用于各种Web开发场景。
pyramid Pyramid - A Python web framework 项目地址: https://gitcode.com/gh_mirrors/py/pyramid
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考