为什么在Windows上能工作,而在Mac上却不能?

前端开发 2026-07-10

我在用Flask搭建一个网站,在家用我的个人iMac(运行macOS 26)和学校的Windows PC(运行Windows 11)一起开发,把所有代码托管在GitHub上。我在Windows PC上运行 app.py,页面加载得完全正常,没有问题。然而回家后,把代码从GitHub拉取到我的Mac上并运行时,浏览器却显示404错误。(Flask在运行,但找不到任何页面。)

供参考,下面是我的 app.pyroutes.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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章