0

I am preparing a web service using django in python. When I start web service, I would like to have a main function to run. However, code below did not work in web service. I want to have an initializer function which will fill the structures defined global. I can achieve it by directly defining an init function and call it end of the module but I don't know whether this is the proper way of doing so.

if __name__ == '__main__':
     main()    

Here similar question was posted. As I understand there is no clear solution for that and I find my way to do this. I defined a dummy function in web service module like:

def warmup(request):
   response = HttpResponse()
   response.write("ok")
   return response

We start application with command sudo python manage.py runserver 0.0.0.0:8081 so I add a piece of code in manage.py such that:

#!/usr/bin/env python
import os
import sys
import requests
import threading
import time


def warmup_request():
    print "warmup.."
    time.sleep(1)

    try:
        r = requests.get("http://localhost:8081/warmup/")
        if r.content == "ok":
            return

    except Exception, e:
        pass

    threading.Timer(0,warmup_request).start() 




if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")

    from django.core.management import execute_from_command_line

    warmup_request()

    execute_from_command_line(sys.argv)

If warmup service API returns ok it means loading initial data process has finished. By defining a global flag, we can block all other service API requests before warming up has finished. Or instead defining global flag we may use request_started signal stated here to block all incoming requests with more little effort.

Community
  • 1
  • 1
mustafa.yavuz
  • 1,274
  • 2
  • 21
  • 40

0 Answers0