Как передать mongodb возвращаемые значения в массив JavaScript? - PullRequest
0 голосов
/ 10 апреля 2019

Я использую флягу для рендеринга HTML-шаблона. Я хочу сохранить все элементы, возвращаемые запросом pymongo, в массив скриптов java. Я создал массив c [], который сначала пуст. возвратил элементы запроса pymongo, и я помещаю его в массив c.

Я попробовал некоторые ответы от stackoverflow, но он не соответствует пониманию моего вопроса

мой HTML-код здесь: home.html

<html>
    <head>
        <title>ii</title>
  </head>
<script>
var c=[]
{% for todo in collection %}
c.push{{todo["q"]}};
{% endfor %}

</script>
</body>
</html>

файл моего флакона: -

from flask import Flask, render_template,json
from pymongo import MongoClient
from bson import json_util,ObjectId

app = Flask(__name__) 
mongo_object = MongoClient("localhost", 27017)
app.debug= True
db = mongo_object['test']
collection = db['myc']
@app.route('/')
def index():
    return render_template('home.html')


@app.route('/find',methods=['GET', 'POST']) 
def pymongo_data_display():
    my_data = collection.find()
    a1="active"
    return render_template('home.html',a1=a1,collection=my_data,t="hi",h="hoho")
    '''
    if not my_data:
        return 'no data'
    else:        
        return my_data
    '''

if __name__ == '__main__': 
        app.run()

it gives nothing.But can anyone suggest what to do here?

Ответы [ 2 ]

1 голос
/ 10 апреля 2019

Это работает:

home.html file:

<html>
<head>
<title>ii</title>
<script>
    function populateMyDiv(){
        var ul=document.createElement('ul');
        {% for name in collection %}
            var li=document.createElement('li');
            ul.appendChild(li);
            li.innerHTML=li.innerHTML + "{{name}}";
        {% endfor %}
        document.getElementById("test").appendChild(ul);
    }
</script>
</head>
<body onload="populateMyDiv()">
    <div id="test"></div>
</body>
</html>

файл test.py:

from flask import Flask, render_template
from pymongo import MongoClient
import json
app = Flask(__name__)

mongo_obj=MongoClient("localhost", 27017)


@app.route('/')
def hello_world():
    db = mongo_obj['your_database']
    collection = db['your_collection']
    temp = collection.find()
    my_data = []
    for x in temp:
        my_data.append(x['name'])
    return render_template('home.html',collection=my_data)
1 голос
/ 10 апреля 2019

Есть несколько вещей:

  1. Является ли my_data непустым, когда вы предоставляете его render_template? Какова структура данных?
  2. Какое значение todo["q"] в шаблоне? Это число или строка? Если последнее, вам нужно будет заключить его в кавычки, прежде чем вставлять в массив JavaScript.
  3. Вам не хватает скобок в c.push{{todo["q"]}};.

Допустим, вам нужно сохранить список строк в массиве JavaScript (т. Е. Вам нужно заключить в кавычки значения перед тем, как вставить их в массив). Затем вам нужно определить пользовательский фильтр для достижения этого. Вот полный пример:

import jinja2                                                                   

def quote(value):                                                               
    return '"{}"'.format(value)                                                 

env = jinja2.Environment()                                                      
env.filters['quote'] = quote                                                    


template = env.from_string("""                                                  
<script>                                                                        
var c = [];                                                                     
{% for item in data %}                                                          
    c.push({{ item.q|quote|safe }});                                            
{% endfor %}                                                                    
</script>                                                                       
""")                                                                            

data = [{'q': 1}, {'q': 2}, {'q': 3}]                                           
print(template.render(data=data))
...