Hi Folks,
I am facing what I think is a common issue with webhooks.
I have external app(s) sending webhooks to odoo server on a url endpoint matching a controller.
When receiving the webhook, I need to do 2 things:
1/ Quickly respond to the sender than I received the webhook (e.g. with an 200 response)
2/ Then, after that - but immediately after that - process the webhook by calling some python method.
I can't find a way to do it. Here is a minimalistic starting point :
I have an Odoo controller with the endpoint route to receive the webhook
class WebHookController(http.Controller):
@http.route("/webhook", type="json", auth="public", method=["POST"])
def webhook_listener(self, **kwargs):
data = self.get_webhook_data(request) # This is a method that parse the request to get all the data needed to process
# Here I naively process the hook but that is not ok !
self.process_hook(data)
# Here I respond "OK, I received your hook, thanks"
Response.status = "200"
return json.dumps("OK")
In this basic example, my problem is that I process the hook before responding to sender, which is not OK because it can fail or take a long time.
I want to call it after responding.
I thought about the following strategies, without success:
- just store the data, respond, then make a scheduled action (cron) to process : that would take to much time to process (e.g. process 1 minute after receiving the hook is already to late)
- make use of multi thread with
async_process = threading.Thread(target=process_hook...)
still, my controller is waiting for the process_hook method to finish
- call process_hook method through a http request ? ... Still the controller waits for the response..
Any idea how I could deal with that ?
Maybe I missed something here because this seems to be a classic issue when handling webhooks.
Thanks for your help!