Upgrade to Pro — share decks privately, control downloads, hide ads and more …

flask restful

flask restful

Python CodeLabs - Introduction to Flask-RESTful & Flask-HTTPAuth
http://eueung.github.io/python/flask-restful

Eueung Mulyana

November 28, 2015
Tweet

More Decks by Eueung Mulyana

Other Decks in Programming

Transcript

  1. Example #1 f r o m f l a s

    k i m p o r t F l a s k f r o m f l a s k . e x t i m p o r t r e s t f u l a p p = F l a s k ( _ _ n a m e _ _ ) a p i = r e s t f u l . A p i ( a p p ) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - c l a s s H e l l o W o r l d ( r e s t f u l . R e s o u r c e ) : d e f g e t ( s e l f ) : r e t u r n { ' h e l l o ' : ' w o r l d ' } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - a p i . a d d _ r e s o u r c e ( H e l l o W o r l d , ' / ' ) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - i f _ _ n a m e _ _ = = ' _ _ m a i n _ _ ' : a p p . r u n ( d e b u g = T r u e ) 3 / 20
  2. f r o m f l a s k i

    m p o r t F l a s k , r e q u e s t f r o m f l a s k . e x t . r e s t f u l i m p o r t R e s o u r c e , A p i a p p = F l a s k ( _ _ n a m e _ _ ) a p i = A p i ( a p p ) t o d o s = { } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - c l a s s T o d o S i m p l e ( R e s o u r c e ) : d e f g e t ( s e l f , t o d o _ i d ) : r e t u r n { t o d o _ i d : t o d o s [ t o d o _ i d ] } d e f p u t ( s e l f , t o d o _ i d ) : t o d o s [ t o d o _ i d ] = r e q u e s t . f o r m [ ' d a t a ' ] r e t u r n { t o d o _ i d : t o d o s [ t o d o _ i d ] } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - a p i . a d d _ r e s o u r c e ( T o d o S i m p l e , ' / < s t r i n g : t o d o _ i d > ' ) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - i f _ _ n a m e _ _ = = ' _ _ m a i n _ _ ' : a p p . r u n ( d e b u g = T r u e ) 1 2 7 . 0 . 0 . 1 - - [ 2 3 / N o v / 2 0 1 5 0 4 : 4 1 : 4 1 ] " P U T / t o d o 1 H T T P / 1 . 1 " 1 2 7 . 0 . 0 . 1 - - [ 2 3 / N o v / 2 0 1 5 0 4 : 4 7 : 5 7 ] " G E T / t o d o 1 H T T P / 1 . 1 " Example #2 $ c u r l h t t p : / / l o c a l h o s t : 5 0 0 0 / t o d o 1 - d " d a t a = R e m e m b e r t h e m i l k " { " t o d o 1 " : " R e m e m b e r t h e m i l k " } $ c u r l h t t p : / / l o c a l h o s t : 5 0 0 0 / t o d o 1 { " t o d o 1 " : " R e m e m b e r t h e m i l k " } 4 / 20
  3. Notes Using requests f r o m r e q

    u e s t s i m p o r t p u t , g e t p u t ( ' h t t p : / / l o c a l h o s t : 5 0 0 0 / t o d o 1 ' , d a t a = { ' d a t a ' : ' R e m e m b e r t h e # { u ' t o d o 1 ' : u ' R e m e m b e r t h e m i l k ' } g e t ( ' h t t p : / / l o c a l h o s t : 5 0 0 0 / t o d o 1 ' ) . j s o n ( ) # { u ' t o d o 1 ' : u ' R e m e m b e r t h e m i l k ' } 5 / 20
  4. f r o m f l a s k i

    m p o r t F l a s k f r o m f l a s k . e x t . r e s t f u l i m p o r t r e q p a r s e , a b o r t , A p i , R e s o u r c e a p p = F l a s k ( _ _ n a m e _ _ ) a p i = A p i ( a p p ) T O D O S = { ' t o d o 1 ' : { ' t a s k ' : ' b u i l d a n A P I ' } , ' t o d o 2 ' : { ' t a s k ' : ' ? ? ? ? ? ' } , ' t o d o 3 ' : { ' t a s k ' : ' p r o f i t ! ' } , } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - d e f a b o r t _ i f _ t o d o _ d o e s n t _ e x i s t ( t o d o _ i d ) : i f t o d o _ i d n o t i n T O D O S : a b o r t ( 4 0 4 , m e s s a g e = " T o d o { } d o e s n ' t e x i s t " . f o r m a t ( t o d o _ i d ) ) p a r s e r = r e q p a r s e . R e q u e s t P a r s e r ( ) p a r s e r . a d d _ a r g u m e n t ( ' t a s k ' , t y p e = s t r ) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - c l a s s T o d o L i s t ( R e s o u r c e ) : d e f g e t ( s e l f ) : r e t u r n T O D O S d e f p o s t ( s e l f ) : a r g s = p a r s e r . p a r s e _ a r g s ( ) t o d o _ i d = i n t ( m a x ( T O D O S . k e y s ( ) ) . l s t r i p ( ' t o d o ' ) ) + 1 t o d o _ i d = ' t o d o % i ' % t o d o _ i d T O D O S [ t o d o _ i d ] = { ' t a s k ' : a r g s [ ' t a s k ' ] } r e t u r n T O D O S [ t o d o _ i d ] , 2 0 1 Example #3 # s i n g l e i t e m ; g e t , u p d a t e a n d d e l e t e c l a s s T o d o ( R e s o u r c e ) : d e f g e t ( s e l f , t o d o _ i d ) : a b o r t _ i f _ t o d o _ d o e s n t _ e x i s t ( t o d o _ i d ) r e t u r n T O D O S [ t o d o _ i d ] d e f d e l e t e ( s e l f , t o d o _ i d ) : a b o r t _ i f _ t o d o _ d o e s n t _ e x i s t ( t o d o _ i d ) d e l T O D O S [ t o d o _ i d ] r e t u r n ' ' , 2 0 4 d e f p u t ( s e l f , t o d o _ i d ) : a r g s = p a r s e r . p a r s e _ a r g s ( ) t a s k = { ' t a s k ' : a r g s [ ' t a s k ' ] } T O D O S [ t o d o _ i d ] = t a s k r e t u r n t a s k , 2 0 1 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - a p i . a d d _ r e s o u r c e ( T o d o L i s t , ' / t o d o s ' ) a p i . a d d _ r e s o u r c e ( T o d o , ' / t o d o s / < t o d o _ i d > ' ) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - i f _ _ n a m e _ _ = = ' _ _ m a i n _ _ ' : a p p . r u n ( d e b u g = T r u e ) 6 / 20
  5. 1 2 7 . 0 . 0 . 1 -

    - [ 2 3 / N o v / 2 0 1 5 0 5 : 1 5 : 5 4 ] " G E T / t o d o s H T T P / 1 . 1 " 1 2 7 . 0 . 0 . 1 - - [ 2 3 / N o v / 2 0 1 5 0 5 : 1 7 : 1 4 ] " G E T / t o d o s / t o d o 3 H T T P / 1 . 1 2 7 . 0 . 0 . 1 - - [ 2 3 / N o v / 2 0 1 5 0 5 : 1 7 : 3 6 ] " D E L E T E / t o d o s / t o d o 2 H T T P 1 2 7 . 0 . 0 . 1 - - [ 2 3 / N o v / 2 0 1 5 0 5 : 1 7 : 5 9 ] " G E T / t o d o s / t o d o 2 H T T P / 1 . 1 2 7 . 0 . 0 . 1 - - [ 2 3 / N o v / 2 0 1 5 0 7 : 3 8 : 0 7 ] " P O S T / t o d o s H T T P / 1 . 1 " 1 2 7 . 0 . 0 . 1 - - [ 2 3 / N o v / 2 0 1 5 0 7 : 3 8 : 5 6 ] " G E T / t o d o s / t o d o 4 H T T P / 1 . 1 2 7 . 0 . 0 . 1 - - [ 2 3 / N o v / 2 0 1 5 0 7 : 3 9 : 4 1 ] " P U T / t o d o s / t o d o 4 H T T P / 1 . $ c u r l h t t p : / / l o c a l h o s t : 5 0 0 0 / t o d o s $ c u r l h t t p : / / l o c a l h o s t : 5 0 0 0 / t o d o s / t o d o 3 # v e r b o s e $ c u r l h t t p : / / l o c a l h o s t : 5 0 0 0 / t o d o s / t o d o 2 - X D E L E T E - v $ c u r l h t t p : / / l o c a l h o s t : 5 0 0 0 / t o d o s - d " t a s k = s o m e t h i n g n e w " - X $ c u r l h t t p : / / l o c a l h o s t : 5 0 0 0 / t o d o s / t o d o 3 - d " t a s k = s o m e t h i n g d i 7 / 20
  6. f r o m s i m p l e

    x m l i m p o r t d u m p s f r o m f l a s k i m p o r t m a k e _ r e s p o n s e , F l a s k f r o m f l a s k _ r e s t f u l i m p o r t A p i , R e s o u r c e # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - d e f o u t p u t _ x m l ( d a t a , c o d e , h e a d e r s = N o n e ) : r e s p = m a k e _ r e s p o n s e ( d u m p s ( { ' r e s p o n s e ' : d a t a } ) , c o d e ) r e s p . h e a d e r s . e x t e n d ( h e a d e r s o r { } ) r e t u r n r e s p # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - a p p = F l a s k ( _ _ n a m e _ _ ) a p i = A p i ( a p p , d e f a u l t _ m e d i a t y p e = ' a p p l i c a t i o n / x m l ' ) a p i . r e p r e s e n t a t i o n s [ ' a p p l i c a t i o n / x m l ' ] = o u t p u t _ x m l # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - c l a s s H e l l o ( R e s o u r c e ) : d e f g e t ( s e l f , e n t r y ) : r e t u r n { ' h e l l o ' : e n t r y } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - a p i . a d d _ r e s o u r c e ( H e l l o , ' / < s t r i n g : e n t r y > ' ) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - i f _ _ n a m e _ _ = = ' _ _ m a i n _ _ ' : a p p . r u n ( d e b u g = T r u e ) Example #4 f r o m r e q u e s t s i m p o r t g e t g e t ( ' h t t p : / / l o c a l h o s t : 5 0 0 0 / m e ' ) . c o n t e n t # d e f a u l t _ m e d i a t y p e # C h r o m e o k , P o s t m a n d e f a u l t j s o n g e t ( ' h t t p : / / l o c a l h o s t : 5 0 0 0 / m e ' , h e a d e r s = { " a c c e p t " : " a p p l i c a t i o n g e t ( ' h t t p : / / l o c a l h o s t : 5 0 0 0 / m e ' , h e a d e r s = { " a c c e p t " : " a p p l i c a t i o n 8 / 20
  7. f r o m f l a s k i

    m p o r t F l a s k f r o m f l a s k _ h t t p a u t h i m p o r t H T T P B a s i c A u t h a p p = F l a s k ( _ _ n a m e _ _ ) a u t h = H T T P B a s i c A u t h ( ) u s e r s = { " j o h n " : " h e l l o " , " s u s a n " : " b y e " } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @ a u t h . g e t _ p a s s w o r d d e f g e t _ p w ( u s e r n a m e ) : i f u s e r n a m e i n u s e r s : r e t u r n u s e r s . g e t ( u s e r n a m e ) r e t u r n N o n e # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @ a p p . r o u t e ( ' / ' ) @ a u t h . l o g i n _ r e q u i r e d d e f i n d e x ( ) : r e t u r n " H e l l o , % s ! " % a u t h . u s e r n a m e ( ) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - i f _ _ n a m e _ _ = = ' _ _ m a i n _ _ ' : a p p . r u n ( d e b u g = T r u e ) Example #1 1 2 7 . 0 . 0 . 1 - - [ 2 3 / N o v / 2 0 1 5 1 8 : 2 4 : 0 7 ] " G E T / H T T P / 1 . 1 " 4 0 1 - 1 2 7 . 0 . 0 . 1 - - [ 2 3 / N o v / 2 0 1 5 1 8 : 2 4 : 3 2 ] " P O S T / H T T P / 1 . 1 " 4 0 5 - 1 2 7 . 0 . 0 . 1 - - [ 2 3 / N o v / 2 0 1 5 1 8 : 2 6 : 3 7 ] " G E T / H T T P / 1 . 1 " 4 0 1 - 1 2 7 . 0 . 0 . 1 - - [ 2 3 / N o v / 2 0 1 5 1 8 : 2 7 : 3 0 ] " G E T / H T T P / 1 . 1 " 2 0 0 - 1 2 7 . 0 . 0 . 1 - - [ 2 3 / N o v / 2 0 1 5 1 8 : 2 7 : 4 2 ] " G E T / H T T P / 1 . 1 " 4 0 1 - 1 2 7 . 0 . 0 . 1 - - [ 2 3 / N o v / 2 0 1 5 1 8 : 2 7 : 4 9 ] " G E T / H T T P / 1 . 1 " 2 0 0 - 11 / 20
  8. Example #2 # h t t p : / /

    j o h n : h e l l o @ l o c a l h o s t : 5 0 0 0 1 2 7 . 0 . 0 . 1 - - [ 2 4 / N o v / 2 0 1 5 1 5 : 4 7 : 5 5 ] " G E T / H T T P / 1 . 1 " 4 0 1 - 1 2 7 . 0 . 0 . 1 - - [ 2 4 / N o v / 2 0 1 5 1 5 : 4 7 : 5 5 ] " G E T / H T T P / 1 . 1 " 2 0 0 - # N o t e s # P o s t m a n f a i l e d ! # T o d o s : H T T P i e , r e q u e s t s f r o m f l a s k i m p o r t F l a s k f r o m f l a s k _ h t t p a u t h i m p o r t H T T P D i g e s t A u t h a p p = F l a s k ( _ _ n a m e _ _ ) a p p . c o n f i g [ ' S E C R E T _ K E Y ' ] = ' s e c r e t k e y h e r e ' a u t h = H T T P D i g e s t A u t h ( ) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - u s e r s = { " j o h n " : " h e l l o " , " s u s a n " : " b y e " } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @ a u t h . g e t _ p a s s w o r d d e f g e t _ p w ( u s e r n a m e ) : i f u s e r n a m e i n u s e r s : r e t u r n u s e r s . g e t ( u s e r n a m e ) r e t u r n N o n e # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @ a p p . r o u t e ( ' / ' ) @ a u t h . l o g i n _ r e q u i r e d d e f i n d e x ( ) : r e t u r n " H e l l o , % s ! " % a u t h . u s e r n a m e ( ) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - i f _ _ n a m e _ _ = = ' _ _ m a i n _ _ ' : a p p . r u n ( ) 12 / 20
  9. f r o m f l a s k i

    m p o r t F l a s k , j s o n i f y , a b o r t , m a k e _ r e s p o n s e f r o m f l a s k . e x t . r e s t f u l i m p o r t A p i , R e s o u r c e , r e q p a r s e , f i e l d s , m a r s h a l f r o m f l a s k . e x t . h t t p a u t h i m p o r t H T T P B a s i c A u t h # a p p = F l a s k ( _ _ n a m e _ _ , s t a t i c _ u r l _ p a t h = " " ) - > 4 0 4 a p p = F l a s k ( _ _ n a m e _ _ ) a p i = A p i ( a p p ) a u t h = H T T P B a s i c A u t h ( ) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @ a u t h . g e t _ p a s s w o r d d e f g e t _ p a s s w o r d ( u s e r n a m e ) : i f u s e r n a m e = = ' m i g u e l ' : r e t u r n ' p y t h o n ' r e t u r n N o n e @ a u t h . e r r o r _ h a n d l e r d e f u n a u t h o r i z e d ( ) : # r e t u r n 4 0 3 i n s t e a d o f 4 0 1 t o p r e v e n t b r o w s e r s f r o m d i s p l a y i n g t h e d e f a u l t # a u t h d i a l o g r e t u r n m a k e _ r e s p o n s e ( j s o n i f y ( { ' m e s s a g e ' : ' U n a u t h o r i z e d a c c e s s ' # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - a p i . a d d _ r e s o u r c e ( T a s k L i s t A P I , ' / t o d o / a p i / v 1 . 0 / t a s k s ' , e n d p o i n t = a p i . a d d _ r e s o u r c e ( T a s k A P I , ' / t o d o / a p i / v 1 . 0 / t a s k s / < i n t : i d > ' , e n d p o i n t = # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - i f _ _ n a m e _ _ = = ' _ _ m a i n _ _ ' : a p p . r u n ( d e b u g = T r u e ) Example #1 Part 1,2 t a s k s = [ { ' i d ' : 1 , ' t i t l e ' : u ' B u y g r o c e r i e s ' , ' d e s c r i p t i o n ' : u ' M i l k , C h e e s e , P i z z a , F r u i t , T y l e n o l ' ' d o n e ' : F a l s e } , { ' i d ' : 2 , ' t i t l e ' : u ' L e a r n P y t h o n ' , ' d e s c r i p t i o n ' : u ' N e e d t o f i n d a g o o d P y t h o n t u t o r i a l o ' d o n e ' : F a l s e } ] # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - t a s k _ f i e l d s = { ' t i t l e ' : f i e l d s . S t r i n g , ' d e s c r i p t i o n ' : f i e l d s . S t r i n g , ' d o n e ' : f i e l d s . B o o l e a n , ' u r i ' : f i e l d s . U r l ( ' t a s k ' ) } 15 / 20
  10. Part 3,4 c l a s s T a s

    k L i s t A P I ( R e s o u r c e ) : d e c o r a t o r s = [ a u t h . l o g i n _ r e q u i r e d ] d e f _ _ i n i t _ _ ( s e l f ) : s e l f . r e q p a r s e = r e q p a r s e . R e q u e s t P a r s e r ( ) s e l f . r e q p a r s e . a d d _ a r g u m e n t ( ' t i t l e ' , t y p e = s t r , r e q u i r e d = h e l p = ' N o t a s k t i t l e p r o v i d e d ' l o c a t i o n = ' j s o n ' ) s e l f . r e q p a r s e . a d d _ a r g u m e n t ( ' d e s c r i p t i o n ' , t y p e = s t r , d e f a u l t = l o c a t i o n = ' j s o n ' ) s u p e r ( T a s k L i s t A P I , s e l f ) . _ _ i n i t _ _ ( ) d e f g e t ( s e l f ) : r e t u r n { ' t a s k s ' : [ m a r s h a l ( t a s k , t a s k _ f i e l d s ) f o r t a s k d e f p o s t ( s e l f ) : a r g s = s e l f . r e q p a r s e . p a r s e _ a r g s ( ) t a s k = { ' i d ' : t a s k s [ - 1 ] [ ' i d ' ] + 1 , ' t i t l e ' : a r g s [ ' t i t l e ' ] , ' d e s c r i p t i o n ' : a r g s [ ' d e s c r i p t i o n ' ] , ' d o n e ' : F a l s e } t a s k s . a p p e n d ( t a s k ) r e t u r n { ' t a s k ' : m a r s h a l ( t a s k , t a s k _ f i e l d s ) } , 2 0 1 c l a s s T a s k A P I ( R e s o u r c e ) : d e c o r a t o r s = [ a u t h . l o g i n _ r e q u i r e d ] d e f _ _ i n i t _ _ ( s e l f ) : s e l f . r e q p a r s e = r e q p a r s e . R e q u e s t P a r s e r ( ) s e l f . r e q p a r s e . a d d _ a r g u m e n t ( ' t i t l e ' , t y p e = s t r , l o c a t i o n s e l f . r e q p a r s e . a d d _ a r g u m e n t ( ' d e s c r i p t i o n ' , t y p e = s t r , l o s e l f . r e q p a r s e . a d d _ a r g u m e n t ( ' d o n e ' , t y p e = b o o l , l o c a t i o n s u p e r ( T a s k A P I , s e l f ) . _ _ i n i t _ _ ( ) d e f g e t ( s e l f , i d ) : t a s k = [ t a s k f o r t a s k i n t a s k s i f t a s k [ ' i d ' ] = = i d ] i f l e n ( t a s k ) = = 0 : a b o r t ( 4 0 4 ) r e t u r n { ' t a s k ' : m a r s h a l ( t a s k [ 0 ] , t a s k _ f i e l d s ) } d e f p u t ( s e l f , i d ) : t a s k = [ t a s k f o r t a s k i n t a s k s i f t a s k [ ' i d ' ] = = i d ] i f l e n ( t a s k ) = = 0 : a b o r t ( 4 0 4 ) t a s k = t a s k [ 0 ] a r g s = s e l f . r e q p a r s e . p a r s e _ a r g s ( ) f o r k , v i n a r g s . i t e m s ( ) : i f v i s n o t N o n e : t a s k [ k ] = v r e t u r n { ' t a s k ' : m a r s h a l ( t a s k , t a s k _ f i e l d s ) } d e f d e l e t e ( s e l f , i d ) : t a s k = [ t a s k f o r t a s k i n t a s k s i f t a s k [ ' i d ' ] = = i d ] i f l e n ( t a s k ) = = 0 : a b o r t ( 4 0 4 ) t a s k s . r e m o v e ( t a s k [ 0 ] ) r e t u r n { ' r e s u l t ' : T r u e } 16 / 20
  11. The APIs HTTP Method URI Endpoint Action GET /todo/api/v1.0/tasks tasks

    Retrieve list of tasks POST /todo/api/v1.0/tasks tasks Create a new task GET /todo/api/v1.0/tasks/[task_id] task Retrieve a task PUT /todo/api/v1.0/tasks/[task_id] task Update an existing task DELETE /todo/api/v1.0/tasks/[task_id] task Delete a task 17 / 20
  12. Notes Marshalling R e q u e s t P

    a r s e r : define the arguments and how to validate them. A side benefit of letting Flask-RESTful do the validation is that now there is no need to have a handler for the bad request code 400 error, this is all taken care of by the extension. Example #1 18 / 20