Spaces:
Runtime error
Runtime error
| from flask import Blueprint | |
| from flask import flash | |
| from flask import g | |
| from flask import redirect | |
| from flask import render_template | |
| from flask import request | |
| from flask import url_for | |
| from werkzeug.exceptions import abort | |
| from .auth import login_required | |
| from .db import get_db | |
| bp = Blueprint("blog", __name__) | |
| def index(): | |
| """Show all the posts, most recent first.""" | |
| db = get_db() | |
| posts = db.execute( | |
| "SELECT p.id, title, body, created, author_id, username" | |
| " FROM post p JOIN user u ON p.author_id = u.id" | |
| " ORDER BY created DESC" | |
| ).fetchall() | |
| return render_template("blog/index.html", posts=posts) | |
| def get_post(id, check_author=True): | |
| """Get a post and its author by id. | |
| Checks that the id exists and optionally that the current user is | |
| the author. | |
| :param id: id of post to get | |
| :param check_author: require the current user to be the author | |
| :return: the post with author information | |
| :raise 404: if a post with the given id doesn't exist | |
| :raise 403: if the current user isn't the author | |
| """ | |
| post = ( | |
| get_db() | |
| .execute( | |
| "SELECT p.id, title, body, created, author_id, username" | |
| " FROM post p JOIN user u ON p.author_id = u.id" | |
| " WHERE p.id = ?", | |
| (id,), | |
| ) | |
| .fetchone() | |
| ) | |
| if post is None: | |
| abort(404, f"Post id {id} doesn't exist.") | |
| if check_author and post["author_id"] != g.user["id"]: | |
| abort(403) | |
| return post | |
| def create(): | |
| """Create a new post for the current user.""" | |
| if request.method == "POST": | |
| title = request.form["title"] | |
| body = request.form["body"] | |
| error = None | |
| if not title: | |
| error = "Title is required." | |
| if error is not None: | |
| flash(error) | |
| else: | |
| db = get_db() | |
| db.execute( | |
| "INSERT INTO post (title, body, author_id) VALUES (?, ?, ?)", | |
| (title, body, g.user["id"]), | |
| ) | |
| db.commit() | |
| return redirect(url_for("blog.index")) | |
| return render_template("blog/create.html") | |
| def update(id): | |
| """Update a post if the current user is the author.""" | |
| post = get_post(id) | |
| if request.method == "POST": | |
| title = request.form["title"] | |
| body = request.form["body"] | |
| error = None | |
| if not title: | |
| error = "Title is required." | |
| if error is not None: | |
| flash(error) | |
| else: | |
| db = get_db() | |
| db.execute( | |
| "UPDATE post SET title = ?, body = ? WHERE id = ?", (title, body, id) | |
| ) | |
| db.commit() | |
| return redirect(url_for("blog.index")) | |
| return render_template("blog/update.html", post=post) | |
| def delete(id): | |
| """Delete a post. | |
| Ensures that the post exists and that the logged in user is the | |
| author of the post. | |
| """ | |
| get_post(id) | |
| db = get_db() | |
| db.execute("DELETE FROM post WHERE id = ?", (id,)) | |
| db.commit() | |
| return redirect(url_for("blog.index")) | |