20
REPOZE.BFG Rok Garbas, python/zope/plone consulting Oct. 2009 “Everything should be made as simple as possible, but not simpler.” ~ Einstein BFG is a "pay only for what you eat" Python web framework. You can get started easily and learn new concepts as you go, and only if you need them. It's simple, well tested, well documented, and fast. http://bfg.repoze.org

Repoze Bfg - presented by Rok Garbas at the Python Barcelona Meetup October 2009

Embed Size (px)

DESCRIPTION

BFG is a "pay only for what you eat" Python web framework. You can get started easily and learn new concepts as you go, and only if you need them. It's simple, well tested, well documented, and fast. This is a talk given by Rok Garbas at the Python Barcelona Meetup in October 2009

Citation preview

Page 1: Repoze Bfg - presented by Rok Garbas at the Python Barcelona Meetup October 2009

REPOZE.BFG

Rok Garbas, python/zope/plone consultingOct. 2009

“Everything should be made as simple as possible, but not

simpler.” ~ Einstein

BFG is a "pay only for what you eat" Python web framework. You can get started

easily and learn new concepts as you go, and only if you need them. It's simple, well

tested, well documented, and fast.

http://bfg.repoze.org

Page 2: Repoze Bfg - presented by Rok Garbas at the Python Barcelona Meetup October 2009

WHAT MATTERS

I’M A PLONISTA, I LOVE PLONE, I LOVE PLONE

COMMUNITY, BUT…

ON THE END IT DOESN’T REALLY MATTER

WHAT YOU ARE USING

WHAT MATTER IS HOW PASIONATE YOU ARE

ABOUT IT

Page 3: Repoze Bfg - presented by Rok Garbas at the Python Barcelona Meetup October 2009

THANK YOU …

Chris McDonough

Tres Seaver

Paul Everitt,

Carlos de la Guardia

Malthe Borch

Stefan Eletzhofer

Fernando Neto-Correa

Page 4: Repoze Bfg - presented by Rok Garbas at the Python Barcelona Meetup October 2009

WHY NAME IT BFG

repoze.bfg should have just been named "BFG".

BFG's goals are somewhat sideways of the original Repoze goals.

The BFG 9000 is a fictional futuristic weapon found in Doom. It is the most powerful weapon in the game, and is capable of destroying nearly any player or enemy with a single hit.

Page 5: Repoze Bfg - presented by Rok Garbas at the Python Barcelona Meetup October 2009

ABOUT

July 2008 – Initial release

July 2009 – 1.0 released, API promissed to be

backwards compatible

10th of October 2009 – Latest release … 1.1a5

Allow Zope developers to use WSGI technologies

more easily and even out of Zope framework.

Allow non-Zope developers to use Zope

technologies without using all of Zope.

Page 6: Repoze Bfg - presented by Rok Garbas at the Python Barcelona Meetup October 2009

WHY

ZOPE2 / PLONE

ZOPE 3

GROK

DJANGO

PYLONS / TG2

Page 7: Repoze Bfg - presented by Rok Garbas at the Python Barcelona Meetup October 2009

WHAT IT DOES

Graph traversal / URL Dispatch: maps

URLs to code

Security: provides mechanisms that allow

developers to make declarative security

assertions

Templating: provides text and HTML

templating facilities

Zope libs: use wonderful zope stuff

Page 8: Repoze Bfg - presented by Rok Garbas at the Python Barcelona Meetup October 2009

WHAT IT DOESN’T DO

Database / persistence

Sessions

Indexing / searching

ZMI / TTW code

View code sharing with Z3 / Five

...

Page 9: Repoze Bfg - presented by Rok Garbas at the Python Barcelona Meetup October 2009

HOW YOUR BFG APP WORKS

You are not running framework and your application

inside it, like zope, instead you are running your

application alone.

INTERNETWSGI + MIDDLEWARE

BFG ROUTER

YOUR APPLICATION

MODELS VIEWS TEMPLATES

Page 10: Repoze Bfg - presented by Rok Garbas at the Python Barcelona Meetup October 2009

ZOPE COMPONENT ARHITECTURE

The Zope Component Architecture is a system for

runtime indirection ("pluggability"). Used only to

construct BFG.

BFG application developers don't need to

understand the Zope CA. It's a framework

implementation detail.

Page 11: Repoze Bfg - presented by Rok Garbas at the Python Barcelona Meetup October 2009

Dependencies (22)

Paste-1.7.2

PasteScript-1.7.3

PasteDeploy-1.3.3

setuptools-0.6c8

simplejson-2.0.9

martian-0.12

repoze.lru-0.3

repoze.zcml

zope.deprecation-3.4.0

zope.component-3.7.1

zope.interface-3.5.2

WebOb-0.9.6.1

chameleon.zpt-1.1.1

chameleon.core-1.0.2

zope.configuration-3.6.0

zope.event-3.4.1

zope.dottedname-3.4.6

zope.i18n-3.7.1

sourcecodegen-0.6.11

zope.schema-3.5.4

zope.i18nmessageid-3.5.0

pytz-2009n

Page 12: Repoze Bfg - presented by Rok Garbas at the Python Barcelona Meetup October 2009

MODELS

“content” objects. for Zope people, think of it as things we

store in ZODB

ZODB not required for repoze.bfg applications: filesystem

directories, XML documents, RDF graphs, SQL databases, etc.

can be the source of model data

from zope.interface import implements

from zope.interface import Interface

class IMyModel(Interface):

pass

class MyModel(object):

implements(IMyModel)

def __init__(self, name):

self.name = name

Page 13: Repoze Bfg - presented by Rok Garbas at the Python Barcelona Meetup October 2009

VIEWS

Views are functions which accept a "context" (a

model object) and a "request".

Views must return a response. Unlike Zope.

The view may use a template to generate the

response body, or not.

from repoze.bfg.chameleon_zpt \

import render_template_to_response

def hello_world(context, request):

render_template_to_response(

'templates/hello.pt',

context=context, myname='chris')

Page 14: Repoze Bfg - presented by Rok Garbas at the Python Barcelona Meetup October 2009

VIEW REGISTRATION

<configure xmlns="http://namespaces.zope.org/zope"

xmlns:bfg="http://namespaces.repoze.org/bfg"

i18n_domain="repoze.bfg">

<include package="repoze.bfg" />

<— default view for .interfaces.IMyModel —>

<bfg:view

for=".interfaces.IMyModel"

view=".views.my_view"

/>

<— named view for .interfaces.IMyModel —>

<bfg:view

for=".interfaces.IMyModel"

view=".views.other_view"

name="other"

/>

</configure>

Page 15: Repoze Bfg - presented by Rok Garbas at the Python Barcelona Meetup October 2009

VIEW REGISTRATION via DECORATORS

from webob import Response

from repoze.bfg.convention import bfg_view

from repoze.bfg.chameleon_zpt \

import render_template_to_response

@bfg_view(name='hello.html')

def hello_world(context, request):

render_template_to_response(

'templates/hello.pt',

context=context, myname='chris')

Page 16: Repoze Bfg - presented by Rok Garbas at the Python Barcelona Meetup October 2009

TEMPLATE

Default templating engine: chalmeleon by Malthe

Borch. ZPT or Genshi syntax. ~10X - 15X faster

than zope.pagetemplate.

Included: XSLT.

Add-on: jinja2 (Django-style, via repoze.bfg.jinja2)

Any other you'd like to use; bindings are simple to

create (see the jinja2 bindings).

Page 17: Repoze Bfg - presented by Rok Garbas at the Python Barcelona Meetup October 2009

TEMPLATE

<html xmlns="http://www.w3.org/1999/xhtml"

xmlns:tal="http://xml.zope.org/namespaces/tal">

<head>

<title tal:content="context.title">The title</title>

<meta http-equiv="content-type“

content="text/html;charset=utf-8"/>

</head>

<body>

<h2><span tal:replace="context.title_or_id()">content title

or id</span>

<span tal:condition="context.title“

tal:replace="context.title">optional template

title</span></h2>

This is Page Template <em

tal:content="request.view_name">template id</em>.

</body>

</html>

Page 18: Repoze Bfg - presented by Rok Garbas at the Python Barcelona Meetup October 2009

WSGI MIDDLEWARE

Profiler (repoze.profile)

Alternate exception handlers (paste.evalexception).

Caching (repoze.accelerator)

Theming (Deliverance).

Transaction management (repoze.tm2)

...

Page 19: Repoze Bfg - presented by Rok Garbas at the Python Barcelona Meetup October 2009

FUTURE

Vudo CMS (http://docs.vudo.me) to be

implemented using repoze.bfg, hopefully. Work

towards this: repoze.bfg.skins, repoze.bfg.layout,

repoze.bitblt, repoze.squeeze.

BFG will stay minimal. Add-ons and

superframeworks like vudo and repoze.lemonade

will provide functionality.

Page 20: Repoze Bfg - presented by Rok Garbas at the Python Barcelona Meetup October 2009

Final words

TESTED

SIMPLE

MINIMAL

FAST

DOCUMENTED