BillPull
BillPull

Reputation: 7013

Setting Up Generic View class for Flask

I am setting up an application using Flask based on a tutorial I found on the web. The problem I am having is so far it seems like I will have to write a lot of code for each view/route that I want to make so I am trying to devise a better system but I think I dug myself into a hole where I wrote too much code before really testing each step and since im not familiar with the framework im kindof lost.

so what I want is a base view class that will extract away some boilerplate stuff. Here is my attempt so far.

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)

Class that attempts to inherit from BaseView

from app.BaseView import BaseView
from app import app

class HelloView(BaseView):

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

My reasoning behind this is later I intend to extend some Jinja functionality such as caching and have some data be available for every view and template.

Upvotes: 0

Views: 1158

Answers (2)

You will want to use the View classes included in flask already.

As they are very well explained there is not much I could explain here. Just read through the docs and I think you will see, what you will have to do (the flask docs are awesome.)

If you want to cache you also might want to have a look at Flask-Cache.

Upvotes: 1

MalphasWats
MalphasWats

Reputation: 3295

This doesn't quite answer your question entirely, but I thought it was worth mentioning anyway.

You can 'export' variables into the Jinja environment globals:

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

Once you've done this, all templates have access to the data variable and can operate on it as if it were passed in via kargs. You don't really need to go to the trouble of creating a whole new view class; you can just process it once and then make it available everywhere. It's handy for sidebars and login statuses and whatnot.

Upvotes: 0

Related Questions