Pyramid for Enterprise

Install Pyramid

aptitude install python-virtualenv

virtualenv --no-site-packages pyramid_env
cd pyramid_env
source ./bin/activate
easy_install pyramid

Create Pyramid Project: myapp

pcreate -s alchemy myapp

Install remaining components

cd myapp
python develop

[Optional] Checking the first version into revision control of your choosing.

aptitude install bzr
cd myapp
bzr init .
bzr add
bzr commit -m"Initial Import"

Run a test

python test -q

Check how much code is covered by tests

easy_install nose coverage
nosetests --cover-package=myapp --cover-erase --with-coverage

Populate the database

Replace myapp with your app name.

initialize_myapp_db development.ini

Start the Application

pserve development.ini --reload

Visit http://localhost:6543/

Build application structure

Enable Mako

In order to use Mako as in Pylons, you must specify a template search path in the settings. Edit development.ini:

mako.directories = myapp:templates

enable mako with pyramid enable mako html with pyramid

Then in \init\.py add below. This will be needed so that designer can use .html mako template files in his software.

config = Configurator(settings=settings)
#right below this line add this:

Add first page

We will add new route in. This what tells pyramid program we want localhost/recall

#Add below home

Add below home

config.add_route('recall', '/recall')

Edit views/ and add our new page. This tells that anybody that calls localhost/recall should call our route_name called recall in

@view_config(route_name='recall', renderer='../templates/recall.html')
def recall(request):
    return {'project':'Myapp'}

Now inside template folder add your new template

cd template
vi recall.html


     <title>${project} Application</title>
      <h1 class="title">Welcome to <code>${project}</code>, an
       application generated by the <a
      >pyramid</a> web application framework using Mako.</h1>

Visit: http://localhost:6543/recall


Load mysql-python

First we need to add required package called "mysql-python". Add this to under required


Then do

python develop

This will install required software.

Autoload table from database

First we need to specify how to connect to database. In development.ini comment out the sqlite and add

#sqlalchemy.url = sqlite:///%(here)s/lm.sqlite

?charset=utf8 is optional.

In add below. This creates a python class called Recall and will autoload table called "recall_db" from the database. We use DeferredReflection because this is a helper function from sqlalchemy which does not require "engine" be to bound and loaded at this time. Allows to keep the model/database code in for clean viewing.

from sqlalchemy.ext.declarative import DeferredReflection

class Recall(DeferredReflection, Base):
    __tablename__ = 'recall_db'

Now right below Base.metadata.bind = engine please add


This will load the function and autoload the table that we have defined in the

adding url structure /path/bar/foo

My application requires that user accesses the site with url like

In order to achieve that we will add these lines of code in

config.add_route('recall', '/recall')
config.add_route('recall_year', '/recall/{year}')
config.add_route('recall_make', '/recall/{year}/{make}')
config.add_route('recall_model', '/recall/{year}/{make}/{model}')

The /recall/{year} says user will access the address like where 1999 will become a variable year=1999 and will be sent to view with a name of recall_year

Now lets add the 3 new views in

@view_config(route_name='recall_year', renderer='recall.html')
def recall_year(request):
    return {'project':'Myapp_year'}

@view_config(route_name='recall_make', renderer='recall.html')
def recall_make(request):
    return {'project':'Myapp_make'}

@view_config(route_name='recall_model', renderer='recall.html')
def recall_model(request):
    return {'project':'Myapp_model'}

Now we have used pyramid to "build url structure", autoload mysql table, and defined how our app will flow. Now lets load data, send what we want to template and display in our .html template before graphics person makes it pretty.

DBSession.query, mako and .html templates


Since we have already defined the database, and autoloaded the table with pyramid lets import it, query it in

Import Recall, and additional sqlalchemy functions

from .models import (
from sqlalchemy import and_, desc

Query It

@view_config(route_name='recall', renderer='recall.html')
def recall(request):
    return {'project':'Recall','years':years}

Template for look in mako, mako loop context

vi templates/recall.html and inside body add

<ul id="years">
% if years:
Click on Year of the vehicle:
  % for year in years:
    <span class="actions">
       <a href="${request.route_url('recall_year', year=year[0])}">${year[0]}</a>
  % endfor
% endif


Because the return value in my case is list (u'2005'), I'm doing year[0] to return u'2005'.

The ${request.route_url('recall_year', year=year[0]) tells system to provide a link to route name in called recall_year and pass parameter year with value of year[0]

query with the parameter passed via url

Now lets move on to recall_make, do the query for make based on year passed in request


@view_config(route_name='recall_year', renderer='recall.html')
def recall_year(request):
    return {'project':'Myapp_year','cyear':request.matchdict['year'],'makes':makes}

Edit recall.html

<ul id="makes">
% if makes:
Click on Make of the vehicle:
  % for make in makes:
    <span class="actions">
       <a href="${request.route_url('recall_make', year=cyear,make=make[0])}">${make[0]}</a>
  % endfor
% endif

MyWiki: Pyramid/enterprise (last edited 2016-09-26 02:43:53 by LukaszSzybalski)