0

내 앱 엔진 앱의 프런트 엔드에서 this codelab.을 기반으로 작업 해 왔습니다. 주식 시세 기호 (예 : AMZN 또는 GOOG)를 입력하는 텍스트 상자가 있습니다. 이 광고는 백그라운드에서 Google BigQuery에 대한 쿼리를 실행하기위한 기준으로 사용되며 Google 시각화 API line chart에 며칠 동안 트윗 카운트를 표시한다고 가정합니다.App Engine의 Google 시각화 API 관련 문제

그러나 소스 코드에서 본 결과에 따라 BigQuery의 쿼리 결과가 데이터 템플릿 변수 {{data}}로 가져 오지 않습니다. 여기에 대부분의 경우처럼 내 HTML 코드 (라고 index1.html), 년대 코드 랩의 : 나는 라인 차트 구글 코드 놀이터 코드보고 후 HTML과 자바 스크립트로 엉망이 있지만, 정말

<!-- 
You are free to copy and use this sample in accordance with the terms of the 
Apache license (http://www.apache.org/licenses/LICENSE-2.0.html) 
--> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="content-type" content="text/html; charset=utf-8"/> 
<title> 
    Jibdan Analytics 
</title> 
<script type="text/javascript" src="//www.google.com/jsapi"></script> 
<script type="text/javascript"> 
    google.load('visualization', '1', {packages: ['corechart']}); 
</script> 
<script type="text/javascript"> 

    countdata = {{ data }} 

    function drawVisualization() { 
    // Create and populate the data table. 
    var data = google.visualization.DataTable(query_response); 

    // Create and draw the visualization. 
    var chart = new google.visualization.LineChart(document.getElementById('visualization')); 
     chart.draw(data, {title: "Tweets by Day by Ticker", 
      curveType: "function", 
        width: 800, height: 600} 
      ); 
    } 


    google.setOnLoadCallback(drawVisualization); 
</script> 
</head> 
<body style="font-family: Arial;border: 0 none;"> 
<div id="visualization" style="width: 800px; height: 640px;"></div> 
</body> 
</html> 

그 문제는 그 템플릿 변수와 같다.

여기에는 관련 Python 코드도 있습니다. 첫 번째 방법은 BigQuery 응답을 가져와 시각화 API에서 처리하여 꺾은 선형 차트를 생성해야하는 형식으로 지정해야합니다. get 메소드에는 실행할 쿼리 문자열이 있으며 결과를 index1.html 템플릿에 렌더링합니다. 코드 랩과 매우 유사합니다.

class QueryHandler(webapp2.RequestHandler): 

def _bq2line(self, bqdata): 
    logging.info(bqdata) 
    columnNameDate = bqdata['schema']['fields'][0]['name'] 
    columnNameVal = bqdata['schema']['fields'][1]['name'] 
    logging.info("Column Names=%s, %s" % (columnNameDate, columnNameVal)) 
    countdata = { 'cols': ({'id':columnNameDate, 'label':columnNameDate, 'type':'string'}, 
     {'id':columnNameVal, 'label':columnNameVal, 'type':'number'})} 
    countdata['rows'] = []; 
    logging.info(countdata) 
    for row in bqdata['rows']: 
     newrow = ({'c':[]}) 
     newrow['c'].append({'v': row['f'][0]['v']}) 
     newrow['c'].append({'v':row['f'][1]['v']}) 
     countdata['rows'].append(newrow) 
    logging.info('FINAL COUNTDATA---') 
    logging.info(countdata) 
    self.response.out.write(countdata) 
    return json.dumps(countdata) 

def get(self): 

    QUERY = """ 
      SELECT STRFTIME_UTC_USEC(querydate, "%Y-%m-%d") AS tweet_date, COUNT(tweet_id) AS tweet_count 
      FROM [jibdantweetstream.tweetdata_09_21_2013] 
      WHERE gcs_load = true AND (REGEXP_MATCH(ticker, '""" + self.request.get('stock') + """')) 
      GROUP BY tweet_date 
      ORDER BY tweet_date 
      """     

    try: 
     query_request = bigquery_service.jobs() 
     query = {'data': self._bq2line(bq.Query(QUERY, BILLING_ID)), 
       'query': QUERY} 
     query_response = query_request.query(projectId=BILLING_ID, 
             body=query).execute() 
     template = os.path.join(os.path.dirname(__file__), 'result1.html') 
     self.response.out.write(render(template, query_response)) 

    finally: 
     self.response.out.write('<a href="/">Click here</a> to go back to the Search page. ') 

그렇기 때문에 그것이 있습니다. 내가 self.response.out.write 문을 몇 개 가지고있는 것을 볼 수 있습니다. 왜냐하면 쿼리 결과로 응답을 얻었는지 알고 싶었 기 때문입니다. 결과가 나타남에 따라 OAuth2 문제가 아닌 것으로 알고 있습니다. 나는 그 밖에 무엇이 될 수 있는지 모른다.

Many Thanks in Advance.

+1

내가 거기에 가정은'의 장소에서 출력 데이터에가는 일부 서버 측 처리입니다 {{데이터}}' , 맞지? 그렇다면 문제는 당신이 변수'countdata = {{data}}'를 만들지 만 DataTable 객체를 생성 할 때 변수'query_response'를 참조한다는 것입니다. – asgallant

+0

@asgallant 예, 있습니다. 질의 결과를 검색하여'{{data}} '에 넣어야합니다. 그러나 내가 얻는 것은 빈 평등이다 :'countdata ='. 그래서 전 완전히 혼란 스럽습니다. 귀하의 의견을 주셔서 감사합니다, 그것은 나에게/바이올린과 함께 볼 무언가를 주셨습니다. –

+0

그런 경우'render (template, query_response)'에서'query_response'는 템플릿이 기대하는 키 ('data')를 갖지 않을 것입니다. –

답변

0

"View Source"는 자바 스크립트에서 구문 오류에 대해 설명하는 항목 (Firebug, Chrome 개발자 도구)과 결합되어 친구입니다. 귀하가 제공 한 것을 살펴보면, {{ data }}을 확장하면 구문 오류가 발생합니다. 그리고 분명한 것은, countdata을 설정했지만 대신 query_response을 참조하는 것입니다.

데이터는 날짜와 개수이므로 엔티티 이스케이프 문제는 발생하지 않지만 다른 검색어를 포함하도록 검색어를 확장하면 {{ data }}이 HTML로 이스케이프 처리됩니다. JS에서 탈출 할 필요가있는 곳. 이를 처리하려면 escapejs 필터가 필요합니다. 코드에서

+0

먼저 감사합니다. 사실, 구문 오류 또는 아무것도 throw하지 않습니다. 나는 소스를 볼 때 그것을 추가하는 것을 잊어 버렸고, 나는'query_response =' 을 얻는다. 그래서 아무 것도 반환되지 않는다. ** 그게 ** 나를 믿을 수 없을 정도로 의아하게 만들었습니다. –

+0

여기에 있어야 할 원래 소식에 댓글을 남겼습니다. –

0

:

countdata = { 'cols': ({'id':columnNameDate, 'label':columnNameDate, 'type':'string'}, 
    {'id':columnNameVal, 'label':columnNameVal, 'type':'number'})} 

그것은해야한다 :

countdata = { 'cols': [{'id':columnNameDate, 'label':columnNameDate, 'type':'string'}, 
    {'id':columnNameVal, 'label':columnNameVal, 'type':'number'}]}