Table of Contents
Ich habe diese Woche viel über den Arbeitsablauf nachgedacht. Beim Betrachten meiner täglichen Aufgaben wurde mir klar, dass das Einrichten von Django-Projekten mehr Zeit als nötig in Anspruch nahm. Die Installation von Django geht schnell, insbesondere mit Astral-UV, mit dem es in weniger als einer Minute einsatzbereit ist. Aber das ist erst der Anfang. Nach der Installation verbrachte ich Zeit mit denselben mühsamen Schritten: Erstellen von Verzeichnisstrukturen, Einrichten von Vorlagen, Hinzufügen wichtiger Dateien wie urls.py und forms.py und Erstellen von Platzhalter-HTML-Dateien für Seiten wie die Homepage und die Kontaktseite. Diese sich wiederholenden Aufgaben summierten sich, also beschloss ich, den Django-Einrichtungsprozess so weit wie möglich zu automatisieren und mir viel Zeit zu sparen.
Pythons Flexibilität macht es ideal für die Automatisierung. Seine Tools für die Dateiverwaltung, die Verwaltung von Unterprozessen und die Befehlszeilenanalyse waren perfekt für die Erstellung eines Tools, das alle von mir benötigten Einstellungen übernehmen konnte. Ich habe das Tool mit modularen Klassen für jeden Teil des Einrichtungsprozesses strukturiert, sodass es leicht angepasst werden konnte, wenn ich in Zukunft Optimierungen vornehmen wollte. Ich wollte auch, dass das Tool einfach zu verwenden ist, also habe ich es so konzipiert, dass es mit einem einzigen Befehl funktioniert. Ich muss nur python3 main.py <project_name> <optional_app_name> aus dem Verzeichnis der obersten Ebene ausführen, in dem ich Django-Projekte erstellen möchte. Dieser Befehl kümmert sich um alles: Er installiert Django, erstellt eine optionale App, richtet die richtige Verzeichnisstruktur ein und generiert wichtige Dateien mit Platzhalterinhalten.
Dieses Skript funktioniert nur auf Debian-basierten Systemen (Debian, Ubuntu usw.).
Der erste Schritt im Skript besteht in der Überprüfung auf erforderliche Software wie Snapd und UV. Ich habe das Subprozessmodul von Python verwendet, um diese Überprüfungen durchzuführen. So habe ich es für Snapd gehandhabt:
import subprocess def check_snapd_installed(): """Check if 'snapd' is installed by trying to call the snap version command.""" try: subprocess.run(['snap', '--version'], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) print("'snapd' is already installed.") return True except FileNotFoundError: print("'snapd' is not found; it needs to be installed.") return False
Diese Funktion sucht nach Snapd, indem sie Snap –Version aufruft. Wenn der Befehl einen Fehler zurückgibt, teilt mir das Skript mit, dass Snapd fehlt, und fordert mich auf, es zu installieren. Ich habe ähnliche Funktionen für andere Abhängigkeiten verwendet, um sicherzustellen, dass ich das Tool auf jedem System ausführen und trotzdem die erforderliche Software bereit haben kann.
Das Einrichten der Projektverzeichnisstruktur war etwas anspruchsvoller. Ich musste Fälle berücksichtigen, in denen ein Benutzer einen relativen Pfad oder einen bereits vorhandenen Pfad eingeben könnte. Um Verzeichniskonflikte zu vermeiden und die Verwendung von Djangos reservierten Namen wie „static“ oder „media“ zu verhindern, validiert das Skript den Verzeichnisnamen und fordert bei einem Problem zur Eingabe eines neuen Namens auf. Sobald das Verzeichnis validiert und erstellt ist, übernimmt UV die Backend-Einrichtung, einschließlich der Initialisierung der virtuellen Umgebung, dem Hinzufügen von Django und dem Erstellen einer .gitignore-Datei. Hier ist ein Snippet, das die Verzeichniseinrichtung übernimmt:
def prompt_for_directory(): """Prompt user for the directory where the Django project should be installed.""" disallowed_names = {'test', 'django', 'site', 'admin', 'main', 'manage', 'static', 'templates', 'media'} while True: directory = input("Enter the directory where you want to install the Django project: ") directory_name = os.path.basename(os.path.normpath(directory)) if directory_name.lower() in disallowed_names: print(f"The directory name '{directory_name}' is reserved and cannot be used.") else: os.makedirs(directory, exist_ok=True) os.chdir(directory) print(f"Changed directory to {directory}") break
Durch diese Konfiguration wird sichergestellt, dass der gewählte Verzeichnisname nicht mit reservierten Namen in Konflikt gerät, wodurch potenzielle Probleme in der Zukunft vermieden werden.
Ein mühsamer Teil beim Einrichten eines Django-Projekts ist das Konfigurieren von Umgebungsvariablen. Daher habe ich dies automatisiert, indem das Tool automatisch .env- und .env-template-Dateien im Projektstamm generiert. Jede Datei ist bereits mit Standardwerten wie DEBUG=True, Platzhaltern für SECRET_KEY und DATABASE_URL ausgefüllt. Dies spart Zeit und gewährleistet eine konsistente Einrichtung über Projekte hinweg. Hier ist der Codeausschnitt, der diese Dateien erstellt:
env_content = ( "# Environment variables\n" "DEBUG=True\n" "SECRET_KEY=your-secret-key\n" "DATABASE_URL=your-database-url\n" ) with open(".env", 'w') as f: f.write(env_content) print("Created .env in the installation directory.") with open(".env-template", 'w') as f: f.write(env_content) print("Created .env-template in the installation directory.")
Mit diesen Da die Umgebungsvariablen automatisch eingerichtet werden, ist jedes neue Django-Projekt von Anfang an bereit für Umgebungsvariablen, sodass ich diese Konfigurationen nicht manuell hinzufügen muss.
Das Tool erstellt außerdem automatisch wichtige Projektdateien wie base.html und Verzeichnisse für Vorlagen und statische Assets. Das Skript richtet Unterverzeichnisse für CSS, JavaScript und Bilder im statischen Ordner sowie einen Ordner für Partials im Hauptvorlagenverzeichnis ein. Für das Vorlagenverzeichnis der App erstellt es grundlegende HTML-Dateien wie index.html, about.html und contact.html mit Platzhalterinhalten. So sieht dieser Abschnitt im Code aus:
html_files = { "index.html": " ", "about.html": " ", "contact.html": " ", } for filename, content in html_files.items(): with open(f"{app_template_path}/{filename}", 'w') as f: f.write(content) print(f"Created {filename} in {app_template_path}")
Diese einfache Einrichtung sorgt für Konsistenz und erspart mir das wiederholte manuelle Erstellen dieser Dateien.
Um das Tool zu verwenden, navigiere ich einfach zu einem Verzeichnis der obersten Ebene, in dem ich meine Django-Projekte haben möchte, und führe python3 main.py <Projektname> <optionaler Anwendungsname> aus. Dieser eine Befehl erledigt alles. Er prüft Abhängigkeiten, richtet das Verzeichnis ein, installiert Django mit UV, erstellt Vorlagen und statische Dateien, initialisiert Git und generiert Konfigurationsdateien – alles in wenigen Sekunden. Ich kann sofort mit dem Programmieren mit einem vollständig strukturierten Projekt beginnen und alle sich wiederholenden Einrichtungsaufgaben überspringen.
Dieses Tool hat mir enorm viel Zeit gespart. Durch die Automatisierung der Einrichtung habe ich die mühsame Arbeit eliminiert, die früher mit jedem neuen Django-Projekt verbunden war. Anstatt jetzt Zeit mit der Verzeichnisstruktur und der Dateierstellung zu verbringen, kann ich jedes Mal mit einem sauberen, konsistenten Setup direkt in die Entwicklung einsteigen. Die Flexibilität von Python hat dieses Tool möglich gemacht, und ich habe bereits begonnen, über zusätzliche Funktionen nachzudenken, die ich in Zukunft hinzufügen möchte. Für jeden, der regelmäßig mit Django arbeitet, ist dieses Tool ein Wendepunkt – es lässt mehr Zeit, sich auf das Erstellen zu konzentrieren, und weniger auf das Einrichten.
Sie können das vollständige Skript im Github-Repository sehen, das ich für das Projekt eingerichtet habe.