En Flask-app till en hostad cPanel-miljö

I den här guiden går vi igenom hur du deployar en enkel Flask-applikation med en MySQL-databas till en server som använder cPanel. Vi antar att appen är en enkel todo-lista, byggd med Flask och Bootstrap, som sparar sina todos i en MySQL-databas.
Steg 1: Förbereda din Flask-app lokalt
Struktur för din Flask-app
En typisk struktur kan se ut så här:
todo_app/
├── app.py # Flask-applikationen
├── requirements.txt # Lista över Python-paket
├── templates/ # HTML-filer
│ └── index.html
├── static/ # CSS/JS/Bilder
│ └── style.css
└── virtualenv/ # Virtual environment (inte deployad)
Flask-app: app.py
from flask import Flask, render_template, request, redirectimport mysql.connectorimport osfrom dotenv import load_dotenvload_dotenv()app = Flask(__name__)# Database connectiondb = mysql.connector.connect( host="localhost", user=os.getenv("DB_USER"), password=os.getenv("DB_PASSWORD"), database=os.getenv("DB_NAME"))@app.route('/')def index(): try: cursor = db.cursor() cursor.execute("SELECT id, task FROM todos") todos = cursor.fetchall() except mysql.connector.Error as err: app.logger.error(f"Error: {err}") todos = [] return render_template('index.html', todos=todos)@app.route('/add', methods=['POST'])def add_todo(): task = request.form['task'] try: cursor = db.cursor() cursor.execute("INSERT INTO todos (task) VALUES (%s)", (task,)) db.commit() except mysql.connector.Error as err: app.logger.error(f"Error: {err}") return redirect('/')@app.route('/delete/<int:todo_id>')def delete_todo(todo_id): try: cursor = db.cursor() cursor.execute("DELETE FROM todos WHERE id = %s", (todo_id,)) db.commit() except mysql.connector.Error as err: app.logger.error(f"Error: {err}") return redirect('/')if __name__ == '__main__': app.run(debug=True)Code language: PHP (php) .env-fil (skapa denna fil och lägg den i projektets rotmapp)
DB_USER=cpanel_userDB_PASSWORD=your_passwordDB_NAME=cpanel_database Steg 2: Förberedelse för deployment
Kravfil: requirements.txt
Skapa en requirements.txt som innehåller alla beroenden.
flask
mysql-connector-python
python-dotenv
Generera filen automatiskt:
pip freeze > requirements.txtCode language: CSS (css) Steg 3: Förbered filer för uppladdning
Filer du bör ladda upp:
- App-filer:
app.pyeller motsvarande startfil för din Flask-app.- Eventuella andra Python-filer som din app använder.
- Mallfiler:
- Innehållet i mappen
templates/.
- Innehållet i mappen
- Statiska filer:
- Innehållet i mappen
static/(CSS, JS, bilder, etc.).
- Innehållet i mappen
- Kravfil:
requirements.txtsom listar alla Python-paket din app behöver.
Filer du inte bör ladda upp:
- Virtual environment-mappen (
env/eller motsvarande). Denna mapp ska inte laddas upp eftersom du kommer att skapa en ny virtuell miljö på servern. - .env-filen. Denna fil innehåller dina känsliga uppgifter och ska inte laddas upp till servern direkt. Du kan istället konfigurera dessa variabler direkt i cPanel-miljön.
Skapa en zip-fil för uppladdning
För att ladda upp alla filer samtidigt kan du zipa ner innehållet i din applikationsmapp (utan env/-mappen och .env-filen).
zip -r flaskapp.zip app.py templates/ static/ requirements.txtCode language: JavaScript (javascript) Steg 4: Ladda upp din app till cPanel
- Logga in på cPanel.
- Navigera till File Manager och ladda upp zip-filen (
flaskapp.zip). - Extrahera innehållet i en lämplig katalog, till exempel
flaskapp/.
Steg 5: Konfigurera Python i cPanel
- Gå till Setup Python App.
- Klicka på Create Application och fyll i följande:
- Python version: Välj en kompatibel version (t.ex. 3.9).
- Application root: Ange sökvägen till din app, t.ex.
flaskapp/. - Application URL: URL där din app blir tillgänglig.
- Application startup file:
app.py. - Application entry point:
app.
- Klicka på Create.
Steg 6: Installera beroenden
När appen är skapad, klicka på terminalikonen för att öppna en virtuell miljö.
Kör följande kommando:
pip install -r requirements.txtCode language: CSS (css) Steg 7: Ställ in MySQL-databasen
- Gå till MySQL Databases i cPanel.
- Skapa en ny databas, användare och lösenord.
- Lägg till användaren till databasen med fullständiga rättigheter.
- Uppdatera dina databasinställningar i cPanel genom att lägga till miljövariablerna från din
.env-fil.- Gå till
Setup Python Appoch klicka på din app. - Lägg till följande miljövariabler:
DB_USER=cpanel_user DB_PASSWORD=your_password DB_NAME=cpanel_database - Gå till
- Skapa tabellen för todos:
CREATE TABLE todos ( id INT AUTO_INCREMENT PRIMARY KEY, task VARCHAR(255) NOT NULL);Code language: PHP (php) Steg 8: Testa din app
- Gå till din applikations-URL i webbläsaren.
- Lägg till några todos och testa funktionerna.
Sammanfattande kod och filstruktur
Flask-app: Komplett app.py
from flask import Flask, render_template, request, redirectimport mysql.connectorimport osfrom dotenv import load_dotenvload_dotenv()app = Flask(__name__)db = mysql.connector.connect( host="localhost", user=os.getenv("DB_USER"), password=os.getenv("DB_PASSWORD"), database=os.getenv("DB_NAME"))@app.route('/')def index(): try: cursor = db.cursor() cursor.execute("SELECT id, task FROM todos") todos = cursor.fetchall() except mysql.connector.Error as err: app.logger.error(f"Error: {err}") todos = [] return render_template('index.html', todos=todos)@app.route('/add', methods=['POST'])def add_todo(): task = request.form['task'] try: cursor = db.cursor() cursor.execute("INSERT INTO todos (task) VALUES (%s)", (task,)) db.commit() except mysql.connector.Error as err: app.logger.error(f"Error: {err}") return redirect('/')@app.route('/delete/<int:todo_id>')def delete_todo(todo_id): try: cursor = db.cursor() cursor.execute("DELETE FROM todos WHERE id = %s", (todo_id,)) db.commit() except mysql.connector.Error as err: app.logger.error(f"Error: {err}") return redirect('/')if __name__ == '__main__': app.run(debug=True)Code language: JavaScript (javascript) HTML-fil: templates/index.html
<!DOCTYPE html><html><head> <title>Todo List</title> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet"></head><body class="container"> <h1>Todo List</h1> <form action="/add" method="post"> <input type="text" name="task" placeholder="New task" required> <button type="submit" class="btn btn-primary">Add</button> </form> <ul class="list-group mt-3"> {% for todo in todos %} <li class="list-group-item d-flex justify-content-between align-items-center"> {{ todo[1] }} <a href="/delete/{{ todo[0] }}" class="btn btn-danger btn-sm">Delete</a> </li> {% endfor %} </ul></body></html>Code language: HTML, XML (xml) Tips och vanliga fallgropar
- Testa lokalt innan du laddar upp.
- Använd Bootstrap för att snabbt skapa ett snyggt UI.
- Håll databasuppgifter säkra genom att använda miljövariabler.
Vanliga fallgropar
- Felaktiga databasuppgifter: Dubbelkolla att användarnamn, lösenord och databasnamn stämmer.
- Saknade beroenden: Kontrollera att alla paket är installerade i cPanel-miljön.
- Fel i
requirements.txt: Kontrollera att filen är korrekt genererad.
Andra säkerhetsåtgärder
- HTTPS: Använd Flask-SSLify eller annan metod för att tvinga HTTPS.
- Säkerhetsuppdateringar: Håll dina Python-paket uppdaterade för att undvika sårbarheter.
- Felhantering: Implementera en central felhanterare för att fånga upp och logga alla oväntade fel.
Sammanfattning
Den här guiden har visat hur du deployar en Flask-app till en cPanel-miljö, inklusive MySQL-integration och ett Bootstrap-baserat användargränssnitt. Genom att följa dessa steg noggrant borde du kunna skapa och distribuera webbapplikationer på en delad hostingmiljö utan problem. Lycka till!

