
Schilder für Trucks
Inhalt
Beschreibung
Signs for Trucks ist ein Onlineshop für vorgestaltete Folien mit eigenen Schriftzeilen, im Englischen oft "truck lettering". Kundinnen und Kunden können außerdem eigene Entwürfe hochladen und direkt auf der Seite anpassen. Neben den Folien, dem Hauptprodukt des Shops, gibt es einfache Schriftfolien ohne Truck-Logo, eine Feuerlöscher-Folie und Folien, die nur die Fahrzeugnummer tragen (oder eine andere Nummer nach Wunsch).
Einstellungen
Der Ordner settings innerhalb von trucks_signs_designs enthält die Konfiguration je Umgebung (bisher Entwicklung, Docker-Test und Produktion). Diese Dateien erweitern base.py, in der die gemeinsame Grundkonfiguration steht (etwa der Pfad zum Template-Verzeichnis). Zusätzlich liegt in diesem Ordner die .env mit den Umgebungsvariablen, die meist sensible Werte enthalten und vor dem Einsatz immer gesetzt werden müssen. Standardmäßig ist die Docker-Test-Umgebung aktiv. Umgestellt wird sie in der Datei __init.py__.
Modelle
Die meisten Modelle tun das, was ihr Name vermuten lässt. Die folgenden Punkte klären den Zweck einiger davon:
- Category: die Kategorie der Folien im Shop. Enthält den Titel der Kategorie und die Grundeigenschaften, die Produkte derselben Kategorie teilen. Truck Logo ist zum Beispiel die Kategorie für alle Folien mit Truck-Logo plus Schriftzeilen (die Folien selbst sind Instanzen des Modells Product). Eine weitere Kategorie ist Fire Extinguisher für alle Folien mit Feuerlöscher-Logo.
- Lettering Item Category: die Kategorie der Beschriftung, zum Beispiel Company Name oder VIM NUMBER. Jede hat eine eigene Preisgestaltung.
- Lettering Item Variations: enthält einen Fremdschlüssel auf Lettering Item Category und den Text, den der Kunde eingegeben hat.
- Product Variation: hat das ursprüngliche Produkt als Fremdschlüssel plus die Schriftzeilen (Instanzen von Lettering Item Variations), die der Kunde ergänzt hat.
- Order: enthält den Warenkorb (hier eine einzelne Folie, da pro Vorgang nur ein Produkt gekauft werden kann) sowie Kontakt- und Versandangaben.
- Payment: enthält die Zahlungsdaten, etwa den Zeitpunkt des Kaufs und die Kunden-ID bei Stripe.
Für die Zahlungen wird Stripe als Zahlungsanbieter genutzt.
Kurz zu den Views
Die meisten Views sind klassenbasiert und kommen aus rest_framework.generics. Sie geben der Backend-API die üblichen CRUD-Operationen und erben entsprechend von ListAPIView, CreateAPIView, RetrieveAPIView und so weiter.
Einige Views mussten angepasst werden, etwa für das Anlegen von Bestellung und Zahlung: hier sind beide Funktionen in einem View umgesetzt, der deshalb von GenericAPIView erbt. Ein weiteres Beispiel ist der View UploadCustomerImage, der die vom Kunden hochgeladene Vorlage nimmt und daraus ein neues Produkt erzeugt.
Installation
-
Repository klonen:
git clone <INSERT URL> -
Virtuelle Umgebung anlegen und die Datenbank aufsetzen. Siehe Anleitung für virtuelle Umgebungen und Anleitung für das Datenbank-Setup.
-
Umgebungsvariablen setzen.
-
Kopiere den Inhalt der Beispiel-env-Datei aus dem Ordner truck_signs_designs in eine
.env:cd truck_signs_designs/settingscp simple_env_config.env .env -
Die neue
.envsollte alle Variablen enthalten, die die Django-App in allen Umgebungen braucht. Für die Entwicklungsumgebung genügen aber diese:SECRET_KEY=<secret_key>DB_NAME=<db_name>DB_USER=<db_user>DB_PASSWORD=<dev_db_password>DB_HOST=<localhost>DB_PORT=<5432>STRIPE_PUBLISHABLE_KEY=<stripe_pub_key>STRIPE_SECRET_KEY=<stripe_secret_key>EMAIL_HOST_USER=<your.email@gmail.com>EMAIL_HOST_PASSWORD=<your_password># creating a superuserDJANGO_SUPERUSER_USERNAME=adminDJANGO_SUPERUSER_EMAIL=admin@example.comDJANGO_SUPERUSER_PASSWORD=adminpassword -
Für die Datenbank sind das die Standardwerte:
DB_NAME=trucksigns_dbDB_USER=trucksigns_userDB_PASSWORD=supertrucksignsuser!DB_HOST=localhostDB_PORT=5432 -
SECRET_KEY ist der Django-Secret-Key. Wie du einen neuen erzeugst, steht hier: Stackoverflow
-
HINWEIS: für die Übung nicht nötig
STRIPE_PUBLISHABLE_KEY und STRIPE_SECRET_KEY bekommst du über ein Entwicklerkonto bei Stripe.- So kommst du an die Keys:
- Melde dich in deinem Stripe-Entwicklerkonto an (stripe.com) oder erstelle ein neues (stripe.com > Sign Up). Danach landest du im Dashboard.
- Geh auf Developer > API Keys und kopiere Publishable Key und Secret Key.
- So kommst du an die Keys:
-
EMAIL_HOST_USER und EMAIL_HOST_PASSWORD sind die Zugangsdaten, mit denen die Seite bei einem Kauf E-Mails verschickt. Das ist derzeit abgeschaltet; der Code dafür steht als Kommentar in
views.pyim View zum Anlegen der Bestellung. Es funktioniert also jede gültige Kombination aus Adresse und Passwort.
-
-
Migrationen und dann die App ausführen:
python manage.py migratepython manage.py runserver -
Fertig =) !!! Die App sollte unter localhost:8000 laufen.
-
(Optional) Einen Superuser anlegen:
python manage.py createsuperuser
Benutzung
-
Ein Dockerfile auf oberster Ebene anlegen
-
Docker-Image bauen
docker build -t <image-name>:<tag-name> .-t: steht für "tag". Benennt das Image im Format<image-name>:<tag-name>..: das aktuelle Verzeichnis, in dem Dockerfile und Build-Kontext liegen.
-
Netzwerk anlegen
docker network create <network-name><network-name>: der Name des neuen Netzwerks. Er muss in der Docker-Umgebung eindeutig sein.- Datenbank und Container können in diesem Netzwerk miteinander sprechen.
-
Postgres-Container starten
docker run --name <docker-name> \--network <networkname> \-e POSTGRES_PASSWORD=<postgres-password> \-e POSTGRES_USER=<postgres-user> \-e POSTGRES_DB=<postgres-db-name> \-v <postgres-volume>:/var/lib/postgresql/data \ #store the postgres data in a volume-d postgres<network-name>: das Netzwerk, das du vorher angelegt hast.- Postgres-Daten: die Zugangsdaten, die du vorher festgelegt hast.
-
Anwendungs-Container starten
docker run --name <container-name> \--network <network-name> \-p 8020:8000 \-v <media-volume>:/app/media \-v <static-volume>:/app/static \--restart on-failure \<image-name>:<image-tag><network-name>: dasselbe Netzwerk wie beim Postgres-Container.- Dieser Container hört auf Port 8020.
--restart on-failure: startet den Container nach einem Fehler automatisch neu.<image-name>:<image-tag>: der Name deines Images aus dem Build.
HINWEIS: Um Truck-Folien mit Truck-Logo anzulegen, erstelle zuerst die Kategorie Truck Sign und dann das Produkt (Name beliebig). Nur so holt das Frontend die Truck-Folien für das Produktraster, denn es fragt ausschließlich Produkte der Kategorie Truck Sign ab.
Screenshots des Django-Admin-Panels
Mobile Ansicht

Desktop-Ansicht



Nützliche Links
PostgreSQL-Datenbank
- Datenbank aufsetzen: Digital Ocean, Django-Deployment auf einem VPS
Docker
- Offizielle Docker-Dokumentation
- Django, PostgreSQL, gunicorn und nginx dockerisieren:
Django und DRF
- Offizielle Django-Dokumentation
- Neuen Secret-Key erzeugen: Stackoverflow
- Django-Admin anpassen:
- Kleine Anpassungen (Suche, Spalten, ...): Link
- Templates und CSS anpassen: Artikel auf Medium
- Offizielle Dokumentation des Django REST Framework
- Mehr zu verschachtelten Serializern: Stackoverflow
- Mehr zu Generic Views: testdriven.io
Verschiedenes
- Virtuelle Umgebung mit virtualenv und virtualenvwrapper: Link
- CORS konfigurieren
- Django mit Cloudinary einrichten
Repository: https://github.com/PascalNehlsen/truck_signs_api