Ich habe die in dieser Beitrag beschriebene Methode verwendet, um IPython Notebook so einzurichten, dass es gut mit Django zusammenspielt. Der Kern der Methode besteht darin, eine IPython-Erweiterung zu erstellen, mit der Django_SETTINGS_MODULE festgelegt und Django.setup () ausgeführt wird, wenn IPython gestartet wird.
Der Code für die Erweiterung lautet:
def load_ipython_extension(ipython):
# The `ipython` argument is the currently active `InteractiveShell`
# instance, which can be used in any way. This allows you to register
# new magics or aliases, for example.
try:
import os
os.environ.setdefault("Django_SETTINGS_MODULE", "settings")
import Django
Django.setup()
except ImportError:
pass
Mit einem kürzlich durchgeführten Upgrade auf Jupyter Notebook ist dieses Setup für mich jetzt fehlerhaft. Ich kann Django Code im Jupyter-Notizbuch ausführen, indem ich der ersten Zelle des Notizbuchs ein ähnliches Stück Code hinzufüge. Ich konnte jedoch nicht herausfinden, wie ich Jupyter zum Ausführen bringe Die Erweiterung wird automatisch erstellt, sodass ich dies nicht für jedes Notizbuch, das ich erstelle, erneut ausführen muss.
Was soll ich tun, damit Django und Jupyter gut spielen?
UPDATE: Für @DarkLight verwende ich Django 1.8.5 mit Jupyter 1.0.0. Den Code, den ich ausführe Im Notizbuch steht:
import os, sys
sys.path.insert(0, '/path/to/project')
os.environ.setdefault("Django_SETTINGS_MODULE", "settingsfile")
import Django
django.setup()
Installieren Django-extensions
from https://github.com/Django-extensions/Django-extensions/blob/master/docs/index.rst
pip install Django-extensions
Ändere deine Einstellungsdatei so, dass sie 'Django-Erweiterungen' enthält
INSTALLED_APPS += ['Django_extensions']
Führen Sie Ihren Django Server folgendermaßen aus:
python manage.py Shell_plus --notebook
passen Sie es an und führen Sie es in Ihrer ersten Zelle aus
import os, sys
PWD = os.getenv('PWD')
os.chdir(PWD)
sys.path.insert(0, os.getenv('PWD'))
os.environ.setdefault("Django_SETTINGS_MODULE", "local_settings.py")
import Django
django.setup()
Jetzt solltest du in der Lage sein, deine Django Modelle usw. zu importieren, zB:
from app.models import Foobar
Foobar.objects.all()
Hier ist, was gerade für mich gearbeitet hat
pip install jupyter
mkdir notebooks
cd notebooks
../manage.py Shell_plus --notebook
[~ # ~] und [~ # ~] , was hat nicht funktioniert Die Arbeit bestand darin, die Verzeichnisse von zu ändern in der Notebook-Umgebung. Wenn ich versuchte, mit einem Notebook zu arbeiten, das sich nicht in dem Verzeichnis befand, das manage.py Shell_plus --notebook
wurde eingelaufen, dann war das kernal nicht korrekt konfiguriert. Für mich war es gut genug, das Notebook jeweils nur für ein einziges Verzeichnis zu konfigurieren.
Beispielsweise können Sie in Ihrem Docker eine Datei erstellen.
ports:
- "8890:8888"
Das habe ich gemacht:
NOTEBOOK_ARGUMENTS = [
'--ip', '0.0.0.0',
'--allow-root',
'--no-browser',
]
Eigentlich stellt sich heraus, dass Sie ( vielleicht nicht ) den ganzen Mist machen müssen. Einfach Django-Extensions installieren und jupyter starten!
(myprojectvenv)$ cd myproject
(myprojectvenv)$ pip install jupyter
(myprojectvenv)$ pip install Django-extensions
(myprojectvenv)$ jupyter notebook
Starten Sie im Browser ein neues "Django Shell-Plus":
Und Sie sollten gut zu gehen sein. z.B:
from myproject.models import Foobar
Foobar.objects.all()
Hinweis: Ich verwende Python 3.7 und Django 2.1, es funktioniert für Django 2.2 . Ich muss in meiner ersten Zelle nichts ausführen, und das funktioniert wie ein Zauber, solange es Ihnen nichts ausmacht, die Notizbücher im Stammverzeichnis Ihres Django -Projekts zu haben.
Es wird davon ausgegangen, dass Sie eine virtuelle Umgebung haben für Ihr Projekt, und es ist aktiviert. Ich benutze pipenv
, um virtuelle Umgebungen zu erstellen und Abhängigkeiten meiner python Projekte zu verfolgen, aber es liegt an Ihnen, welches Tool Sie verwenden.
Es wird auch angenommen, dass Sie ein Django-Projekt erstellt haben und Ihr aktuelles Arbeitsverzeichnis das Stammverzeichnis dieses Projekts ist.
Installieren Sie jupyter
Mit pip
pip install jupyter
Mit pipenv
pipenv install jupyter
Installiere Django-extentions
Mit pip
pip install Django-extensions
Mit pipenv
pipenv install Django-extensions
Richten Sie Django-extensions
Ein, indem Sie es zur Einstellung INSTALLED_APPS
Ihrer Django Projektdatei settings.py
Hinzufügen:
INSTALLED_APPS = (
...
'Django_extensions',
)
Führen Sie den Verwaltungsbefehl Shell_plus
aus, der Teil von Django-extensions
Ist. Verwenden Sie die Option --notebook
, Um ein Notizbuch zu starten:
python manage.py Shell_plus --notebook
Jupyter Notebooks wird automatisch in Ihrem Browser geöffnet.
Starten Sie ein neues Django Shell-Plus-Notizbuch
Das ist es!
Auch hier müssen Sie nichts in der ersten Zelle ausführen, und Sie können dies bestätigen, indem Sie dir()
ausführen, um die Namen im aktuellen lokalen Bereich anzuzeigen.
Wenn Sie Ihre Notizbücher in einem Verzeichnis namens notebooks
im Stammverzeichnis ablegen möchten, können Sie Folgendes tun:
$ mkdir notebooks && cd notebooks
$ python ../manage.py Shell_plus --notebook
Vielen Dank an Mark Chackerian, dessen Antwort die Idee lieferte, die Notizbücher in einem anderen Verzeichnis als dem Stammverzeichnis des Projekts auszuführen.
Dies sind die Module, die dank Shell_plus
Automatisch importiert werden:
# Shell Plus Model Imports
from Django.contrib.admin.models import LogEntry
from Django.contrib.auth.models import Group, Permission, User
from Django.contrib.contenttypes.models import ContentType
from Django.contrib.sessions.models import Session
# Shell Plus Django Imports
from Django.core.cache import cache
from Django.conf import settings
from Django.contrib.auth import get_user_model
from Django.db import transaction
from Django.db.models import Avg, Case, Count, F, Max, Min, Prefetch, Q, Sum, When, Exists, OuterRef, Subquery
from Django.utils import timezone
from Django.urls import reverse
Folgendes funktioniert für mich mit win10, Python 3.5, Django 1.10:
Installiere Django und installiere Django-Erweiterungen:
pip install Django
pip install Django-extensions
Starten Sie ein neues Django Projekt. Sie müssen dies in dem Teil Ihres Verzeichnisbaums tun, auf den Jupyter später zugreifen kann.
Django-admin startproject _myDjangoProject_
Starten Sie Jypter
geben Sie den folgenden Code ein und führen Sie ihn aus:
import os
os.environ.setdefault("Django_SETTINGS_MODULE", "myDjangoProject.settings")
import Django
django.setup()
Beachten Sie, dass dieser Teil des Codes derselbe ist wie in manage.py, und beachten Sie, dass "myDjangoProject.settings" auf myDjangoProject/settings.py verweist
Nun können Sie mit Beispielen beginnen, z.
from Django.template import Template, Context
template = Template('The name of this project is {{ projectName }}')
context = Context({'projectName': 'MyJypyterDjangoSite'})
template.render(context)
Während die akzeptierte Antwort von RobM funktioniert, war es weniger klar als es sein könnte und hat ein paar unnötige Schritte. Einfach ausgedrückt, um Notebooks über Django aus einer Notebook-Umgebung außerhalb des Projektverzeichnisses auszuführen:
Installieren:
pip install Django-extensions
Fügen Sie 'Django-extensions'
Zu Ihrer INSTALLED_APPS
- Liste in settings.py
Hinzu
INSTALLED_APPS += ['Django_extensions']
Führen Sie ein Notizbuch in Django aus und schließen Sie es:
python manage.py Shell_plus --notebook
Dadurch wird Ihr Kernel erstellt, der nun so bearbeitet wird, dass er auf einen absoluten Pfad von Python statt auf einen relativen Pfad verweist.
Unter OSX befindet sich die Kerneldatei unter: ~/Library/Jupyter/kernels/Django_extensions/kernel.json
Unter Linux: ~/.jupyter/kernels/Django_extensions/kernel.json
Wir müssen nur zwei Änderungen vornehmen:
Der erste besteht darin, den ersten Wert in der Liste "argv"
Von "python"
Bis zur vollständigen Adresse der python Version in Ihrem Django virtuelle Umgebung, zB: "/Users/$USERNAME/Documents/PROJECT_FOLDER/venv/bin/python"
Zweitens fügen Sie dem Wörterbuch "env"
"Django_SETTINGS_MODULE": "mysite.settings",
Hinzu, wobei mysite
der Ordner ist, der Ihre Django Einstellungen enthält.
Ändern Sie optional den Wert von "display_name"
.
Wenn Sie nun ein Notizbuch aus einem beliebigen Verzeichnis ausführen, können Ihre Notizbücher mit Django interagieren, indem Sie den Kernel "Django Shell-Plus"
Auswählen. Alle Pakete wie pandas müssen in der Django venv installiert werden.
Ich werde einige Informationen zum vollständigen answer von RobM hinzufügen, zum Nutzen der sehr seltenen Entwickler, die buildout zusammen mit djangorecipe djangorecipe as verwenden Ich beziehe mich auf jupyter lab, wenn ich das benutze, aber ich denke, dass alle Informationen auf alte Jupyter-Notizbücher angewendet werden können.
Wenn Sie buildout verwenden, erhalten Sie einen 'bin/Django'-Handler, den Sie anstelle von' manage.py 'verwenden. Das ist das Skript, das den gesamten Pfad definiert. Ich habe einen weiteren Teil in meine buildout.cfg eingefügt:
[ipython]
recipe = zc.recipe.Egg
eggs = ${buildout:eggs}
extra-paths = ${buildout:directory}/apps
initialization = import os
os.environ['Django_SETTINGS_MODULE'] = 'web.settings'
damit wird ein weiteres Skript mit dem Namen ipython
im Verzeichnis ./bin
erstellt. Ich weise kernelspec auf diesen Interpreter. Darüber hinaus verwende ich das Argument kernel
anstelle von "-m", "ipykernel_launcher"
, Sodass die von mir verwendete Kerneldefinition wie folgt lautet:
{
"argv": [
"/misc/src/hg/siti/trepalchi/bin/ipython",
"kernel",
"-f",
"{connection_file}",
"--ext",
"Django_extensions.management.notebook_extension"
],
"display_name": "Trepalchi",
"language": "python"
}
Da das ipython-Skript von buildout
erstellt wird, müssen in meinem Fall keine Umgebungsvariablen hinzugefügt werden.
Wie bereits von Rob erwähnt, wird jupiterlab nur in einer Umgebung installiert, in der ich es mit dem folgenden Befehl starte:
jupyter lab
nicht in der Umgebung von Django project whare ich nur ipykernel
(das hat bereits eine Reihe von 20 Abhängigkeiten).
Da ich in der Regel sehr viele Projekte habe, finde ich es nützlich, einen einzigen Punkt zu haben, an dem ich jupyter lab
Mit vielen Links zu den Projekten beginne, damit ich sie leicht erreichen kann. Dank der Erweiterung von Django_extension brauche ich keine zusätzliche Zelle, um das Notebook zu initialisieren.
Jeder einzelne auf diese Weise hinzugefügte Kernel kann mit dem folgenden Befehl gefunden werden:
jupyter kernelspec list
Und übersichtlich aufgelistet im Launcher von Jupyter Lab