Zum Hauptinhalt springen

Truck Signs

Schilder für Trucks

Python 3.8.10Django 2.2.8DRF 3.12.4

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

  1. Repository klonen:

    git clone <INSERT URL>
  2. Virtuelle Umgebung anlegen und die Datenbank aufsetzen. Siehe Anleitung für virtuelle Umgebungen und Anleitung für das Datenbank-Setup.

  3. Umgebungsvariablen setzen.

    1. Kopiere den Inhalt der Beispiel-env-Datei aus dem Ordner truck_signs_designs in eine .env:

      cd truck_signs_designs/settings
      cp simple_env_config.env .env
    2. Die neue .env sollte 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 superuser
      DJANGO_SUPERUSER_USERNAME=admin
      DJANGO_SUPERUSER_EMAIL=admin@example.com
      DJANGO_SUPERUSER_PASSWORD=adminpassword
    3. Für die Datenbank sind das die Standardwerte:

      DB_NAME=trucksigns_db
      DB_USER=trucksigns_user
      DB_PASSWORD=supertrucksignsuser!
      DB_HOST=localhost
      DB_PORT=5432
    4. SECRET_KEY ist der Django-Secret-Key. Wie du einen neuen erzeugst, steht hier: Stackoverflow

    5. 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:
        1. Melde dich in deinem Stripe-Entwicklerkonto an (stripe.com) oder erstelle ein neues (stripe.com > Sign Up). Danach landest du im Dashboard.
        2. Geh auf Developer > API Keys und kopiere Publishable Key und Secret Key.
    6. 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.py im View zum Anlegen der Bestellung. Es funktioniert also jede gültige Kombination aus Adresse und Passwort.

  4. Migrationen und dann die App ausführen:

    python manage.py migrate
    python manage.py runserver
  5. Fertig =) !!! Die App sollte unter localhost:8000 laufen.

  6. (Optional) Einen Superuser anlegen:

    python manage.py createsuperuser

Benutzung

  1. Ein Dockerfile auf oberster Ebene anlegen

  2. 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.
  3. 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.
  4. 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.
  5. 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

alt text alt text alt text


Desktop-Ansicht

alt text


alt text


alt text

PostgreSQL-Datenbank

Docker

Django und DRF

Verschiedenes


Repository: https://github.com/PascalNehlsen/truck_signs_api