Получение несвязанной локальной ошибки при доступе к базе данных во Flask с помощью Python3 - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть простое веб-приложение с фляжкой, которое записывает время локального пользователя и строки агента пользователя и отправляет его через ajax в базу данных (userdatabase.db), которую я создаю отдельно на интерпретаторе python (с Python3).

Вот мои шаблоны / home.html:

<html>
  <head>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

  <script type=text/javascript>
   $(document).ready(function () {
     console.log('Date Being Posted'); // this will fire at first
       $.ajax({

            url:"{{url_for('home')}}",
            clock: new Date(),
            type = 'POST',
            success: function(response){
                console.log(response);
            },
            error: function(error){
                console.log(error);
            }
       });
    });

  </script>

  </head>
  <body>    
    <p>Recording time!</p>

    {% for user in users %}
    <p>{{user.clock}}</p>
    {% endfor %}
  </body>
</html>

А вот мой основной файл:

import os
from flask import Flask
from flask import render_template
from flask import request
from sqlalchemy import exc
from flask_sqlalchemy import SQLAlchemy


project_dir = os.path.dirname(os.path.abspath(__file__))

#path to the database
database_file = "sqlite:///{}".format(os.path.join(project_dir, "userdatabase.db"))

app = Flask(__name__)

#indicate to the web application where the database will be stored
app.config["SQLALCHEMY_DATABASE_URI"] = database_file

#initialize a connection to the database; use the db variable to interact with the databse
db = SQLAlchemy(app)

##define a model for the user

class User(db.Model):

    user_id = db.Column(db.Integer, primary_key=True)
    user_agent = db.Column(db.String(1024), index=True)
    clock = db.Column(db.String(1024), index=True)

    def __repr__(self):
        return "<User-Agent: {}, Clock: {}".format(self.user_agent, self.clock)

@app.route("/home", methods=["GET", "POST"])
def home():

    if request.method == "POST":

        user_agent_received = request.headers.get('User-Agent')
        clock_received = request.json['clock']
        user = User(user_agent=user-agent_received, clock=clock_received)
        print (user)
        try:
            db.session.add(user)
            db.session.commit()
        except exc.IntegrityError as e:
            db.session().rollback()

        users = User.query.all()

    return render_template("home.html", users=users)



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

Команды, которые я использовал для создания базы данных:

from main import db

db.create_all()

Но когда я запускаю файл main.py, я получаю следующую ошибку:

UnboundLocalError: local variable 'users' referenced before assignment

Я не вижу никаких ошибок внутри консоли, что, я полагаю, имело бы место, если бы были некоторые ошибки при отправке данных из AJAX.Я новичок в flask и создал этот код, в основном, следуя онлайн-учебникам.Может кто-нибудь помочь, что может быть не так здесь?Спасибо!

1 Ответ

0 голосов
/ 17 декабря 2018

Вам необходимо переместить код

users = User.query.all()

за пределы (до) блока

if request.method == "POST":

Это потому, что если request.method == "GET", то переменная users не определена

Обратите внимание, что код

return render_template("home.html", users=users)

запускается только в том случае, если метод запроса НЕ POST в текущем кодеошибка, из-за которой ваш взгляд не возвращал ответ, когда метод получен)

...