Slide 1

Slide 1 text

lostpropertyhq.com Learn something new A quick look into the Pyramid web framework / Created byRach Belaid @rachbelaid

Slide 2

Slide 2 text

Who I am. Python charmer, Git Lover and a PostgreSQL Fan. I build web stuff and love learning something new. work at Lost property

Slide 3

Slide 3 text

I may be harsh! ... but I mean well Django is a great framework! It allowed me to make my living from Python, a language that I ❤

Slide 4

Slide 4 text

So why look somewhere else then? To discover other solutions to common problems You are a python developer and not a Django developer It's fun and exicting Due to frustrations To extend your mind and toolbelt with new tools To come back with a fresh eyes

Slide 5

Slide 5 text

Loads of frameworks out there! Web2py Flask Pyramid TurboGears Grok Zope

Slide 6

Slide 6 text

Why Pyramid?

Slide 7

Slide 7 text

I was living a happy life and had my own swiss army knife as a toolkit

Slide 8

Slide 8 text

One day! Somebody asked me to build this!

Slide 9

Slide 9 text

What I really needed! was this!

Slide 10

Slide 10 text

Modular Flexible Agnostic, Not opiniated Extensible Fast Full Control For small and big webapps

Slide 11

Slide 11 text

And sometimes ... ...doing things is easier than undoing things

Slide 12

Slide 12 text

What's Pyramid?

Slide 13

Slide 13 text

Simple example f r o m w s g i r e f . s i m p l e _ s e r v e r i m p o r t m a k e _ s e r v e r f r o m p y r a m i d . c o n f i g i m p o r t C o n f i g u r a t o r f r o m p y r a m i d . r e s p o n s e i m p o r t R e s p o n s e d e f h e l l o _ w o r l d ( r e q u e s t ) : r e t u r n R e s p o n s e ( ' H e l l o w o r l d ! ' ) i f _ _ n a m e _ _ = = ' _ _ m a i n _ _ ' : c o n f i g = C o n f i g u r a t o r ( ) c o n f i g . a d d _ r o u t e ( ' h o m e ' , ' / ' ) c o n f i g . a d d _ v i e w ( h e l l o _ w o r l d , r o u t e _ n a m e = ' h o m e ' ) a p p = c o n f i g . m a k e _ w s g i _ a p p ( ) s e r v e r = m a k e _ s e r v e r ( ' 0 . 0 . 0 . 0 ' , 8 0 8 0 , a p p ) s e r v e r . s e r v e _ f o r e v e r ( )

Slide 14

Slide 14 text

Same example but another way f r o m w s g i r e f . s i m p l e _ s e r v e r i m p o r t m a k e _ s e r v e r f r o m p y r a m i d . c o n f i g i m p o r t C o n f i g u r a t o r f r o m p y r a m i d . r e s p o n s e i m p o r t R e s p o n s e f r o m p y r a m i d . v i e w i m p o r t v i e w _ c o n f i g @ v i e w _ c o n f i g ( r o u t e _ n a m e = ' h o m e ' ) d e f h e l l o _ w o r l d ( r e q u e s t ) : r e t u r n R e s p o n s e ( ' H e l l o w o r l d ! ' ) i f _ _ n a m e _ _ = = ' _ _ m a i n _ _ ' : c o n f i g = C o n f i g u r a t o r ( ) c o n f i g . a d d _ r o u t e ( ' h o m e ' , ' / ' ) c o n f i g . s c a n ( ) # r u n t h e a p p a p p = c o n f i g . m a k e _ w s g i _ a p p ( ) s e r v e r = m a k e _ s e r v e r ( ' 0 . 0 . 0 . 0 ' , 8 0 8 0 , a p p ) s e r v e r . s e r v e _ f o r e v e r ( )

Slide 15

Slide 15 text

TIMTOWTDI. Blasphemy !! with pyramid there is more than one way to do things!!! I want my tools to bend to my needs and not me to them.

Slide 16

Slide 16 text

Battery not included. Nor the shell, nor the wheels. Time to go shopping and get the best out there!!

Slide 17

Slide 17 text

Pyramid has “extensible” applications, not pluggable applications

Slide 18

Slide 18 text

Routing View != Route Base on method, xhr, param, custom function(predicate)

Slide 19

Slide 19 text

Routing Example via Method @ v i e w _ c o n f i g ( r o u t e _ n a m e = ' t e s t ' , r e q u e s t _ m e t h o d = ' G E T ' ) d e f h e l l o _ w o r l d ( r e q u e s t ) : r e t u r n R e s p o n s e ( ' H e l l o w o r l d ! ' ) @ v i e w _ c o n f i g ( r o u t e _ n a m e = ' t e s t ' , r e q u e s t _ m e t h o d = ' P O S T ' ) d e f t h a n k s _ y o u ( r e q u e s t ) : r e t u r n R e s p o n s e ( ' T h a n k s y o u ' ) i f _ _ n a m e _ _ = = ' _ _ m a i n _ _ ' : c o n f i g = C o n f i g u r a t o r ( ) c o n f i g . a d d _ r o u t e ( ' t e s t ' , ' / t e s t ' ) c o n f i g . s c a n ( )

Slide 20

Slide 20 text

Routing Example with param @ v i e w _ c o n f i g ( r o u t e _ n a m e = ' a c t i o n ' , m a t c h _ p a r a m = ' a c t i o n = h e l l o ' ) d e f h e l l o _ v i e w ( r e q u e s t ) : r e t u r n R e s p o n s e ( ' H e l l o ' ) @ v i e w _ c o n f i g ( r o u t e _ n a m e = ' a c t i o n ' , m a t c h _ p a r a m = ' a c t i o n = b y e ' ) d e f b y e _ v i e w ( r e q u e s t ) : r e t u r n R e s p o n s e ( ' B y e B y e ' ) @ v i e w _ c o n f i g ( r o u t e _ n a m e = ' a c t i o n ' , m a t c h _ p a r a m = ' a c t i o n ' ) d e f b y e _ v i e w ( r e q u e s t ) : r e t u r n R e s p o n s e ( ' L e t ’ s c o n t i n u e ' ) i f _ _ n a m e _ _ = = ' _ _ m a i n _ _ ' : c o n f i g = C o n f i g u r a t o r ( ) c o n f i g . a d d _ r o u t e ( ' a c t i o n ' , ' / { a c t i o n : \ w + } ' ) c o n f i g . s c a n ( )

Slide 21

Slide 21 text

Routing Example with predicate d e f u s e l e s s _ p r e d i c a t e ( i n f o , r e q u e s t ) : f r o m d a t e t i m e i m p o r t d a t e t o d a y = d a t e . t o d a y ( ) r e t u r n t o d a y . d a y = = 2 9 & & t o d a y . m o n t h = = 2 @ v i e w _ c o n f i g ( r o u t e _ n a m e = ' h o m e ' , c u s t o m _ p r e d i c a t e = u s e l e s s _ p r e d i c a t e ) d e f u s e l e s s _ v i e w ( r e q u e s t ) : r e t u r n R e s p o n s e ( ' L e a p y e a r ' ) i f _ _ n a m e _ _ = = ' _ _ m a i n _ _ ' : c o n f i g = C o n f i g u r a t o r ( ) c o n f i g . a d d _ r o u t e ( ' h o m e ' , ' / ' ) c o n f i g . s c a n ( )

Slide 22

Slide 22 text

Routing with class and method too @ v i e w _ c o n f i g ( r o u t e _ n a m e = ' t e s t ' ) d e f t e s t ( r e q u e s t ) : r e t u r n R e s p o n s e ( ' o k ' ) c l a s s T e s t ( o b j e c t ) : d e f _ _ i n i t _ _ ( s e l f , r e q u e s t ) : s e l f . r e q u e s t = r e q u e s t @ v i e w _ c o n f i g ( r o u t e _ n a m e = ' t e s t ' ) d e f t e s t ( s e l f ) : r e t u r n R e s p o n s e ( ' o k ' ) @ v i e w _ c o n f i g ( r o u t e _ n a m e = ' t e s t ' ) c l a s s T e s t ( o b j e c t ) : d e f _ _ i n i t _ _ ( s e l f , r e q u e s t ) : s e l f . r e q u e s t = r e q u e s t d e f _ _ c a l l _ _ ( s e l f ) : r e t u r n R e s p o n s e ( ' o k ' )

Slide 23

Slide 23 text

ORM You can choose but the choice is easy.

Slide 24

Slide 24 text

SQLAlchemy, the only true ORM Once you go SQLAlchemy, you never go back. Finally an ORM that allows you to write better queries.

Slide 25

Slide 25 text

Templating Mako Chameleon Jinja2 ... and they are fast.

Slide 26

Slide 26 text

Admin Sorry, there is none ... but you may have a chance with FormAlchemy.

Slide 27

Slide 27 text

Hooks Tweens, Event, Finished, Callbacks, Response Adapter ... to play ther role of middleware, context processor django

Slide 28

Slide 28 text

Tweens A tween (a contraction of the word “between”) is a bit of code that sits between the Pyramid router’s main request handling function and the upstream WSGI

Slide 29

Slide 29 text

Response Adaptor to control how Pyramid treats the view result f r o m p y r a m i d . r e s p o n s e i m p o r t R e s p o n s e d e f s t r i n g _ r e s p o n s e _ a d a p t e r ( s ) : r e s p o n s e = R e s p o n s e ( s ) r e t u r n r e s p o n s e # c o n f i g i s a n i n s t a n c e o f p y r a m i d . c o n f i g . C o n f i g u r a t o r c o n f i g . a d d _ r e s p o n s e _ a d a p t e r ( s t r i n g _ r e s p o n s e _ a d a p t e r , s t r )

Slide 30

Slide 30 text

Events loads of events : NewResponse, ApplicationCreated, ... f r o m p y r a m i d . e v e n t s i m p o r t s u b s c r i b e r f r o m p y r a m i d . e v e n t s i m p o r t B e f o r e R e n d e r @ s u b s c r i b e r ( B e f o r e R e n d e r ) d e f a d d _ g l o b a l ( e v e n t ) : e v e n t [ ' m y k e y ' ] = ' f o o '

Slide 31

Slide 31 text

Subscriber Predicates to narrow the set of circumstances in which a subscriber to an event will be called

Slide 32

Slide 32 text

Finished Callback Will be call no matter what happens! i m p o r t l o g g i n g l o g = l o g g i n g . g e t L o g g e r ( _ _ n a m e _ _ ) d e f l o g _ c a l l b a c k ( r e q u e s t ) : " " " L o g i n f o r m a t i o n a t t h e e n d o f r e q u e s t " " " l o g . d e b u g ( ' R e q u e s t i s f i n i s h e d . ' ) r e q u e s t . a d d _ f i n i s h e d _ c a l l b a c k ( l o g _ c a l l b a c k )

Slide 33

Slide 33 text

It's Alive! It's Alive!

Slide 34

Slide 34 text

Validation Colander, FormEncode

Slide 35

Slide 35 text

Form WTForms, Deform with colander, WTForms-Alchemy , simple_form

Slide 36

Slide 36 text

Authentication & Authorization policy Clear separation between Authorization and Authentication Powerfull ACL Resource Tree dependency Or build your own

Slide 37

Slide 37 text

Config Imperative configuration or .ini file for non dev colleagues or even ZCML(XML) .ini file can support to serve multi wsgi app (paste legacy)

Slide 38

Slide 38 text

Python Package friendly Application ready to package (egg, wheel, deb,..) or to distribute

Slide 39

Slide 39 text

Interrested in Pyramid? Have a chat. Check the doc, tutorial. Come to the Pyramid London Meetup.

Slide 40

Slide 40 text

A Final Word Frameworks are just tools. Use the ones which make you happy to code.