Как предотвратить исчезновение данных SQLite при обновлении веб-страницы - PullRequest
0 голосов
/ 12 января 2019

Я впервые работаю с базами данных phyton и SQLite, и у меня возникла проблема. В моем файле app.py я установил соединение с базой данных, затем извлек данные и сохранил их в курсоре obj. Я хочу показать данные БД на веб-странице, поэтому я передал их с

render_template('home.html', data=cursor)

, который работает, он показывает данные, которые я хочу на моей веб-странице, но когда я обновляю страницу, я получаю

GET http://127.0.0.1:5000/static/css/template.css net::ERR_ABORTED 404 (NOT FOUND)     

и мои данные больше не отображаются.

Я пытался найти решение, но не нашел решения, которое решает мою проблему. Ниже вы можете найти мой код app.py:

from flask import Flask, render_template
import sqlite3
import os.path

app = Flask(__name__)
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
db_path = os.path.join(BASE_DIR, "movies.db")
with sqlite3.connect(db_path, check_same_thread=False) as db:
#I used check_same_thread=False to solve a same thread error 
     cursor = db.cursor()
     cursor.execute("SELECT * FROM data")



@app.route("/")
def home():

   return render_template('home.html', data=cursor)


if __name__== "__main__":
    app.run(debug=True)

часть моего дома.html:

<body>
    {% extends "template.html" %}
    {% block content %}
    {% for item in data %}
    <tr>
        <td><a>{{item[1]}}</a></td>
    </tr>
    {% endfor %}
    {% endblock %}
  </body>

Я хочу, чтобы на моей веб-странице отображались нужные данные, не исчезая при обновлении моей страницы. Мне действительно любопытно узнать, что я сделал не так.

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Согласно официальной документации, предложенной @Fian, вам нужно открывать соединение с базой данных по требованию и закрывать их, когда контекст умирает.

Обновлен код для app.py:

import os
import sqlite3
from flask import Flask, render_template, g

app = Flask(__name__)
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
DATABASE = os.path.join(BASE_DIR, "movies.db")

def get_db():
    db = getattr(g, '_database', None)
    if db is None:
        db = g._database = sqlite3.connect(DATABASE)
    return db

@app.teardown_appcontext
def close_connection(exception):
    db = getattr(g, '_dattabase', None)
    if db is not None:
        db.close()

@app.route('/')
def index():
    cur = get_db().cursor()
    cur.execute('SELECT * FROM data')
    rows = cur.fetchall()
    return render_template('index.html', rows = rows)

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

index.html

<html>
    <head>
        <title>SQLite in Flask</title>
    </head>
    <body>
        <h1>Movies</h1>
        {% if rows %}
            <ul>                
            {% for row in rows %}
                <li>{{ row[0] }}</li>
            {% endfor %}
            </ul>
        {% endif %}
    </body>
</html>

Выход:

output of flask sqlite select query

Справка:

0 голосов
/ 13 января 2019

Попробуйте переместить весь код, связанный с подключением и выполнением запроса, в функцию обработчика запросов (home()). Кроме того, официальная документация может дать вам подсказку о правильной реализации.

...