2009-07-13 17 views
3

Ich frage mich - wie können die Leute große Mengen häufig verwendeter Module in Django-Ansichten importieren? Und was ist die beste Methode, um dies effizient zu machen?Effizientes Importieren von Modulen in Django-Ansichten

Zum Beispiel habe ich wie einige Ansichten bekam,

admin_views.py 
search_views.py 
. 
. 

und von dem, was ich muss jeder von ihnen gesehen habe Httpresponse oder andere solche häufig verwendeten Module verwenden. Außerdem brauchen einige von ihnen Dinge wie BeautifulSoup, und andere brauchen andere Dinge (md5, auth, et al).

Was ich beim Start des Projekts getan habe, war eine include_all.py, die die meisten meiner gemeinsamen Importe enthielt, und fügte dann diese spezifischen Dinge in der Ansicht selbst hinzu. So hatte ich so etwas wie,

admin_views.py

from include_all import * 
... 
[list of specific module imports for admin] 
... 

search_views.py

from include_all import * 
... 
[list of specific module imports for search] 
... 

Im Laufe der Zeit die include_all eine misc Datei mit etwas wurde Put gebraucht zu werden hinein - eine Folge von Views führt dazu, dass sie Module importieren, die sie nicht benötigen.

Wird sich dies auf die Effizienz auswirken? Das heißt, importiert Python (Django?) Alle Module einmal und speichert/speichert sie so, dass jede andere Ansicht, die sie benötigt, sie nicht erneut importieren muss? Oder ist meine Methode, diese lange Datei als sehr ineffizient zu bezeichnen - und ich würde besser daran bleiben, diese Module in jeder Ansicht einzeln zu importieren?

Gibt es auch Best Practices für diese Art von Sache?

Danke!

Antwort

6

Python selbst gewährleistet, dass ein Modul nur einmal geladen wird (es sei denn, reload explizit genannt wird, was hier nicht der Fall ist): nach dem ersten Mal, import dieses Moduls bindet nur seinen Namen direkt von sys.modules[themodulename], eine extrem schnellen Bedienung . Also muss Django keine weitere Optimierung vornehmen, und Sie auch nicht.

Best Practice ist from ... import * in Produktionscode zu vermeiden (wodurch es klarer und wartungsfreundlicher, wo jeder Name kommt, erleichtert Tests, etc, etc) und Importieren von Modulen, "individuell" wie Sie es sagen, genau wo sie sind benötigt (indem man möglicherweise weniger Namen bindet, die einige Mikrosekunden sparen können und definitiv keine verschwenden, aber "explizit ist besser als implizit" - Klarheit, Lesbarkeit, Wartbarkeit - ist sowieso die Hauptüberlegung).

+0

Ah, das war eine weitere Follow-up-Frage, die ich stellen wollte - speziell mit Hilfe von ... * und Import * .. Danke! – viksit

+0

@viksit, gern geschehen! –

0

Ich denke, Sie könnten Ihre häufig verwendeten Importe in Ihre __init__.py Datei schlagen.

0

Django ist kein CGI (oder PHP). Ihre App ist ein einzelner (oder einige) lang laufender Python-Prozess. Egal wie lange es dauert, jede HTTP-Anfrage ruft einfach Ihre (bereits geladenen) View-Funktionen auf.

Verwandte Themen