/
demo_service_client.py
executable file
·139 lines (119 loc) · 3.97 KB
/
demo_service_client.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#!/usr/bin/env python
import logging
import time
from brubeck.connections import Mongrel2Connection
from brubeck.request_handling import (
JSONMessageHandler,
WebMessageHandler,
Brubeck,
render,
)
from brubeckservice.base import (
ServiceClientMixin,
ServiceMessageHandler,
coro_sleep,
)
from brubeck.templating import (
Jinja2Rendering,
load_jinja2_env,
)
# some static data for testing
service_addr = "ipc://run/slow"
service_resp_addr = "ipc://run/slow_response"
service_passphrase = "my_shared_secret"
service_path = '/service/slow'
request_headers = {}
request_method = 'request'
sync_request_arguments = {"RETURN_DATA": 'I made a round trip, it took a while but I bring results.'}
async_request_arguments = {"RETURN_DATA": 'I made a round trip, it took so long I will respond to no one.'}
class DemoHandler(
Jinja2Rendering,
WebMessageHandler
):
def get(self):
# just return a page with some links
context = {
'name': "Async is faster, but ... nothing to report on my trip.",
}
return self.render_template('index.html', **context)
class CallServiceAsyncHandler(
Jinja2Rendering,
ServiceClientMixin,
WebMessageHandler
):
def get(self):
# register our resource
self.register_service(service_addr, service_resp_addr, service_passphrase)
# create a servicerequest
service_request = self.create_service_request(
service_path,
request_method,
async_request_arguments
)
## Async
self.send_service_request_nowait(service_addr, service_request)
# now return to client whatever you want
self.set_status(200)
context = {
'name': "Async is faster, but ... nothing to report on my trip.",
}
return self.render_template('success.html', **context)
class CallServiceSyncHandler(
Jinja2Rendering,
ServiceClientMixin,
WebMessageHandler
):
def get(self):
# register our service, if exist nothing happens
self.register_service(service_addr, service_resp_addr, service_passphrase)
# create a servicerequest
service_request = self.create_service_request(
service_path,
request_method,
sync_request_arguments
)
## Sync
(response, handler_response) = self.send_service_request(service_addr, service_request)
# now return to client what you got back
self.set_status(200)
context = {
'name': response.body["RETURN_DATA"],
}
return self.render_template('success.html', **context)
class ServiceResponseHandler(ServiceMessageHandler):
"""handles the response from our service
"""
def response(self):
"""On successfull response from Brubeck Service"""
if self.status_code == 200:
logging.debug("Successfull %s:%s)!" % (self.status_code,self.status_msg))
else:
logging.debug("Failed (%s:%s)!" % (self.status_code,self.status_msg))
# This is not a response to the client, but to the original handler
# or no one at all if the service is called async
return self.render()
##
## runtime configuration
##
config = {
'msg_conn': Mongrel2Connection('tcp://127.0.0.1:9999',
'tcp://127.0.0.1:9998'),
'handler_tuples': [ ## Set up our routes
# Handle our service responses
(r'^/service/slow', ServiceResponseHandler),
# Handle our request
(r'^/service/sync', CallServiceSyncHandler),
(r'^/service/async', CallServiceAsyncHandler),
(r'^/$', DemoHandler),
],
'cookie_secret': '51cRa%76fa^O9h$4cwl$!@_F%g9%l_)-6OO1!',
'template_loader': load_jinja2_env('./templates'),
'log_level': logging.DEBUG,
}
##
## get us started!
##
app = Brubeck(**config)
## start our server to handle requests
if __name__ == "__main__":
app.run()