недавно начал изучение программирования, использую python + flask + sqlalchemy + mysql.
читаю такие источники:
Мега-Учебник Flask - https://habrahabr.ru/post/193242/
How to build CRUD app with Python, Flask, SQLAlchemy and MySQL - https://techarena51.com/index.php/flask-sqlalchemy-tutorial/
но все равно есть вопросы принципиального характера.
на основе источников и поиска в интернете собрал небольшой проект:
итак.
есть config.py
SQLALCHEMY_TRACK_MODIFICATIONS = False
SQLALCHEMY_DATABASE_URI = 'mysql://root:12345@localhost/mydb'
есть __init__.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config.from_object('config')
app.secret_key = 'some_secret'
db = SQLAlchemy(app)
from app import views, models
описание таблиц Status и Log в файле models.py
from app import db class Status(db.Model): #__tablename__ = 'Status' id = db.Column(db.Integer, primary_key = True) status = db.Column(db.String(64), index = True, unique = True) logs = db.relationship('Log', backref = 'state', lazy = 'dynamic') def __init__(self, status): self.status = status def get_id(self): return str(self.id) def getStatus(self): return STATUS.STATUS[self.status] def __repr__(self): return '<Status %r>' % (self.status) class Log(db.Model): #__tablename__ = 'Log' id = db.Column(db.Integer, primary_key=True) timestamp = db.Column(db.DateTime) log_data = db.Column(db.Float) status_id = db.Column(db.Integer, db.ForeignKey('status.id')) def __init__(self, timestamp, curl_et, status_id): self.timestamp = timestamp self.log_data = log_data self.status_id = status_id def __repr__(self): return '<Log %r>' % (self.log_data)
с помощью SQLAlchemy-migrate создается пустая база mydb.
далее вручную заполнил таблицу Status:
id - status
1 - status1
2 - status2
3 - status3
и хочу вывести содержимое этой таблицы на вебстраницу с помощью Flask
views.py:
from flask import render_template, request,flash, redirect, url_for
from app import app, db
from app.models import Status, Log
@app.route('/')
@app.route('/index')
def index():
#return "Hello, World!"
stat = Status.query.all()
#stat = models.Status.query.all()
return render_template('index.html', stat=stat)
index.html:
<html>
<head>
<title>minimon</title>
</head>
<body>
<h1>stat.id - {{stat}}</h1>
</body>
</html>
в браузере получаю страницу со строкой
stat.id - [<Status u'status1'>, <Status u'status2'>, <Status u'status3'>]
насколько я понял, этот вывод обеспечивается функцией __repr__ в описании класса Status в models.py
а мне нужно вывести таблицу как есть:
id - status
1 - status1
2 - status2
3 - status3
и что для этого сделать, я пока не знаю.
похоже нужно добавить другие специальные функции в этот класс? но какие и КАК их вызывать?
переключаюсь в python cli дл экспериментов:
(venv) [user@host]$ python Python 2.7.11 (default, Jun 15 2016, 07:56:38) [GCC 4.4.7 20120313 (Red Hat 4.4.7-17)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> from app import db, models >>> s = models.Status.query.all() >>> print s [<Status u'status1'>, <Status u'status2'>, <Status u'status3'>] >>> пробую вызвать get_id метод: >>> print s.get_id Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'list' object has no attribute 'get_id' >>> print s.get_id() Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'list' object has no attribute 'get_id' >>> print s.id Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'list' object has no attribute 'id' >>> >>> print s.status Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'list' object has no attribute 'status'
чтото не правильно.. но как его вызывать правильно?
тут хотябы понять, как получать в переменную любой элемент таблицы - то есть как обращаться к любому элементу.
и главное - как потом отрисовывать твсю аблицу на web странице?