Можно ли получить конкретные строки из базы данных SQLite с определенным значением, преобразовать ее в JSON и отправить на веб-страницу с помощью Flask? - PullRequest
0 голосов
/ 01 ноября 2018

Я пытаюсь получить определенные строки из документа SQLite с помощью Flask-SQLAlchemy, а затем передать его в JSON, чтобы он мог быть перенесен на страницу. Я наполовину новичок в Flask и Python, но у меня достаточно знаний, чтобы делать то, что мне нужно, я просто не могу понять, как.

Мой текущий код:

@app.route('/posts/<pid>', methods=["GET", "POST"])
def posts(pid):
    if request.method == "POST":
        post = Posts.query.filter_by(id=pid).first()
        comment = request.form.get('comment')
        # poid = request.form.get('postid')
        poid = pid
        print(poid)
        c = Comments(id=len(Comments.query.all())+1, comment=comment, user=current_user.username, postid=poid)
        db.session.add(c)
        db.session.commit()
        return render_template("post.html", title=post.title, body=post.body, user=post.user, id=poid)
    post = Posts.query.filter_by(id=pid).first()
    # c = Comments()
    # print(json.dumps(c, cls=AlchemyEncoder))

    comments = Comments.query.filter_by(id=pid).all()
    jsonToPush = {'comments': []}
    print(comments)
    for comment in comments:
        print(comment.postid)
        if comment.postid == pid:
            print("Found comment")
            jsonToPush['comments'].append({ "id": comment.id, "postid": comment.postid, "comment": comment.comment, "user": comment.user})
            print(jsonToPush)
            return render_template("post.html", title=post.title, body=post.body, user=post.user, id=pid, jtp=jsonToPush)
    return render_template("post.html", title=post.title, body=post.body, user=post.user, id=pid)

Когда я print(comments) печатает [<Comments 1>]

Когда я print(comment.postid) распечатывает 1

Независимо от того, сколько комментариев, оно выводит только 1.

У меня уже есть планы относительно того, как я буду использовать JSON на сайте, мне просто нужна помощь для доставки SQL на сайт. Любая помощь приветствуется. Спасибо!

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Я это исправил.

Мой текущий код теперь такой:

@app.route('/posts/<postid>', methods=["GET", "POST"])
@login_required
def posts(postid):
    post = Posts.query.filter_by(id=postid).first()
    if request.method == "POST":
        comment = request.form.get('comment')
        c = Comments(id=len(Comments.query.all())+1, comment=comment, user=current_user.username, postid=postid)
        db.session.add(c)
        db.session.commit()
        return redirect('/posts/{}'.format(postid))
    # c = Comments()
    # print(json.dumps(c, cls=AlchemyEncoder))

    comments = Comments.query.filter_by(postid=postid).all()
    print(Comments.query.all())
    return render_template("post.html", title=post.title, body=post.body, user=post.user, id=postid, comments = [comment_dict(comment) for comment in comments])

Edit: я основал этот ответ на ответ Attack68 ниже. Слава ему, а не мне :) 1006 *

0 голосов
/ 01 ноября 2018

Обычно id в таблице базы данных - это primary key, что означает unique и not null. Уникальность - это ключ (без каламбура), поскольку при выполнении этой строки comments = Comments.query.filter_by(id=pid).all() вы получите только один комментарий с помощью ограничения первичного ключа.

Обратите внимание, во-вторых, в jijna2 есть фильтр, позволяющий передавать объекты python в jinja2 без форматирования JSON, и его можно преобразовать непосредственно в html, например:

render_template('some.html', arr=[1,2,3], dict={'pigs': 'nice', 'fish': 'unfriendly'})
===============
<div> {{ arr | tojson }} {{ dict | tojson }} </div>

Кстати, обратите внимание, что вы можете поместить эту строку: post = Posts.query.filter_by(id=pid).first() в верхней части функции, чтобы в некоторых случаях ее не вызывали дважды. На самом деле это неправда, его когда-либо будут вызывать только один раз, но, на мой взгляд, он выглядит лучше, если набирать его один раз! :)

Изменить ..

Я предполагаю, что Comments таблица. Допустим, у вас есть модель базы данных, которая выглядит следующим образом (я только догадываюсь):

def Comments(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    post_id = db.Column(db.Integer, db.ForeignKey('posts.id'), nullable=False)
    data = db.Column(db.String)

Затем вы можете создать генератор диктов для Comment класса. Есть много мест, где вы могли бы сделать это, но здесь это явная функция.

def comment_dict(comment):
    return dict(id=comment.id, post_id=comment.post_id, data=comment.data)

Затем вы можете сделать запрос к базе данных, чтобы вернуть итератор комментариев и использовать понимание списка для формирования списка диктов:

comments = Comments.query.all() # or some filtered subset
render_template(comments = [comment_dict(comment) for comment in comments])

В вашем html вы можете получить доступ к комментариям в виде массива JSON объектов JSON с помощью:

{{ comments | tojson }}
...