Уведомления

Группа в Telegram: @pythonsu

#1 Июль 19, 2016 15:24:43

d00m
Зарегистрирован: 2016-07-19
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Flask + SQLAlchemy - вывод содержимого mysql таблицы на web страницу

всем привет.
недавно начал изучение программирования, использую 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 странице?

Отредактировано d00m (Июль 19, 2016 16:43:19)

Офлайн

#2 Сен. 20, 2016 04:49:07

marataziat
От: Алматы
Зарегистрирован: 2016-05-24
Сообщения: 104
Репутация: +  -5  -
Профиль   Отправить e-mail  

Flask + SQLAlchemy - вывод содержимого mysql таблицы на web страницу

Это лист информации поэтому не робит . Надо как-то преобразовать лист в переменные



Я настоящий тюленялюб :)

Офлайн

#3 Сен. 20, 2016 09:36:16

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Flask + SQLAlchemy - вывод содержимого mysql таблицы на web страницу

d00m
У вас есть переменная stat в которой находится список элементов. Логично предположить что со списком нужно и работать со как со списком т.е. итерируемым объектом. Вам надо в шаблоне организовать цикл и поэлементно выводить данные для таблицы. Это описывается в любых материалах по шаблонизаторам, в том же материале что вы используете



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#4 Янв. 15, 2017 10:48:32

neitro
Зарегистрирован: 2015-03-13
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Flask + SQLAlchemy - вывод содержимого mysql таблицы на web страницу

1) secret_key можно из __init__ перенести в конфиг обозначатеся так:
SECRET_KEY

2) С чем вы работаете:
stat = Status.query.all()
В данная переменная - это список элементов типа Status, соответственно с пеменной и работаете, как с списком.
Например вам нужна строка с списком всех id элементов через “;”
Пишите следующее

';'.join(x.id for x in stat)
Для имен
';'.join(x.status for x in stat)

Т.е. для получения id элемента вам требуется выбрать элемент, а затем указать атрибут id, например
stat[0].id

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version