[24583] 2016-01-04_自己动手开发一个Web服务器(二)

文档创建者:s7ckTeam
浏览次数:3
最后更新:2025-01-18
2016-01-04_自己动手开发一个Web服务器(二) h t t p : / / r u s l a n s p i v a k . c o m / l s b a w s - p a r t 2 /   R u s l a n h t t p : / / c o d i n g p y . c o m / a r t i c l e / b u i l d - a - s i m p l e - w e b - s e r v e r - p a r t - t w o /   W e b   L i n u x   2 0 1 6 - 0 1 - 0 4   W e b   D j a n d o F l a s k P y r a m i d P y t h o n 使   W e b  
使 使   W e b   使 P y t h o n W e b   S e r v e r   G a t e w a y   I n t e r f a c e W S G I W e b   W S G I W S G I   W e b     W e b  
使 G u n i c o r n N g i n x / u W S G I W a i t r e s s D j a n g o F l a s k P y r a m i d W S G I W S G I   W e b   W S G I P y t h o n W S G I W e b   W S G I J a v a S e r v l e t   A P I R u b y R a c k W S G I #   T e s t e d   w i t h   P y t h o n   2 . 7 . 9 ,   L i n u x   &   M a c   O S   X i m p o r t   s o c k e t i m p o r t   S t r i n g I O i m p o r t   s y s c l a s s   W S G I S e r v e r ( o b j e c t ) :         a d d r e s s _ f a m i l y   =   s o c k e t . A F _ I N E T         s o c k e t _ t y p e   =   s o c k e t . S O C K _ S T R E A M         r e q u e s t _ q u e u e _ s i z e   =   1         d e f   _ _ i n i t _ _ ( s e l f ,   s e r v e r _ a d d r e s s ) :                 #   C r e a t e   a   l i s t e n i n g   s o c k e t                 s e l f . l i s t e n _ s o c k e t   =   l i s t e n _ s o c k e t   =   s o c k e t . s o c k e t (                         s e l f . a d d r e s s _ f a m i l y ,                         s e l f . s o c k e t _ t y p e                 )                 #   A l l o w   t o   r e u s e   t h e   s a m e   a d d r e s s                 l i s t e n _ s o c k e t . s e t s o c k o p t ( s o c k e t . S O L _ S O C K E T ,   s o c k e t . S O _ R E U S E A D D R ,   1 )                 #   B i n d                 l i s t e n _ s o c k e t . b i n d ( s e r v e r _ a d d r e s s )                 #   A c t i v a t e                 l i s t e n _ s o c k e t . l i s t e n ( s e l f . r e q u e s t _ q u e u e _ s i z e )                 #   G e t   s e r v e r   h o s t   n a m e   a n d   p o r t                 h o s t ,   p o r t   =   s e l f . l i s t e n _ s o c k e t . g e t s o c k n a m e ( ) [ : 2 ]                 s e l f . s e r v e r _ n a m e   =   s o c k e t . g e t f q d n ( h o s t )                 s e l f . s e r v e r _ p o r t   =   p o r t                 #   R e t u r n   h e a d e r s   s e t   b y   W e b   f r a m e w o r k / W e b   a p p l i c a t i o n                 s e l f . h e a d e r s _ s e t   =   [ ]         d e f   s e t _ a p p ( s e l f ,   a p p l i c a t i o n ) :                 s e l f . a p p l i c a t i o n   =   a p p l i c a t i o n         d e f   s e r v e _ f o r e v e r ( s e l f ) :                 l i s t e n _ s o c k e t   =   s e l f . l i s t e n _ s o c k e t                 w h i l e   T r u e :                         #   N e w   c l i e n t   c o n n e c t i o n                         s e l f . c l i e n t _ c o n n e c t i o n ,   c l i e n t _ a d d r e s s   =   l i s t e n _ s o c k e t . a c c e p t ( )                         #   H a n d l e   o n e   r e q u e s t   a n d   c l o s e   t h e   c l i e n t   c o n n e c t i o n .   T h e n
                        #   l o o p   o v e r   t o   w a i t   f o r   a n o t h e r   c l i e n t   c o n n e c t i o n                         s e l f . h a n d l e _ o n e _ r e q u e s t ( )         d e f   h a n d l e _ o n e _ r e q u e s t ( s e l f ) :                 s e l f . r e q u e s t _ d a t a   =   r e q u e s t _ d a t a   =   s e l f . c l i e n t _ c o n n e c t i o n . r e c v ( 1 0 2 4 )                 #   P r i n t   f o r m a t t e d   r e q u e s t   d a t a   a   l a   ' c u r l   - v '                 p r i n t ( ' ' . j o i n (                         ' <   { l i n e } n ' . f o r m a t ( l i n e = l i n e )                         f o r   l i n e   i n   r e q u e s t _ d a t a . s p l i t l i n e s ( )                 ) )                 s e l f . p a r s e _ r e q u e s t ( r e q u e s t _ d a t a )                 #   C o n s t r u c t   e n v i r o n m e n t   d i c t i o n a r y   u s i n g   r e q u e s t   d a t a                 e n v   =   s e l f . g e t _ e n v i r o n ( )                 #   I t ' s   t i m e   t o   c a l l   o u r   a p p l i c a t i o n   c a l l a b l e   a n d   g e t                 #   b a c k   a   r e s u l t   t h a t   w i l l   b e c o m e   H T T P   r e s p o n s e   b o d y                 r e s u l t   =   s e l f . a p p l i c a t i o n ( e n v ,   s e l f . s t a r t _ r e s p o n s e )                 #   C o n s t r u c t   a   r e s p o n s e   a n d   s e n d   i t   b a c k   t o   t h e   c l i e n t                 s e l f . f i n i s h _ r e s p o n s e ( r e s u l t )         d e f   p a r s e _ r e q u e s t ( s e l f ,   t e x t ) :                 r e q u e s t _ l i n e   =   t e x t . s p l i t l i n e s ( ) [ 0 ]                 r e q u e s t _ l i n e   =   r e q u e s t _ l i n e . r s t r i p ( ' r n ' )                 #   B r e a k   d o w n   t h e   r e q u e s t   l i n e   i n t o   c o m p o n e n t s                 ( s e l f . r e q u e s t _ m e t h o d ,     #   G E T                   s e l f . p a t h ,                         #   / h e l l o                   s e l f . r e q u e s t _ v e r s i o n     #   H T T P / 1 . 1                   )   =   r e q u e s t _ l i n e . s p l i t ( )         d e f   g e t _ e n v i r o n ( s e l f ) :                 e n v   =   { }                 #   T h e   f o l l o w i n g   c o d e   s n i p p e t   d o e s   n o t   f o l l o w   P E P 8   c o n v e n t i o n s                 #   b u t   i t ' s   f o r m a t t e d   t h e   w a y   i t   i s   f o r   d e m o n s t r a t i o n   p u r p o s e s                 #   t o   e m p h a s i z e   t h e   r e q u i r e d   v a r i a b l e s   a n d   t h e i r   v a l u e s                 #                 #   R e q u i r e d   W S G I   v a r i a b l e s                 e n v [ ' w s g i . v e r s i o n ' ]             =   ( 1 ,   0 )                 e n v [ ' w s g i . u r l _ s c h e m e ' ]       =   ' h t t p '                 e n v [ ' w s g i . i n p u t ' ]                 =   S t r i n g I O . S t r i n g I O ( s e l f . r e q u e s t _ d a t a )                 e n v [ ' w s g i . e r r o r s ' ]               =   s y s . s t d e r r                 e n v [ ' w s g i . m u l t i t h r e a d ' ]     =   F a l s e                 e n v [ ' w s g i . m u l t i p r o c e s s ' ]   =   F a l s e                 e n v [ ' w s g i . r u n _ o n c e ' ]           =   F a l s e                 #   R e q u i r e d   C G I   v a r i a b l e s                 e n v [ ' R E Q U E S T _ M E T H O D ' ]         =   s e l f . r e q u e s t _ m e t h o d         #   G E T                 e n v [ ' P A T H _ I N F O ' ]                   =   s e l f . p a t h                             #   / h e l l o                 e n v [ ' S E R V E R _ N A M E ' ]               =   s e l f . s e r v e r _ n a m e               #   l o c a l h o s t                 e n v [ ' S E R V E R _ P O R T ' ]               =   s t r ( s e l f . s e r v e r _ p o r t )     #   8 8 8 8                 r e t u r n   e n v
        d e f   s t a r t _ r e s p o n s e ( s e l f ,   s t a t u s ,   r e s p o n s e _ h e a d e r s ,   e x c _ i n f o = N o n e ) :                 #   A d d   n e c e s s a r y   s e r v e r   h e a d e r s                 s e r v e r _ h e a d e r s   =   [                         ( ' D a t e ' ,   ' T u e ,   3 1   M a r   2 0 1 5   1 2 : 5 4 : 4 8   G M T ' ) ,                         ( ' S e r v e r ' ,   ' W S G I S e r v e r   0 . 2 ' ) ,                 ]                 s e l f . h e a d e r s _ s e t   =   [ s t a t u s ,   r e s p o n s e _ h e a d e r s   +   s e r v e r _ h e a d e r s ]                 #   T o   a d h e r e   t o   W S G I   s p e c i f i c a t i o n   t h e   s t a r t _ r e s p o n s e   m u s t   r e t u r n                 #   a   ' w r i t e '   c a l l a b l e .   W e   s i m p l i c i t y ' s   s a k e   w e ' l l   i g n o r e   t h a t   d e t a i l                 #   f o r   n o w .                 #   r e t u r n   s e l f . f i n i s h _ r e s p o n s e         d e f   f i n i s h _ r e s p o n s e ( s e l f ,   r e s u l t ) :                 t r y :                         s t a t u s ,   r e s p o n s e _ h e a d e r s   =   s e l f . h e a d e r s _ s e t                         r e s p o n s e   =   ' H T T P / 1 . 1   { s t a t u s } r n ' . f o r m a t ( s t a t u s = s t a t u s )                         f o r   h e a d e r   i n   r e s p o n s e _ h e a d e r s :                                 r e s p o n s e   + =   ' { 0 } :   { 1 } r n ' . f o r m a t ( * h e a d e r )                         r e s p o n s e   + =   ' r n '                         f o r   d a t a   i n   r e s u l t :                                 r e s p o n s e   + =   d a t a                         #   P r i n t   f o r m a t t e d   r e s p o n s e   d a t a   a   l a   ' c u r l   - v '                         p r i n t ( ' ' . j o i n (                                 ' >   { l i n e } n ' . f o r m a t ( l i n e = l i n e )                                 f o r   l i n e   i n   r e s p o n s e . s p l i t l i n e s ( )                         ) )                         s e l f . c l i e n t _ c o n n e c t i o n . s e n d a l l ( r e s p o n s e )                 f i n a l l y :                         s e l f . c l i e n t _ c o n n e c t i o n . c l o s e ( ) S E R V E R _ A D D R E S S   =   ( H O S T ,   P O R T )   =   ' ' ,   8 8 8 8 d e f   m a k e _ s e r v e r ( s e r v e r _ a d d r e s s ,   a p p l i c a t i o n ) :         s e r v e r   =   W S G I S e r v e r ( s e r v e r _ a d d r e s s )         s e r v e r . s e t _ a p p ( a p p l i c a t i o n )         r e t u r n   s e r v e r i f   _ _ n a m e _ _   = =   ' _ _ m a i n _ _ ' :         i f   l e n ( s y s . a r g v )   <   2 :                 s y s . e x i t ( ' P r o v i d e   a   W S G I   a p p l i c a t i o n   o b j e c t   a s   m o d u l e : c a l l a b l e ' )         a p p _ p a t h   =   s y s . a r g v [ 1 ]         m o d u l e ,   a p p l i c a t i o n   =   a p p _ p a t h . s p l i t ( ' : ' )         m o d u l e   =   _ _ i m p o r t _ _ ( m o d u l e )         a p p l i c a t i o n   =   g e t a t t r ( m o d u l e ,   a p p l i c a t i o n )         h t t p d   =   m a k e _ s e r v e r ( S E R V E R _ A D D R E S S ,   a p p l i c a t i o n )         p r i n t ( ' W S G I S e r v e r :   S e r v i n g   H T T P   o n   p o r t   { p o r t }   . . . n ' . f o r m a t ( p o r t = P O R T ) )         h t t p d . s e r v e _ f o r e v e r ( )
1 5 0 使 P y r a m i d F l a s k D j a n g o W S G I G i t h u b 退 P y t h o n 使 P y r a m i d F l a s k D j a n g o 使 P y r a m i d G i t h u b w e b s e r v e r 2 . p y $   p y t h o n   w e b s e r v e r 2 . p y P r o v i d e   a   W S G I   a p p l i c a t i o n   o b j e c t   a s   m o d u l e : c a l l a b l e v i r t u a l e n v $   [ s u d o ]   p i p   i n s t a l l   v i r t u a l e n v $   m k d i r   ~ / e n v s $   v i r t u a l e n v   ~ / e n v s / l s b a w s / $   c d   ~ / e n v s / l s b a w s / $   l s b i n     i n c l u d e     l i b $   s o u r c e   b i n / a c t i v a t e ( l s b a w s )   $   p i p   i n s t a l l   p y r a m i d ( l s b a w s )   $   p i p   i n s t a l l   f l a s k ( l s b a w s )   $   p i p   i n s t a l l   d j a n g o p y r a m i d a p p . p y w e b s e r v e r 2 . p y 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   f r o m   P y r a m i d ! n ' ,                 c o n t e n t _ t y p e = ' t e x t / p l a i n ' ,         ) c o n f i g   =   C o n f i g u r a t o r ( )
  W e b   P y r a m i d c a l l a b l e H T T P P y r a m i d r o u t e / h e l l o P y r a m i d 使 F l a s k c o n f i g . a d d _ r o u t e ( ' h e l l o ' ,   ' / h e l l o ' ) 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 e l l o ' ) a p p   =   c o n f i g . m a k e _ w s g i _ a p p ( ) ( l s b a w s )   $   p y t h o n   w e b s e r v e r 2 . p y   p y r a m i d a p p : a p p W S G I S e r v e r :   S e r v i n g   H T T P   o n   p o r t   8 8 8 8   . . . w e b s e r v e r 2 . p y p y r a m i d a p p a p p h t t p : / / l o c a l h o s t : 8 8 8 8 / h e l l o c u r l $   c u r l   - v   h t t p : / / l o c a l h o s t : 8 8 8 8 / h e l l o . . . 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   i m p o r t   R e s p o n s e f l a s k _ a p p   =   F l a s k ( ' f l a s k a p p ' ) @ f l a s k _ a p p . r o u t e ( ' / h e l l o ' )
G i t h u b F l a s k 使 F l a s k D j a n g o 使 D j a n g o P y t h o n W S G I d e f   h e l l o _ w o r l d ( ) :         r e t u r n   R e s p o n s e (                 ' H e l l o   w o r l d   f r o m   F l a s k ! n ' ,                 m i m e t y p e = ' t e x t / p l a i n '         ) a p p   =   f l a s k _ a p p . w s g i _ a p p f l a s k a p p . p y ( l s b a w s )   $   p y t h o n   w e b s e r v e r 2 . p y   f l a s k a p p : a p p W S G I S e r v e r :   S e r v i n g   H T T P   o n   p o r t   8 8 8 8   . . . h t t p : / / l o c a l h o s t : 8 8 8 8 / h e l l o c u r l $   c u r l   - v   h t t p : / / l o c a l h o s t : 8 8 8 8 / h e l l o . . . d j a n g o a p p . p y h e l l o w o r l d i m p o r t   s y s s y s . p a t h . i n s e r t ( 0 ,   ' . / h e l l o w o r l d ' )
使 D j a n g o D j a n g o 使 D j a n d o W S G I   W e b   W S G I P y t h o n   W e b   P y t h o n W S G I f r o m   h e l l o w o r l d   i m p o r t   w s g i a p p   =   w s g i . a p p l i c a t i o n d j a n g o a p p . p y ( l s b a w s )   $   p y t h o n   w e b s e r v e r 2 . p y   d j a n g o a p p : a p p W S G I S e r v e r :   S e r v i n g   H T T P   o n   p o r t   8 8 8 8   . . . h t t p : / / l o c a l h o s t : 8 8 8 8 / h e l l o c u r l $   c u r l   - v   h t t p : / / l o c a l h o s t : 8 8 8 8 / h e l l o . . . d e f   r u n _ a p p l i c a t i o n ( a p p l i c a t i o n ) :         " " " S e r v e r   c o d e . " " "         #   T h i s   i s   w h e r e   a n   a p p l i c a t i o n / f r a m e w o r k   s t o r e s         #   a n   H T T P   s t a t u s   a n d   H T T P   r e s p o n s e   h e a d e r s   f o r   t h e   s e r v e r         #   t o   t r a n s m i t   t o   t h e   c l i e n t         h e a d e r s _ s e t   =   [ ]
1 .   W S G I 2 .   H T T P W S G I / C G I 3 .   / H T T P H T T P r e s p o n s e   h e a d e r s / 4 .   H T T P W S G I W S G I         #   E n v i r o n m e n t   d i c t i o n a r y   w i t h   W S G I / C G I   v a r i a b l e s         e n v i r o n   =   { }         d e f   s t a r t _ r e s p o n s e ( s t a t u s ,   r e s p o n s e _ h e a d e r s ,   e x c _ i n f o = N o n e ) :                 h e a d e r s _ s e t [ : ]   =   [ s t a t u s ,   r e s p o n s e _ h e a d e r s ]         #   S e r v e r   i n v o k e s   t h e   a p p l i c a t i o n '   c a l l a b l e   a n d   g e t s   b a c k   t h e         #   r e s p o n s e   b o d y         r e s u l t   =   a p p l i c a t i o n ( e n v i r o n ,   s t a r t _ r e s p o n s e )         #   S e r v e r   b u i l d s   a n   H T T P   r e s p o n s e   a n d   t r a n s m i t s   i t   t o   t h e   c l i e n t         d e f   a p p ( e n v i r o n ,   s t a r t _ r e s p o n s e ) :         " " " A   b a r e b o n e s   W S G I   a p p . " " "         s t a r t _ r e s p o n s e ( ' 2 0 0   O K ' ,   [ ( ' C o n t e n t - T y p e ' ,   ' t e x t / p l a i n ' ) ] )         r e t u r n   [ ' H e l l o   w o r l d ! ' ] r u n _ a p p l i c a t i o n ( a p p ) a p p l i c a t i o n a p p l i c a t i o n e n v i r o n s t a r t _ r e s p o n s e s t a r t _ r e s p o n s e
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则