- Python Pyramid教程
- Python Pyramid - 主页
- Python Pyramid - 概述
- Pyramid - 环境设置
- Python Pyramid - Hello World
- Pyramid - 应用程序配置
- Python Pyramid - URL 路由
- Python Pyramid - 查看配置
- Python Pyramid - 路由前缀
- Python Pyramid - 模板
- Pyramid - HTML 表单模板
- Python Pyramid - 静态资源
- Python Pyramid - 请求对象
- Python Pyramid - 响应对象
- Python Pyramid - 会话
- Python Pyramid - 事件
- Python Pyramid - 消息闪烁
- Pyramid - 使用 SQLAlchemy
- Python Pyramid - Cookiecutter
- Python Pyramid - 创建项目
- Python Pyramid - 项目结构
- Python Pyramid - 包结构
- 手动创建项目
- 命令行Pyramid
- Python Pyramid - 测试
- Python Pyramid - 日志记录
- Python Pyramid - 安全
- Python Pyramid - 部署
- Python Pyramid有用资源
- Python Pyramid - 快速指南
- Python Pyramid - 有用的资源
- Python Pyramid - 讨论
Python Pyramid - 包结构
Cookiecutter 实用程序会自动在同名的父项目文件夹中创建一个包文件夹。包文件夹包含以下文件和子文件夹。
__init__.py
文件夹需要__init__.py文件才能被视为 Python 包。testproj包也有这个文件,它实质上为development.ini声明了 Pyramid WSGI 应用程序项目,以将其用作入口点。
应用程序对象由main()函数返回。它通过包含在运行 cookiecutter 时选择的模板库(包括路由模块)并通过扫描现有包将视图添加到配置器来配置应用程序注册表。以下 Python 代码自动生成为__init__.py文件。
from pyramid.config import Configurator def main(global_config, **settings): """ This function returns a Pyramid WSGI application. """ with Configurator(settings=settings) as config: config.include('pyramid_jinja2') config.include('.routes') config.include('.models') config.scan() return config.make_wsgi_app()
路线.py
Cookiecutter 实用程序自动生成一个 Python 脚本,该脚本具有名为includeme()的函数。它添加了一个静态路由和一个指向“/” URL 模式的主路由。
def includeme(config): config.add_static_view('static', 'static', cache_max_age=3600) config.add_route('home', '/')
这些路由通过上面解释的__init__.py文件中的main()函数添加到应用程序配置中。
浏览套餐
项目包(在我们的例子中为testproj包)包含此视图子包 - 一个包含空白__init__.py 的文件夹,一个名为 default.py 的 Python 模块,其中包含名为my_view()的视图函数的定义。它将项目名称作为上下文发送到预构建的模板mytemplate.jinja2
from pyramid.view import view_config from pyramid.response import Response from sqlalchemy.exc import SQLAlchemyError from .. import models @view_config(route_name='home', renderer='testproj:templates/mytemplate.jinja2') def my_view(request): try: query = request.dbsession.query(models.MyModel) one = query.filter(models.MyModel.name == 'one').one() except SQLAlchemyError: return Response(db_err_msg, content_type='text/plain', status=500) return {'one': one, 'project': 'testproj'} db_err_msg = """\ Pyramid is having a problem using your SQL database. .... """
default.py脚本还导入models 子包中mymodel的定义。该视图包还在notfound.py 文件中定义了一个notfound视图。
from pyramid.view import notfound_view_config @notfound_view_config(renderer='testproj:templates/404.jinja2') def notfound_view(request): request.response.status = 404 return {}
静态文件夹
testproj包文件夹下的此文件夹包含 Pyramid 徽标文件和主页的 theme.CSS。
模板文件夹
我们知道网页模板需要存储在 templates 文件夹中。该子文件夹包含 jinja2 模板。这里我们有一个名为layout.jinja2的基本模板,它由mytemplate.jinja2继承,由my_view()视图函数渲染。
{% extends "layout.jinja2" %} {% block content %} <div class="content"> <h1><span class="font-semi-bold">Pyramid</span> <span class="smaller">Starter project</span></h1> <p class="lead">Welcome to <span class="font-normal">{{project}}</span>, a Pyramid application generated by<br><span class="font-normal">Cookiecutter</span>.</p> </div> {% endblock content %}
型号包
tesptproj包文件夹下的这个子包包含mymodel.py ,其中包含名为MyModel的 SQLAlchemy 模型的定义。
from sqlalchemy import ( Column, Index, Integer, Text, ) from .meta import Base class MyModel(Base): __tablename__ = 'models' id = Column(Integer, primary_key=True) name = Column(Text) value = Column(Integer) Index('my_index', MyModel.name, unique=True, mysql_length=255)
meta.py在SQLAlchemy中声明声明基类的对象。
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.schema import MetaData NAMING_CONVENTION = { "ix": "ix_%(column_0_label)s", "uq": "uq_%(table_name)s_%(column_0_name)s", "ck": "ck_%(table_name)s_%(constraint_name)s", "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s", "pk": "pk_%(table_name)s" } metadata = MetaData(naming_convention=NAMING_CONVENTION) Base = declarative_base(metadata=metadata)