0

我正在根据我在网上找到的教程使用 Flask 设置应用程序。到目前为止,我遇到的问题似乎是我必须为我想要制作的每个视图/路线编写大量代码,所以我正在尝试设计一个更好的系统,但我想我把自己挖进了一个洞在真正测试每个步骤之前写了太多代码,因为我不熟悉框架,我有点迷失了。

所以我想要的是一个基础视图类,它将提取一些样板文件。到目前为止,这是我的尝试。

import jinja2
from jinja2 import Environment as Jinja2Environment
from webassets import Environment as AssetsEnvironment
from webassets.loaders import YAMLLoader
from webassets.ext.jinja2 import AssetsExtension
from flask import render_template
from app import app

class BaseView(object):

    def __init__(self):
        "init"

    def get_jinja_env(self):
        jinja_env = Jinja2Environment(loader=jinja2.FileSystemLoader('templates/'), extensions=[AssetsExtension])

        return jinja_env

    def get_asset_env(self):
        asset_loader = webassets.YAMLLoader('conf/assets.yml')
        asset_env = asset_loader.load_environment()
        bundles = asset_loader.load_bundles()
        [asset_env.register(name, bundle) for name, bundle in bundles.iteritems()]

        return asset_env

    def render_tmpl(self, tmpl_file, **context):
        "Renders Jinja Template"
        jinja_env = self.get_jinja_env
        jinja_env.assets_environment = self.get_asset_env

        template = jinja_env.get_template(tmpl_file)
        return template.render(context)

尝试从 BaseView 继承的类

from app.BaseView import BaseView
from app import app

class HelloView(BaseView):

    @app.route('/')
    def respond(self):
        self.render_tmpl('hello.html')

我的理由是稍后我打算扩展一些 Jinja 功能,例如缓存,并为每个视图和模板提供一些数据。

4

2 回答 2

1

您将希望使用包含在烧瓶中的View 类。

由于它们被很好地解释了,所以我无法在这里解释太多。只需阅读文档,我想你就会明白你必须做什么(flask 文档很棒。)

如果你想缓存,你可能还想看看Flask-Cache

于 2012-11-27T13:50:55.280 回答
0

这并不能完全回答您的问题,但我认为无论如何都值得一提。

您可以将变量“导出”到 Jinja 环境全局变量中:

app.jinja_env.globals['data'] = ['One', 'Two', 'Three']

完成此操作后,所有模板都可以访问该data变量并可以对其进行操作,就好像它是通过 传入的一样kargs。你真的不需要费心去创建一个全新的视图类;你可以只处理一次,然后让它在任何地方都可用。它对于侧边栏和登录状态等很方便。

于 2012-11-19T09:21:14.540 回答