[python-users] Frage zu Django und Verwendung mehrerer Apps

Sascha Zantis sascha.zantis at rwth-aachen.de
Sa Feb 18 11:56:54 CET 2017


Hallo zusammen,

wie aus dem Subject ersichtlich ist, habe ich eine Frage zu Django. Da 
ich es aber von mehreren Mailinglisten kenne, dass es gerne gesehen ist, 
wenn sich neue User kurz vorstellen, mache ich das einfach mal.

Ich programmiere seit einigen Jahren (2008 oder 2009) ziemlich viel und 
sehr gerne Python und arbeite seit etwa 2.5 Jahren vermehrt im Bereich 
Webentwicklung, also nicht Python-only sondern eben auch mit PHP, 
Javascript und so weiter. Ich habe schon ein paar kleine bis mittelgroße 
Applikationen mit Flask und Pyramid umgesetzt, kenne mich auch ein 
bisschen in Ruby on Rails und so weiter aus. Vielleicht schaffe ich es 
ja in den nächsten Monaten mal zu eurem Stammtisch, das hatte ich mir 
eigentlich schon länger vorgenommen, Aachen selber hat ja offensichtlich 
keine eigene Python-Community.

Einführend zu meiner Frage: Ich arbeite mich gerade privat in Django ein 
mit dem Ziel, dieses Framework im Laufe des Jahres auch beruflich 
einzusetzen. Das offizielle Tutorial habe ich mittlerweile durch und 
weil noch ein paar Fragen offen geblieben sind, habe ich mir auch noch 
http://djangobook.com vorgenommen, bevor ich dann (nachdem ich mir noch 
ein Javascript-Framework angesehen habe, das ich nutzen möchte) mal eine 
"richtige" Applikation entwerfe. Zu der Frage habe ich bisher noch keine 
wirklich brauchbaren Antworten gefunden, vielleicht habe ich aber auch 
einen Denkfehler oder beachte irgendetwas Essentielles nicht.

Das Konzept des Loose Coupling, das auch auf Django-Apps zutrifft 
bedeutet ja in dem Kontext, dass jede App mehr oder weniger als 
standalone Paket zu betrachten ist und unabhängig von anderen Apps in 
verschiedenen Django-Applikationen nutzbar ist. Die Kopplung findet dann 
über die Projekt-settings.py und die Projekt-urls.py statt, die App wird 
dort installiert und an eine Route gemountet. Innerhalb der App werden 
dann Model, Templates usw. implementiert, die nur für diese App relevant 
sind.

Wenn ich nun nicht mehr nur eine Funktionalität in meinem Django-Projekt 
abbilden möchte, sondern mehrere, die aber gemeinsame Models verwenden 
sollen, stehe ich aktuell ein bisschen auf dem Schlauch. Ein fiktives 
Beispielprojekt könnte etwa so aussehen:

project:
   - blog
   - chat
   - diary
   - user

Auf dieser Seite könnten User bloggen, chatten und ein Tagebuch führen. 
Das Tagebuch wäre natürlich nicht öffentlich, Chats könnten wie auch 
immer aussehen. Alle Apps würden User-Funktionalität brauchen, die 
user-app würde auch Login, Registrierung, Profilseite usw. anzeigen und 
die gewohnte Funktionalität zur Userverwaltung anbieten.

Ich würde aber auch wollen, dass ich aus der Blog-Applikation auf den 
Chat zugreifen kann und im Chat würde ich auch gerne per User direkt 
ansprechen (Mit Autocompletion) oder auf Blogseiten verlinken 
(Vielleicht auch mit Autocompletion, um die Verbindung zu zeigen). 
Außerdem sollte es theoretisch möglich sein, dass ich alle Applikationen 
komplett einzeln installiere, ohne dass ich die users-Applikation dazu 
installieren muss.

Ein naiver Ansatz, der zwar die Applikationen verbindet, aber das 
Problem der Separierung nicht löst, wäre so etwas wie

---

from django.db import models
from user.models import User


class Diary(models.Model):
     …
     owner = models.ForeignKey(User)

---

Das Problem hierbei wäre, sobald meine User-Applikation nicht 
installiert ist, funktioniert das Ganze nicht. Dasselbe Problem würde 
auftreten, wenn ich in einer Blog-View Chat-Funktionalität aufrufen 
wollen würde, entweder über Routen oder sowas wie

HttpResponseRedirect(reverse('chat:display_group_chat', args=(chat.id,)))

Sobald chat nicht installiert ist, funktioniert das nicht mehr.

Bevor ich jetzt anfange, mir Gedanken darum zu machen, wie ich das 
selber löse, einen Ansatz hatte ich mir schon überlegt:

diary bekommt eine eigene user.py und in models.py würde dann sowas 
passieren wie:

---

from django.db import models
if is_installed(user_application):
     from user.models import User
else:
     from .user import User


class Diary(models.Model):
     …
     owner = models.ForeignKey(User)
---

wollte ich mich mal erkundigen, ob es da vielleicht einen einfachen 
"Django-Way" gibt, der das Problem für mich löst oder ob ich da generell 
einen Denkfehler habe.


Viele Grüße
Sascha



Mehr Informationen über die Mailingliste python-users