miguelgrinberg / turbo-flask

Integration of Hotwire's Turbo library with Flask.
MIT License
301 stars 35 forks source link

return render_template("foo.html") not working after initializing turbo in python #38

Closed dnxjcui closed 1 year ago

dnxjcui commented 1 year ago

Removing the turbo = Turbo(app) makes the code work again.

Here's the full code:

from flask import Flask, render_template
from turbo_flask import Turbo

from cs50 import SQL
from flask import Flask, flash, redirect, render_template, request, session
from flask_session import Session
from werkzeug.security import check_password_hash, generate_password_hash
from helpers import apology, login_required

app = Flask(__name__)
turbo = Turbo(app)

# Ensure templates are auto-reloaded
app.config["TEMPLATES_AUTO_RELOAD"] = True

# Configure session to use filesystem (instead of signed cookies)
app.config["SESSION_PERMANENT"] = False
app.config["SESSION_TYPE"] = "filesystem"
Session(app)

# Configure CS50 Library to use SQLite database
db = SQL("sqlite:///beSober.db")

@app.route('/')
@login_required
def index():
    return render_template('index.html')

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

    # makes sure the account is submitted through post
    if request.method == "POST":

        # ensures that the username field is filled out
        if not request.form.get("username"):
            return apology("must provide username")

        # ensures that the password field is filled out
        elif not request.form.get("password"):
            return apology("must provide password")

        # ensures that the confirmation field is filled out and matches the value of the password field
        elif not request.form.get("confirmation"):
            return apology("must provide password confirmation")\

        elif request.form.get("password") != request.form.get("confirmation"):
            return apology("passwords must match")

        # ensures that the username does not previously exist in the database
        names = db.execute("SELECT username FROM users")
        for name in names:
            if request.form.get("username").lower() in name.values():
                return apology("username already exists")

        db.execute("INSERT INTO users (username, hash) VALUES (?, ?)", request.form.get("username").lower(),
                   generate_password_hash(request.form.get("password"), method="pbkdf2:sha256", salt_length=8))

    else:
        return render_template("register.html")

    flash("Account successfully registered.")
    return render_template("login.html")

@app.after_request
def after_request(response):
    """Ensure responses aren't cached"""
    response.headers["Cache-Control"] = "no-cache, no-store, must-revalidate"
    response.headers["Expires"] = 0
    response.headers["Pragma"] = "no-cache"
    return response

@app.route("/login", methods=["GET", "POST"])
def login():
    """Log user in"""

    # Forget any user_id
    session.clear()

    # User reached route via POST (as by submitting a form via POST)
    if request.method == "POST":

        # Ensure username was submitted
        if not request.form.get("username"):
            return apology("must provide username", 403)

        # Ensure password was submitted
        elif not request.form.get("password"):
            return apology("must provide password", 403)

        # Query database for username
        rows = db.execute("SELECT * FROM users WHERE username = ?", request.form.get("username"))

        # Ensure username exists and password is correct
        if len(rows) != 1 or not check_password_hash(rows[0]["hash"], request.form.get("password")):
            return apology("invalid username and/or password", 403)

        # Remember which user has logged in
        session["user_id"] = rows[0]["id"]

        # Redirect user to home page
        return redirect("/")

    # User reached route via GET (as by clicking a link or via redirect)
    else:
        return render_template("login.html")

@app.route("/logout")
def logout():
    """Log user out"""

    # Forget any user_id
    session.clear()

    # Redirect user to login form
    return redirect("/")
miguelgrinberg commented 1 year ago

This is not a complete application that I can run, so I do not really know. If I may make a suggestion, this repository has a few examples that use render_template() and do not have any issues with it. Why don't you study these and then adapt one of them to your own needs?

dnxjcui commented 1 year ago

I've uploaded the files to my github as Test-Website, but I'm not sure if I added the folders correctly.

miguelgrinberg commented 1 year ago

@dnxjcui Have you tried the examples? As I said, these are all fully working, and are there to help developers get started with a project.

dnxjcui commented 1 year ago

Yes, I used the load example and have been trying to integrate a few of my own things, but I’ve found that the render_template won’t work within POST methods~On Sep 23, 2022, at 10:25, Miguel Grinberg @.***> wrote: @dnxjcui Have you tried the examples? As I said, these are all fully working, and are there to help developers get started with a project.

—Reply to this email directly, view it on GitHub, or unsubscribe.You are receiving this because you were mentioned.Message ID: @.***>

miguelgrinberg commented 1 year ago

@dnxjcui The "todos" example has POST requests that render templates. Example: https://github.com/miguelgrinberg/turbo-flask/blob/main/examples/todos/app.py#L18-L29

dnxjcui commented 1 year ago

I've tried using the example you've linked to render the template, but it still won't work. For some reason it just stays on the same template, no matter what I do. I still think it has something to do with POST and flask's render_template, but I'll just figure something out. I appreciate the help you've provided and thank you for everything