Flask启动后访问出现404 Not Found问题求助(CS50期末项目)
Flask 404 Not Found 问题排查与解决
问题描述
我正在制作CS50的期末项目,使用云端VS Code环境,执行flask run命令后获得访问URL,但浏览器返回404 Not Found。代码与之前CS50任务的代码非常相似且当时能正常运行,已确认所有HTML文件路径正确,相关代码如下:
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 import datetime # Configure application app = Flask(__name__) # 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:///meals.db") @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"): flash("You must provide a username!") return render_template("login.html") # Ensure password was submitted elif not request.form.get("password"): flash("You must provide a password!") return render_template("login.html") # 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")): flash("invalid username and/or password") return render_template("login.html") # Remember which user has logged in session["user_id"] = rows[0]["id"] # Redirect user to home page return redirect("/homepage") # 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 render_template("login.html") @app.route("/register", methods=["GET", "POST"]) def register(): """Register user""" # If method is POST if request.method == "POST": name = request.form.get("username") password = request.form.get("password") confirmation = request.form.get("confirmation") # Personal touch - Require users’ passwords to have some number of letters, numbers, and/or symbols password_symbols = ['!', '#', '$', '%', '.', '_', '&'] # Check if any fields are empty if not name: flash("You must provide a username!") return render_template("register.html") elif not password: flash("You must provide a password!") return render_template("register.html") elif not confirmation: flash("You must confirm tha password!") return render_template("register.html") # Require users’ passwords to be 8 char long and to have some number of letters, numbers, and/or symbols if len(password) < 8: flash("Password must be at least 8 characters long!") return render_template("register.html") if not any(char.isdigit() for char in password): flash("Password must have at least one number!") return render_template("register.html") if not any(char.isupper() for char in password): flash("Password must have at least one uppercase!") return render_template("register.html") if not any(char in password_symbols for char in password): flash("must contain at least one symbol of following: ! # $ % . _ &") return render_template("register.html") # Check if password and confirmation match if not password == confirmation: flash("Password doesn't match", 400) return render_template("register.html") # Check if username is taken rows = db.execute("SELECT username FROM users WHERE username = ?", name) if len(rows) > 0: flash("Username is taken", 400) return render_template("register.html") # Add the new user into the database hash = generate_password_hash(password) db.execute("INSERT INTO users (username, hash) VALUES(?,?)", name, hash) # Remember which user has logged in rows = db.execute("SELECT * FROM users WHERE username = ?", request.form.get("username")) session["user_id"] = rows[0]["id"] # Redirect user to home page flash('Registered!') return redirect("/homepage") # If method is GET else: return render_template("register.html") @app.route("/homepage") def homepage(): return render_template("homepage.html")
排查与解决方法
缺少根路由(/):当前代码未定义
@app.route("/")路由,而Flask默认访问的是根路径。直接访问生成的URL时,浏览器请求的是/,但代码中仅配置了/login、/register、/homepage等路由,因此返回404。
解决:添加根路由,可重定向到登录页或直接渲染页面:@app.route("/") def index(): return redirect("/login") # 或 return render_template("login.html")确认访问路径正确性:若未添加根路由,需手动在生成的URL后补充具体路径,例如
https://xxx.cs50.io/login或https://xxx.cs50.io/register,而非直接访问根路径。检查Flask入口文件配置:云端VS Code环境中,Flask默认读取
app.py作为入口文件。若你的主文件名不是app.py,需先设置环境变量:export FLASK_APP=your_filename.py再执行
flask run。
内容的提问来源于stack exchange,提问作者Krisxxx
相关产品推荐
相关产品推荐

