为什么在Windows上能工作,而在Mac上却不能?
我在用Flask搭建一个网站,在家用我的个人iMac(运行macOS 26)和学校的Windows PC(运行Windows 11)一起开发,把所有代码托管在GitHub上。我在Windows PC上运行 app.py,页面加载得完全正常,没有问题。然而回家后,把代码从GitHub拉取到我的Mac上并运行时,浏览器却显示404错误。(Flask在运行,但找不到任何页面。)
供参考,下面是我的 app.py 和 routes.py,以防有帮助。
app.py:
from flask import Flask
import routes
app = Flask(__name__)
app.secret_key = 'your-secret-key-here'
routes.register_routes(app)
if __name__ == '__main__':
app.run(debug=True)
routes.py:
from flask import render_template, request, redirect, url_for, flash, session
from werkzeug.security import generate_password_hash, check_password_hash
from dbconnector import database
def register_routes(app):
@app.route("/")
def home():
return render_template("home.html")
@app.route("/register", methods=['GET', 'POST'])
def register():
if request.method == 'POST':
name = request.form['name']
email = request.form['email']
phone = request.form['phone']
address = request.form['address']
password = request.form['password']
confirm_password = request.form['confirm-password']
terms = request.form.get('terms')
if password != confirm_password:
flash('Passwords do not match!', 'error')
return render_template('register.html')
if not terms:
flash('You must agree to the terms and conditions!', 'error')
return render_template('register.html')
hashed_password = generate_password_hash(password)
db = database()
try:
existing_user = db.queryDB("SELECT \"Client Email\" FROM Accounts WHERE \"Client Email\" = ?", [email])
if existing_user:
flash('Email already registered!', 'error')
return render_template('register.html')
db.updateDB(
"INSERT INTO Accounts (\"Client Name\", \"Client Email\", \"Client Phone\", \"Client Address\", \"Password\") VALUES (?, ?, ?, ?, ?)",
[name, email, phone, address, hashed_password]
)
flash('Registration successful! Please login.', 'success')
return redirect(url_for('login'))
except Exception as e:
flash(f'Registration failed: {str(e)}', 'error')
return render_template('register.html')
return render_template("register.html")
@app.route("/pricing")
def pricing():
return render_template("pricing.html")
@app.route("/Day-purchase")
def day_purchase():
return render_template("Day-purchase.html")
@app.route("/Week-purchase")
def week_purchase():
return render_template("Week-Purchase.html")
@app.route("/Core-purchase")
def core_purchase():
return render_template("Core-Purchase.html")
@app.route("/Plus-purchase")
def plus_purchase():
return render_template("Plus-Purchase.html")
@app.route("/Premium-purchase")
def premium_purchase():
return render_template("Premium-Purchase.html")
@app.route("/checkout", methods=['POST'])
def checkout():
pass_type = request.form.get('pass_type')
pass_name = request.form.get('pass_name')
pass_price = request.form.get('pass_price')
full_name = request.form.get('name')
email = request.form.get('email')
phone = request.form.get('phone')
return render_template("checkout.html",
pass_type=pass_type,
pass_name=pass_name,
pass_price=pass_price,
full_name=full_name,
email=email,
phone=phone)
@app.route("/checkout/process", methods=['POST'])
def process_checkout():
try:
pass_type = request.form['pass_type']
pass_name = request.form['pass_name']
pass_price = request.form['pass_price']
full_name = request.form['fullName']
email = request.form['email']
phone = request.form['phone']
billing_address = request.form['billingAddress']
card_name = request.form['cardName']
card_number = request.form['cardNumber']
expiry_date = request.form['expiryDate']
cvv = request.form['cvv']
terms = request.form.get('terms')
marketing = request.form.get('marketing')
if not terms:
flash('You must agree to the terms and conditions!', 'error')
return render_template("checkout.html",
pass_type=pass_type,
pass_name=pass_name,
pass_price=pass_price)
flash(f'Thank you {full_name}! Your {pass_name} purchase of £{pass_price} was successful. Check your email at {email} for confirmation details.', 'success')
return redirect(url_for('home'))
except Exception as e:
flash(f'Purchase failed: {str(e)}', 'error')
return render_template("checkout.html",
pass_type=request.form.get('pass_type', ''),
pass_name=request.form.get('pass_name', ''),
pass_price=request.form.get('pass_price', ''))
@app.route("/login", methods=['GET', 'POST'])
def login():
if request.method == 'POST':
email = request.form['email']
password = request.form['password']
db = database()
try:
user = db.queryDB("SELECT \"Client Name\", \"Client Email\", \"Password\" FROM Accounts WHERE \"Client Email\" = ?", [email])
if user:
stored_password = user[0][2]
user_name = user[0][0]
if check_password_hash(stored_password, password):
session['user_logged_in'] = True
session['user_name'] = user_name
session['user_email'] = email
flash('Login successful!', 'success')
return redirect(url_for('home'))
else:
flash('Invalid email or password!', 'error')
else:
flash('Invalid email or password!', 'error')
except Exception as e:
flash(f'Login failed: {str(e)}', 'error')
return render_template("login.html")
@app.route("/logout")
def logout():
session.clear()
flash('You have been logged out!', 'success')
return redirect(url_for('home'))
@app.route("/settings")
def settings():
if not session.get('user_logged_in'):
flash('Please login to access settings!', 'error')
return redirect(url_for('login'))
return render_template("settings.html")
@app.route("/settings/update", methods=['POST'])
def update_account():
if not session.get('user_logged_in'):
return redirect(url_for('login'))
name = request.form['name']
email = request.form['email']
phone = request.form.get('phone', '')
address = request.form.get('address', '')
db = database()
try:
db.updateDB(
"UPDATE Accounts SET \"Client Name\" = ?, \"Client Email\" = ?, \"Client Phone\" = ?, \"Client Address\" = ? WHERE \"Client Email\" = ?",
[name, email, phone, address, session['user_email']]
)
session['user_name'] = name
session['user_email'] = email
flash('Account details updated successfully!', 'success')
except Exception as e:
flash(f'Update failed: {str(e)}', 'error')
return redirect(url_for('settings'))
@app.route("/settings/change-password", methods=['POST'])
def change_password():
if not session.get('user_logged_in'):
return redirect(url_for('login'))
current_password = request.form['current_password']
new_password = request.form['new_password']
confirm_new_password = request.form['confirm_new_password']
if new_password != confirm_new_password:
flash('New passwords do not match!', 'error')
return redirect(url_for('settings'))
db = database()
try:
user = db.queryDB("SELECT \"Password\" FROM Accounts WHERE \"Client Email\" = ?", [session['user_email']])
if user and check_password_hash(user[0][0], current_password):
hashed_new_password = generate_password_hash(new_password)
db.updateDB(
"UPDATE Accounts SET \"Password\" = ? WHERE \"Client Email\" = ?",
[hashed_new_password, session['user_email']]
)
flash('Password changed successfully!', 'success')
else:
flash('Current password is incorrect!', 'error')
except Exception as e:
flash(f'Password change failed: {str(e)}', 'error')
return redirect(url_for('settings'))
@app.route("/settings/delete-account", methods=['POST'])
def delete_account():
if not session.get('user_logged_in'):
return redirect(url_for('login'))
password = request.form['delete_password']
db = database()
try:
user = db.queryDB("SELECT \"Password\" FROM Accounts WHERE \"Client Email\" = ?", [session['user_email']])
if user and check_password_hash(user[0][0], password):
db.updateDB("DELETE FROM Accounts WHERE \"Client Email\" = ?", [session['user_email']])
session.clear()
flash('Your account has been deleted successfully!', 'success')
return redirect(url_for('home'))
else:
flash('Password is incorrect!', 'error')
except Exception as e:
flash(f'Account deletion failed: {str(e)}', 'error')
return redirect(url_for('settings'))
@app.route("/contact", methods=['GET', 'POST'])
def contact():
if request.method == 'POST':
name = request.form['name']
email = request.form['email']
phone = request.form.get('phone', '')
subject = request.form['subject']
message = request.form['message']
flash(f'Thank you {name}! Your message has been received. We\'ll get back to you soon!', 'success')
return redirect(url_for('contact'))
return render_template("contact.html")
@app.route("/accessibility")
def accessibility():
return render_template("accessability.html")
@app.route("/terms-and-conditions")
def terms_and_conditions():
return render_template("terms-and-conditions.html")
@app.route("/privacy")
def privacy():
return render_template("privacy.html")
@app.route("/cookies")
def cookies():
return render_template("Cookie Policy.html")
我又尝试了第三台机器(运行Linux Mint),结果也同样正常。我分不清是macOS的问题,还是我的Mac本身的问题,还是代码的问题。
解决方案
在某些Macs上,端口5000可能被用于其他用途。尝试 app.run(port=8000),看看浏览器在该端口是否能找到你的页面。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。