08-26-2020 02:55 PM
Hi Everyone. I have written a simple web application based on Django for work with UCM API. While it works in Django Development Server Mode (`python manange.py runserver`) everything is ok, I can connect to UCM without any issue.
But when I deployed an application on MS IIS it stopped work at all and I have got an Server Error (500). If I set `DEBUG = True` the server will raise an error:
Request Method: POST Request URL: https://youwillneverguess.com/cucm/device_search Django Version: 3.0.8 Python Version: 3.7.8 Traceback (most recent call last): File "c:\python37\lib\site-packages\django\core\handlers\exception.py", line 34, in inner response = get_response(request) File "c:\python37\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response response = self.process_exception_by_middleware(e, request) File "c:\python37\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) File "c:\python37\lib\site-packages\django\contrib\auth\decorators.py", line 21, in _wrapped_view return view_func(request, *args, **kwargs) File "C:\inetpub\wwwroot\xxxxxxxxxx\app_cucm\views.py", line 80, in cucm_device_search resp = cucm_script_sql_device_search(cucm_request.lower(), cucm_object) File "C:\inetpub\wwwroot\xxxxxxxxxx\cucm\cucm_device\cucm_device_sql.py", line 53, in cucm_script_sql_device_search resp = cucm_script_sql_executor(sql) File "C:\inetpub\wwwroot\xxxxxxxxxx\cucm\cucm_connector.py", line 166, in cucm_script_sql_executor cucm, cucm_history = cucm_connector() File "C:\inetpub\wwwroot\xxxxxxxxxx\cucm\cucm_connector.py", line 82, in cucm_connector transport = Transport(cache=SqliteCache(), session=session, timeout=20) File "c:\python37\lib\site-packages\zeep\cache.py", line 80, in __init__ self._db_path = path if path else _get_default_cache_path() File "c:\python37\lib\site-packages\zeep\cache.py", line 160, in _get_default_cache_path os.makedirs(path) File "c:\python37\lib\os.py", line 213, in makedirs makedirs(head, exist_ok=exist_ok) File "c:\python37\lib\os.py", line 223, in makedirs mkdir(name, mode) Exception Type: PermissionError at /cucm/device_search Exception Value: [WinError 5] Access is denied: '.\\zeep'
Debug from Django:
C:\inetpub\wwwroot\xxxxxxxxxxxx\cucm\cucm_connector.py in cucm_connector transport = Transport(cache=SqliteCache(), session=session, timeout=20) ▼ Local vars Variable Value BASE_DIR 'C:\\inetpub\\wwwroot\\XXXXXXXXXXX' binding '{http://www.cisco.com/AXLAPIService/}AXLAPIBinding' cluster {'cucm_default': True, 'cucm_description': 'Production Cluster', 'cucm_ip': 'XXX.XXX.XXX.XXX', 'cucm_login': 'login', 'cucm_password': 'password', 'cucm_publisher': 'cucm.youwillneverguess.com'} location 'https://xxx.xxx.xxx.xxx:8443/axl/' session <requests.sessions.Session object at 0x000001E6E832FF48> wsdl 'C:\\inetpub\\wwwroot\\xxxxxxxxxxx\\cucm/axlsqltoolkit/schema/11.5/AXLAPI.wsdl' wsdl_ris 'https://xxx.xxx.xxx.xxx:8443/realtimeservice2/services/RISService70?wsdl' c:\python37\lib\site-packages\zeep\cache.py in __init__ self._db_path = path if path else _get_default_cache_path() ▼ Local vars Variable Value path None self <zeep.cache.SqliteCache object at 0x000001E6E8349BC8> timeout 3600 c:\python37\lib\site-packages\zeep\cache.py in _get_default_cache_path os.makedirs(path) ▼ Local vars Variable Value path '.\\zeep\\Cache' c:\python37\lib\os.py in makedirs makedirs(head, exist_ok=exist_ok) ▼ Local vars Variable Value exist_ok False head '.\\zeep' mode 511 name '.\\zeep\\Cache' tail 'Cache' c:\python37\lib\os.py in makedirs mkdir(name, mode) ▼ Local vars Variable Value exist_ok False head '.' mode 511 name '.\\zeep' tail 'zeep'
Do you have any idea?
Solved! Go to Solution.
08-27-2020 12:51 AM
I found the solution. Yes, it possible to disable the cache, however in my opinion the better way relocate the cache db file to the project directory.
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) disable_warnings(InsecureRequestWarning) wsdl = os.path.join(BASE_DIR, "cucm/axlsqltoolkit/schema/11.5/AXLAPI.wsdl") wsdl_ris = "https://{host}:8443/realtimeservice2/services/RISService70?wsdl".format(host=cluster["cucm_publisher"]) location = "https://{host}:8443/axl/".format(host=cluster["cucm_publisher"]) binding = "{http://www.cisco.com/AXLAPIService/}AXLAPIBinding" session = requests.Session() if settings.DEBUG: # DEBUG = True - Development mode session.verify = False else: # DEBUG = False - Production mode cert = os.path.join(BASE_DIR, "cucm/{}.pem".format(cucm_cluster)) if os.path.isfile(cert): session.verify = cert session.auth = HTTPBasicAuth(cluster["cucm_login"], cluster["cucm_password"]) transport = Transport(cache=SqliteCache(os.path.join(BASE_DIR, "cucm/cache.db")), session=session, timeout=20) history = HistoryPlugin() # For Cisco UCM AXL Request client = Client(wsdl=wsdl, transport=transport, plugins=[history]) service = client.create_service(binding, location) # For Cisco UCM RIS Request client_ris = Client(wsdl=wsdl_ris, transport=transport, plugins=[history]) factory = client_ris.type_factory("ns0") else: log_message = "'{}.pem' Tomcat Certificate not found!".format(cluster["cucm_publisher"]) logger.error(log_message, extra={"username": "cucm_script"})
08-26-2020 03:10 PM
Not being super familiar with IIS/Django, my initial guess from the stack trace would be that there is a permission problem when Zeep attempts to cache its interim WSDL representation stuff on disk...maybe at ./zeep/cache?
You should be able to disable this caching (see the Zeep docs) though maybe just to help in pinning down the issue, as that may impact performance quite a bit due to the very large AXL WSDL size and overhead of compiling it.
08-27-2020 12:51 AM
I found the solution. Yes, it possible to disable the cache, however in my opinion the better way relocate the cache db file to the project directory.
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) disable_warnings(InsecureRequestWarning) wsdl = os.path.join(BASE_DIR, "cucm/axlsqltoolkit/schema/11.5/AXLAPI.wsdl") wsdl_ris = "https://{host}:8443/realtimeservice2/services/RISService70?wsdl".format(host=cluster["cucm_publisher"]) location = "https://{host}:8443/axl/".format(host=cluster["cucm_publisher"]) binding = "{http://www.cisco.com/AXLAPIService/}AXLAPIBinding" session = requests.Session() if settings.DEBUG: # DEBUG = True - Development mode session.verify = False else: # DEBUG = False - Production mode cert = os.path.join(BASE_DIR, "cucm/{}.pem".format(cucm_cluster)) if os.path.isfile(cert): session.verify = cert session.auth = HTTPBasicAuth(cluster["cucm_login"], cluster["cucm_password"]) transport = Transport(cache=SqliteCache(os.path.join(BASE_DIR, "cucm/cache.db")), session=session, timeout=20) history = HistoryPlugin() # For Cisco UCM AXL Request client = Client(wsdl=wsdl, transport=transport, plugins=[history]) service = client.create_service(binding, location) # For Cisco UCM RIS Request client_ris = Client(wsdl=wsdl_ris, transport=transport, plugins=[history]) factory = client_ris.type_factory("ns0") else: log_message = "'{}.pem' Tomcat Certificate not found!".format(cluster["cucm_publisher"]) logger.error(log_message, extra={"username": "cucm_script"})
Discover and save your favorite ideas. Come back to expert answers, step-by-step guides, recent topics, and more.
New here? Get started with these tips. How to use Community New member guide