Toggle Light / Dark / Auto color theme
Toggle table of contents sidebar
nameko.web.handlers 源代码
from functools import partial
from logging import getLogger
import six
from eventlet.event import Event
from werkzeug.routing import Rule
from werkzeug.wrappers import Response
from nameko.exceptions import BadRequest , serialize
from nameko.extensions import Entrypoint
from nameko.web.server import WebServer
[文档]
_log = getLogger ( __name__ )
[文档]
class HttpRequestHandler ( Entrypoint ):
[文档]
server = WebServer ()
def __init__ ( self , method , url , ** kwargs ):
[文档]
self . method = method
super ( HttpRequestHandler , self ) . __init__ ( ** kwargs )
[文档]
def get_url_rule ( self ):
return Rule ( self . url , methods = self . method . split ( ',' ))
[文档]
def setup ( self ):
self . server . register_provider ( self )
[文档]
def stop ( self ):
self . server . unregister_provider ( self )
super ( HttpRequestHandler , self ) . stop ()
[文档]
def get_entrypoint_parameters ( self , request ):
args = ( request ,)
kwargs = request . path_values
return args , kwargs
[文档]
def handle_request ( self , request ):
request . shallow = False
try :
context_data = self . server . context_data_from_headers ( request )
args , kwargs = self . get_entrypoint_parameters ( request )
self . check_signature ( args , kwargs )
event = Event ()
self . container . spawn_worker (
self , args , kwargs , context_data = context_data ,
handle_result = partial ( self . handle_result , event ))
result = event . wait ()
response = self . response_from_result ( result )
except Exception as exc :
response = self . response_from_exception ( exc )
return response
[文档]
def handle_result ( self , event , worker_ctx , result , exc_info ):
event . send ( result , exc_info )
return result , exc_info
[文档]
def response_from_result ( self , result ):
if isinstance ( result , Response ):
return result
headers = None
if isinstance ( result , tuple ):
if len ( result ) == 3 :
status , headers , payload = result
else :
status , payload = result
else :
payload = result
status = 200
if not isinstance ( payload , six . string_types ):
raise TypeError (
"Payload must be a string. Got ` {!r} `" . format ( payload )
)
return Response (
payload ,
status = status ,
headers = headers ,
)
[文档]
def response_from_exception ( self , exc ):
if (
isinstance ( exc , self . expected_exceptions ) or
isinstance ( exc , BadRequest )
):
status_code = 400
else :
status_code = 500
error_dict = serialize ( exc )
payload = u 'Error: {exc_type} : {value} \n ' . format ( ** error_dict )
return Response (
payload ,
status = status_code ,
)
[文档]
http = HttpRequestHandler . decorator