Forums

Google Charts API not working on web2py application uploaded on pythonanywhere.com

I have created a web2py application and uploaded it on pythonanywhere.com. In my application, I am using Google Charts API to create graphs and charts. It is working perfectly on my local system.

However, my application is unable to fetch this source when hosted on pythonanywhere.com and JavaScript console in the browser flashes the following error: "google not defined"

Is there a way out to use Google Charts API on pythonanywhere.com?

<!DOCTYPE html>
<!--[if (gt IE 9)|!(IE)]><!--> <html class="no-js" lang="{{=T.accepted_language or 'en'}}"> <!--<![endif]-->
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge{{=not request.is_local and ',chrome=1' or ''}}">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{{=response.title or request.application}}</title>
    <meta name="application-name" content="{{=request.application}}">
    <meta name="google-site-verification" content="">
    <!-- include stylesheets -->
</head>

<body>

<input type="hidden" name="temp" id="temp" />
<form action="">
    <table>
        <tr>
            <td><select class="form-control" style="width: 200px" name="subjects_tab1" id="subjects_tab1" onchange="tab1_js(this.value);jQuery('#temp').val(document.getElementById('subjects_tab1').value);ajax('{{=URL('default','dd')}}',['temp'],'question');get_comments(this.value)">
        <option name="" value="" id="0"></option>
        {{for s in subjects:}}
        <option name="{{=s.id}}" id="{{=s.id}}" value="{{=s.id}}">{{=s.course_name}}</option>
        {{pass}}
        </select></td>
            <td>
                <select class="form-control" style="width: 900px" name="question" id="question" onchange="check(jQuery('#question').val())">
                </select>
            </td>
        </tr>
    </table>
</form>

<div id="HD" hidden>Hi</div>
<div id="HD1" hidden></div>
<div id="HD2" hidden></div>
<br /><div id="HD3" hidden></div><br />
<br /><div id="HD4" hidden></div><br />
<input id="id1" name="id1" value="" type="hidden"/>
<input type="hidden" id="err" name="err" ></input>

<div id="chart" ></div>
<div id="completed" style="width:400px; margin:0 auto;"></div>

</body>
</html>



<script src="http://www.gstatic.com/charts/loader.js"></script>
<script type="text/javascript">
    var data="",data2="";
    var dict;
    var total_data;
    var que_wise_data=[];
    var temperory = new Array(2);
    var progress = new Array(2);
    for(i=0;i<2;i++)
    {
        progress[i] = new Array(2);
    }
    var percent;
    function tab1_js(str)   /* Ajax function to get data from the controller */
    {
        if(str=="")
        {
            document.getElementById('HD').innerHTML = "Hi";
            document.getElementById('chart').innerHTML = "";
            document.getElementById('comments_list').innerHTML = "";
            document.getElementById('completed').innerHTML = "";
            return;
        }
        str = JSON.stringify({"id1":str});
        var hr = new XMLHttpRequest();
        hr.open("POST","tab1_con",true);
        hr.setRequestHeader("Content-type", "application/json");
        hr.onreadystatechange = function(){
            if(hr.readyState==4 && hr.status==200){
            data = hr.responseText;
            document.getElementById('HD').innerHTML = data;
            make_arrays();
            }
        };
        hr.send(str);
    }
    function make_arrays()  /* Function to make javascript objects from JSON string retrieved from the controller */
    {
        main_array = data.split("~");
        //alert(typeof main_array[1]);
        dict = JSON.parse(main_array[0]);
        total_data = JSON.parse(main_array[1]);
        document.getElementById('HD1').innerHTML = total_data[2];
        que_wise_data=[];
        for(i=2; i<main_array.length-1; i++)
        {
            que_wise_data[i-2] = JSON.parse(main_array[i]);
        }
        //document.getElementById("HD1").innerHTML = main_array[main_array.length-1];
        temperory = (main_array[main_array.length-1]).split("/");
        if(temperory[1]!=0)
        {percent=(temperory[0]/temperory[1])*100;}
        else
        {percent=0}
        giveMeter(percent);
        report(total_data);
    }
    function report(total_data)    /* Function to make javascript array from JSON string retrieved from the controller to make Column Chart */
      {
        var overall_report = new Array(total_data.length+1)
        for(i=0; i<=total_data.length; i++)
        {
            overall_report[i] = new Array(2);
        }
        overall_report[0][0]="Attribute";
        overall_report[0][1]="Score";
        for(i=0; i<total_data.length; i++)
        {
        var temp_arr = JSON.stringify(total_data[i]);
        var arr = JSON.parse(temp_arr);
            overall_report[i+1][0]=arr[0];
            overall_report[i+1][1]=arr[1];
        }
        document.getElementById('HD3').innerHTML = overall_report;
        drawColumnChart(overall_report);
    }
    function que(temp)      /* Function to make javascript array from JSON string retrieved from the controller to make Pie Chart */
      {
        var que_report = new Array(temp.length+1)
        for(i=0; i<=temp.length; i++)
        {
            que_report[i] = new Array(2);
        }
        que_report[0][0]="Option";
        que_report[0][1]="Score";
        for(i=0; i<temp.length; i++)
        {
        var temp_arr = JSON.stringify(temp[i]);
        var arr = JSON.parse(temp_arr);
            que_report[i+1][0]=arr[0];
            que_report[i+1][1]=arr[1];
        }
        document.getElementById('HD4').innerHTML = que_report;
        drawPieChart(que_report);
      }
    google.charts.load("43", { packages: ["corechart", "gauge", "table", "timeline", "bar"] });
    google.charts.setOnLoadCallback(drawColumnChart);
    function drawColumnChart(table) 
    {
      var data = google.visualization.arrayToDataTable(table);  /* JavaScript Console in browser shows error for this line: "google not defined" */
      var view = new google.visualization.DataView(data);
      var options = {
        title: "Overall Attribute-wise Analysis",
        width: 900,
        height: 500,
        vAxis: {format: 'percent'},
        minValue: 0,
        maxValue: 100,
        bar: {groupWidth: "95%"},
        legend: 'bottom',
      };
      var chart = new google.visualization.ColumnChart(document.getElementById("chart"));
      chart.draw(view, options);
  }
  function check(i)
      {
          if(i==0)
          {
              report(total_data);
          }
          else
          {
              que(que_wise_data[dict[i]]);
          }
      }
      google.charts.setOnLoadCallback(drawPieChart);
      function drawPieChart(table) {
        var data = google.visualization.arrayToDataTable(table);

        var options = {
          title: 'Question-wise Analysis',
          legend: 'bottom',
        };

        var chart = new google.visualization.PieChart(document.getElementById('chart'));

        chart.draw(data, options);
      }
      google.charts.setOnLoadCallback(drawMeter);
      function giveMeter(p)
      {
          progress[0][0]="Label";
          progress[0][1]="Value";
          progress[1][0]=" ";
          progress[1][1]=p;
          drawMeter(progress);
      }
      function drawMeter(table) {
        var data = google.visualization.arrayToDataTable(table);
        var options = {
          width: 360, height: 360,
          greenFrom: (0.8*100), greenTo: (100),
          yellowFrom:(0.5*100), yellowTo: (0.8*100),
          redFrom:0, redTo:(0.5*100),
          minorTicks: 5,
          max: 100,
        };
        var chart = new google.visualization.Gauge(document.getElementById('completed'));
        chart.draw(data, options);
        }
</script>

Strange, that should work OK on PythonAnywhere if it works on your local machine. We do limit outbound connections from your server-side code if you have a free account (as an anti-hacker, anti-spammer measure) but all of the connections in your code there appear to be happening in client-side code, which (of course) we don't limit in any way.

Is there anything else in the browser debug console? If it can't find "google" that would suggest that a JavaScript file is failing to load. Perhaps something is getting a 404?