使用金字塔

时间:2015-06-10 02:33:36

标签: python pyramid deform colander

我正在尝试使用Pyramid为数据分析管道创建Web界面。我正在使用变形和漏勺来制作表格。我一直在调整这个例子:

http://pyramid-tutorials.readthedocs.org/en/latest/humans/security/step02/

大部分工作在提交表单时完成,但有几个通用步骤只需要运行一次。我可以在服务器启动时将一些内容加载到内存中,以便可以在视图中访问它们吗?

2 个答案:

答案 0 :(得分:0)

您可以在应用程序的主文件中定义一些模块级别变量(或者可能在其他位置),然后根据您的要求导入它们。

我使用此方法从环境变量中为SQLAlchemy创建数据库连接字符串等设置。

默认情况下,模块只在Python中解析一次,因此模块级代码只运行一次。

更新1

让我们假设金字塔项目的目录结构如下所示:

.
├── __init__.py
├── models
│   ├── __init__.py
│   ├── meta
│   │   ├── base.py
│   │   ├── __init__.py
│   │   ├── orm.py
│   │   ├── schema.py
│   │   ├── types.py
│   ├── users.py
├── security.py
├── settings
│   ├── database.py
│   ├── email.py
│   ├── __init__.py
│   ├── redis.py
│   ├── security.py
├── static
│   ├── css
│   │   └── main.css
│   └── js
│       ├── app.js
│       ├── app-services.js
│       ├── controllers
│       │   └── excel_preview.js
├── templates
│   ├── auth
│   │   └── login.html
│   ├── base.html
│   ├── home.html
├── views
│   ├── auth.py
│   ├── home.py
│   ├── __init__.py

假设我们在settings/redis.py中使用了以下代码:

import os
import redis


def get_redis_client():
    # Read settings from environment variables
    redis_db_name = os.environ.get('REDIS_NAME')
    redis_host = os.environ.get('REDIS_HOST')
    redis_port = os.environ['REDIS_PORT']

    # create a redis connection
    redis_client = redis.StrictRedis(
        host=redis_host,
        port=redis_port,
        db=redis_db_name,
    )

    # return newly created redis connection
    return redis_client


redis_client = get_redis_client()

SOME_SETTING_STORED_IN_REDIS = redis_client.get('some_setting_stored_in_redis')

您可以随时随地使用此SOME_SETTING_STORED_IN_REDIS变量。如果您的应用名称为example_app,那么在example_app/views/home.py中,您可以像这样使用它:

from pyramid.view import view_config

from example_app.settings.redis import SOME_SETTING_STORED_IN_REDIS


def includeme(config):
    config.add_route('home', '/')


@view_config(
    route_name='home',
    renderer='home.html',
    permission='authenticated'
)
def home_view(request):

    return {
        "some_setting": SOME_SETTING_STORED_IN_REDIS,
    }

我认为你正在努力实现类似的目标。

答案 1 :(得分:0)

如果通过“只需要运行一次的东西”就意味着像数据库连接,某些配置数据等 - 换句话说,在流程的生命周期中永远不会改变的东西,然后将它们定义为全局并重新使用整个应用程序是好的。例如:

APP_TITLE = 'Data Analysis Pipeline using Pyramid'

@view_config(...)
def home_view(request):
    return "Welcome to %s" % APP_TITLE

如果您正考虑存储一些全局状态并在视图中重复使用它,那么这不是一个好主意。示例(不好,不要这样做):

subscription_step = 1

@view_config(...)
def next_subscription_step(request):
    global subscription_step
    subscription_step += 1 
    return HTTPFound('/subscription/step_%s' % subscription_step)

上面的代码似乎在本地适合您,但是只要有多个用户访问应用程序,或者如果Web服务器生成另一个工作进程,或者Web服务器重新启动,或者一百万个,那么事情就会开始崩溃其他原因。