2009-06-09 7 views
1

Nachdem Sie sich das Kapitel über wiederverwendbare Apps von Practical Django Projects angeschaut und den DjangoCon (Pycon?) Vortrag gehört haben, scheint es einen Schwerpunkt darauf zu geben, Ihre Apps steckbar zu machen, indem Sie sie in den Python Pfad, nämlich Site-Pakete, installieren.Installierte Apps in Django - was ist mit Versionen?

Was ich nicht verstehe ist, was passiert, wenn sich die Version einer dieser installierten Apps ändert. Wenn ich eine der Apps, die auf Site-Packages installiert sind, aktualisiere, wird das nicht alle meine aktuellen Projekte, die es verwenden, unterbrechen? Ich habe nie etwas in settings.py bemerkt, dass Sie die Version der App angeben, die Sie importieren.

Ich denke in Ruby/Rails, sie sind in der Lage, Edelsteine ​​für diese Art von Situation einzufrieren. Aber was sollen wir in Python/Django tun?

Antwort

5

Mehrere Versionen des gleichen Pakets werden unordentlich (setuptools kann es jedoch tun).

Ich habe es sauberer gefunden, jedes Projekt in seine eigene virtualenv zu setzen. Wir verwenden , um die virtualenvs einfach zu verwalten, und die --no-site-packages Option, um jedes Projekt wirklich eigenständig und portabel über Maschinen zu machen.

Dies ist die recommended setup for mod_wsgi servers.

+0

Die Verwendung von virtualenv in Kombination mit Pip macht es noch besser. – Apreche

+0

Klarstellung: Die Option '--no-site-packages' gilt für den Befehl 'mkvirtualenv' von 'virtualenvwrapper': 'mkvirtualenv --no-site-packages –

0

Sie möchten Ihre Django-Apps definitiv nicht in Site-Pakete aufnehmen, wenn Sie mehr als eine Django-Site haben.

Der beste Weg, wie Ken Arnold antwortete, ist Ian Bickings virtualenv (Virtual Python Environment Builder). Dies gilt insbesondere, wenn Sie mehrere Versionen von Django ausführen müssen.

Wenn Sie jedoch eine einzelne Version von Python und Django ausführen können, ist es möglicherweise einfacher, die Anwendungen einfach in Ihrem Projektverzeichnis zu installieren. Auf diese Weise können Sie, wenn eine externe App aktualisiert wird, jedes Ihrer Projekte nach Bedarf einzeln aktualisieren. Dies ist die Struktur Pinax für externe Django-Anwendungen auf einmal, aber ich denke, es ist jetzt mit virtualenv + pip (anstelle von setuptools/distutils).

0

Was wir machen.

Wir fügen nur "3rd-Party" Zeug in Site-Pakete. Django, XLRD, PIL usw.

Wir behalten unser Gesamtprojekt als eine Sammlung von Paketen und Django-Projekten. Jedes Projekt ist ein Teil der gesamten Website. Wir haben zwei getrennte Verhaltensweisen für Port 80 und Port 443 (SSL).

OverallProject/ 

    aPackage/ 
    anotherPackage/ 

    djangoProject80/ 
     settings.py 
     logging.ini 
     app_a_1/ 
      models.py # app a, version 1 schema 
     app_a_2/ 
      models.py # app a, version 2 schema 
     app_b_2/ 
      models.py 
     app_c_1/ 
      models.py 

    djangoProject443/ 

    test/ 
    tool/ 

Wir verwenden eine Versionsnummer als Teil des App-Namens. Dies ist die Hauptversionsnummer und ist an das Schema gebunden, da "Use-the-same-schema" eine Definition der Hauptfreigabekompatibilität ist.

Sie müssen die Daten migrieren und beweisen, dass die Dinge in der neuen Version funktionieren. Dann können Sie die alte Version löschen und das Schema aus der Datenbank entfernen. Die Migration der Daten ist eine Herausforderung, da Sie beide Apps nicht nebeneinander ausführen können.

Die meisten Anwendungen haben nur eine aktuelle Version installiert.