Как настроить блокнот Jupyter/IPython для Django?
Я использовал метод, описанный в этом посте, для настройки IPython Notebook для приятной игры с Django. Суть метода заключается в создании расширения IPython, которое устанавливает DJANGO_SETTINGS_MODULE и запускает django.setup() при запуске IPython.
Код для расширения:
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
С недавним обновлением до Ноутбука Jupyter эта установка теперь сломана для меня. Я могу запустить код Django в записной книжке Jupyter, добавив похожий фрагмент кода в первую ячейку записной книжки. Однако я не смог понять, как заставить Jupyter автоматически запускать расширение, поэтому мне не пришлось бы делать это снова для каждой записной книжки, которую я создаю.
Что я должен сделать, чтобы Джанго и Юпитер играли хорошо?
ОБНОВЛЕНИЕ: для @DarkLight - я использую Django 1.8.5 с Jupyter 1.0.0. Код, который я запускаю в блокноте:
import os, sys
sys.path.insert(0, '/path/to/project')
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settingsfile")
import django
django.setup()
Ответы
Ответ 1
Просто для полноты (но это 2018, так что, возможно, все изменилось с момента публикации этого вопроса): вы можете установить ядро Jupyter Python в вашей среде Django, которая затем подключит (запустит) другой сервер/среду Jupyter (где вы '). установил виджеты, расширения, сменил тему и т.д.). Прямо сейчас django_extensions
выполняет только часть необходимой работы :-)
Это предполагает, что у вас есть виртуальная среда Jupyter, которая отделена от Django и чьи ядра/расширения установлены с --user
. Все расширения Jupyter (и их зависимости) устанавливаются в этот venv вместо Django one/ones (вам все равно понадобятся pandas, matplotlib и т.д. В среде Django, если вам нужно использовать их вместе с кодом Django).
В вашей виртуальной среде Django (которая может работать с другой версией Python, включая интерпретатор версии 2) установите ядро ipython:
pip install -U ipykernel
ipython kernel install --user --name='environment_name' --display-name='Your Project'
Это создаст каталог конфигурации ядра с указанным -–name в вашем пользовательском каталоге ядра Jupyter (в Linux это ~/.jupyter/
а в OSX - ~/Library/Jupyter/
), содержащем файл kernel.json и images/icons ( по умолчанию используется значок Jupyter по умолчанию для установки ядра). Это ядро будет работать в виртуальной среде, которая была активной при создании, таким образом, используя точно такую же версию python и все установленные модули, используемые нашим проектом Django.
Запуск ./manage.py shell_plus --notebook
делает что-то очень похожее, но кроме того, что требуется все (включая сервер Jupyter и все расширения), установленные в текущем венге, он также не может запускать записные книжки в каталогах, отличных от корневого каталога проектов. (тот, который содержит ./manage.py
). Кроме того, оно будет запускать ядро, используя первый исполняемый файл, называемый python, который он находит по пути, а не в виртуальных средах, что делает его некорректным, если он не запускается из командной строки в активной виртуальной среде Django.
Чтобы решить эти проблемы, чтобы мы могли создать Блокнот, работающий внутри любого проекта Django, который мы настроили, и чтобы иметь возможность запускать блокноты, хранящиеся в любом месте файловой системы, нам необходимо:
- убедитесь, что первый параметр argv содержит полный путь к интерпретатору python, содержащемуся в виртуальной среде
- добавьте (если он еще не существует) раздел 'env, который будет содержать переменные окружения оболочки, а затем используйте их, чтобы сообщить Python, где найти наш проект и какие настройки Django он должен использовать. Мы делаем это, добавляя что-то вроде следующего:
"env": {
"DJANGO_SETTINGS_MODULE": "my_project.settings",
"PYTHONPATH": "$PYTHONPATH:/home/projectuser/projectfolder/my_project"
}
- необязательно: измените display_name на удобное для человека и замените значки.
редактируя этот файл kernel.json, вы увидите нечто похожее:
{
"display_name": "My Project",
"language": "python",
"env": {
"DJANGO_SETTINGS_MODULE": "my_project.settings",
"PYTHONPATH": "$PYTHONPATH:/home/projectuser/projectfolder/my_project"
},
"argv": [
"/home/projectuser/.pyenv/versions/2.7.15/envs/my_project_venv/bin/python",
"-m",
"ipykernel_launcher",
"-f",
"{connection_file}",
"--ext",
"django_extensions.management.notebook_extension"
]
}
Известные линии:
-
"DJANGO_SETTINGS_MODULE": "my_project.settings": ваши настройки, как правило, как видно из вашего проекта manage.py
-
"PYTHONPATH": "$ PYTHONPATH: /home/projectuser/projectfolder/my_project": PYTHONPATH расширен, чтобы включить основной каталог вашего проекта (тот, который содержит manage.py), так что настройки можно найти, даже если ядро не запущено в этот точный каталог (здесь django_extensions будет использовать общий python
, таким образом, запустив неправильную виртуальную среду, если только внутри него не будет запущен весь сервер Jupyter: добавление этого в kernel.json, созданный django_extensions, позволит ему запускать записные книжки в любом месте проекта Django каталог)
-
"/home/projectuser/.pyenv/versions/2.7.15/envs/my_project_venv/bin/python": первый аргумент (список argv) выполнения ядра должен быть полным путем к интерпретатору Python виртуальной среды вашего проекта (это Другое дело, что django_extensions ошибается: исправление этого позволит любому ноутбуку-серверу запускать это конкретное ядро среды Django со всеми установленными модулями)
-
"django_extensions.management.notebook_extension": это расширение, которое загружает функциональность "shell_plus" в блокнот (необязательно, но полезно :-))
Ответ 2
-
Установите django-extensions
с https://github.com/django-extensions/django-extensions/blob/master/docs/index.rst
pip install django-extensions
-
Измените ваш файл настроек, чтобы включить "django-extensions"
INSTALLED_APPS += ['django_extensions']
-
Запустите свой сервер Django следующим образом:
python manage.py shell_plus --notebook
-
измените, чтобы удовлетворить, и запустите это в вашей первой камере
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()
-
Теперь вы сможете импортировать ваши модели django и т.д., Например:
from app.models import Foobar
Foobar.objects.all()
Ответ 3
Вот что у меня сработало
- установить расширения Django (я использовал 1.9.6) как и другие ответы
- установить Jupyter
pip install jupyter
- некоторые вещи, которые я сделал для настройки jupyter внутри моего контейнера Docker - смотрите ниже, относится ли это к вам †
- из вашего базового каталога Django создайте каталог для ноутбуков, например
mkdir notebooks
- Перейти в этот каталог
cd notebooks
- запустить расширения django shell_plus из этого каталога:
../manage.py shell_plus --notebook
Сервер ноутбука должен быть запущен и может запустить новый браузер. Если он не запускает окно браузера, следуйте инструкциям, чтобы вставить ссылку или токен. - из браузера откройте новую записную книжку "Django Shell Plus", как показано на снимке экрана с ответом Джона Ми
И, что важно, что не работало, так это смена каталогов из среды ноутбука. Если я пытался работать с любым ноутбуком, который не был в каталоге, в manage.py shell_plus --notebook
был запущен manage.py shell_plus --notebook
, то ядро не было настроено правильно. Для меня достаточно было настроить ноутбук для работы только с одним каталогом за раз.
† Настройка Docker (необязательно)
- добавьте сопоставление портов для вашего контейнера для порта 8888
Например, в вашем докере создайте файл;
ports:
- "8890:8888"
- Сконфигурируйте ваш файл настроек проекта для использования ip 0.0.0.0
Вот что я сделал:
NOTEBOOK_ARGUMENTS = [
'--ip', '0.0.0.0',
'--allow-root',
'--no-browser',
]
Ответ 4
На самом деле оказывается, что вам (возможно, нет) нужно делать все это дерьмо. Просто установите django-extensions и запустите jupyter!
(myprojectvenv)$ cd myproject
(myprojectvenv)$ pip install jupyter
(myprojectvenv)$ pip install django-extensions
(myprojectvenv)$ jupyter notebook
В браузере запустите новый "Django Shell-Plus": ![enter image description here]()
И тебе должно быть хорошо идти. например:
from myproject.models import Foobar
Foobar.objects.all()
Ответ 5
Примечание: я использую Python 3.7 и Django 2.1, он работает для Django 2.2. Мне не нужно ничего запускать в моей первой камере, и это работает как шарм, если вы не возражаете, чтобы записные книжки были в корне вашего проекта Django.
Предполагается, что у вас есть виртуальная среда для вашего проекта, и она активирована. Я использую pipenv
для создания виртуальных сред и отслеживания зависимостей моих проектов на python, но какой инструмент вы используете, зависит от вас.
Также предполагается, что вы создали проект Django, и ваш текущий рабочий каталог является корнем этого проекта.
меры
-
Установить jupyter
Используя пункт
pip install jupyter
Использование pipenv
pipenv install jupyter
-
Установите django-extentions
Используя пункт
pip install django-extensions
Использование pipenv
pipenv install django-extensions
-
Настройте django-extensions
, добавив его в параметр INSTALLED_APPS
вашего файла settings.py
проекта Django.:
INSTALLED_APPS = (
...
'django_extensions',
)
-
Запустите shell_plus
управления shell_plus
которая является частью django-extensions
. Используйте опцию --notebook
чтобы запустить ноутбук:
python manage.py shell_plus --notebook
Блокноты Jupyter откроются автоматически в вашем браузере.
-
Начать новый ноутбук Django Shell-Plus
![enter image description here]()
Это!
Опять же, вам не нужно ничего запускать в первой ячейке, и вы можете подтвердить это, запустив dir()
чтобы увидеть имена в текущей локальной области.
![enter image description here]()
Редактировать:
Если вы хотите поместить свои записные книжки в каталог под названием notebooks
в корневом каталоге, вы можете сделать следующее:
$ mkdir notebooks && cd notebooks
$ python ../manage.py shell_plus --notebook
Спасибо Марку Чакеряну, чей ответ дал идею сделать записные книжки в каталоге, отличном от корневого каталога проекта.
Это модули, которые импортируются автоматически благодаря shell_plus
:
# 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
Ответ 6
Следующее работает для меня, используя win10, Python 3.5, Django 1.10:
- Установите Python с дистрибутивом Anaconda, поэтому Jupyter будет установлен
-
Установите Django и установите django-extensions:
pip install Django
pip install django-extensions
-
Запустите новый проект Django. Вы должны сделать это в той части вашего дерева каталогов, к которой позже может обратиться Юпитер.
django-admin startproject _myDjangoProject_
-
Запустите Jypter
- перейдите в Jupyter в каталог myDjangoProject и введите первый/верхний myDjangoProject-каталог
- Запустите в первом/верхнем каталоге myDjangoProject новый Jupyter noteboke: new → Django Shell-Plus
-
введите и запустите следующий фрагмент кода:
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myDjangoProject.settings")
import django
django.setup()
-
Обратите внимание, что этот фрагмент кода такой же, как и в файле manage.py, и обратите внимание, что "myDjangoProject.settings" указывает на myDjangoProject/settings.py
-
Теперь вы можете начать с примеров, например:
from django.template import Template, Context
template = Template('The name of this project is {{ projectName }}')
context = Context({'projectName': 'MyJypyterDjangoSite'})
template.render(context)
Ответ 7
У меня есть код Python в блокноте Jupyter и кнопку HTML в Django, как я запускаю код Python (в Jupyter) с помощью кнопки HTML (в Django)
Ответ 8
Я добавлю некоторую информацию к очень полному ответу RobM, в пользу очень редких разработчиков, которые используют buildout вместе с djangorecipe djangorecipe так же, как я... Я ссылаюсь на jupyter lab, поскольку использую это, но я думаю, что вся информация может быть применяется к старым ноутбукам Jupyter.
При использовании buildout вы получите обработчик bin/django, который будете использовать вместо manage.py. Это сценарий, который определяет весь путь. Я добавил еще одну часть в свой buildout.cfg:
[ipython]
recipe = zc.recipe.egg
eggs = ${buildout:eggs}
extra-paths = ${buildout:directory}/apps
initialization = import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'web.settings'
так что еще один скрипт с именем ipython
будет создан в ./bin
каталоге. Я указываю kernelspec на этот интерпретатор. Более того, я использую аргумент kernel
а не "-m", "ipykernel_launcher"
так что используемое определение ядра:
{
"argv": [
"/misc/src/hg/siti/trepalchi/bin/ipython",
"kernel",
"-f",
"{connection_file}",
"--ext",
"django_extensions.management.notebook_extension"
],
"display_name": "Trepalchi",
"language": "python"
}
Из-за того, как сценарий ipython создается buildout
нет необходимости добавлять переменные окружения в моем случае.
Как уже упоминал Роб, jupiterlab устанавливается только в одной среде, где я запускаю его командой:
jupyter lab
не в среде проекта Django, где я только устанавливаю ipykernel
(который уже имеет 20 зависимостей).
Поскольку у меня, как правило, довольно много проектов, я считаю полезным иметь единственную точку, где я начинаю jupyter lab
со множеством ссылок на проекты, чтобы я мог легко их достать. Благодаря расширению, предоставленному django_extension, мне не нужны дополнительные ячейки для инициализации ноутбука.
Любое добавленное таким образом ядро можно найти с помощью команды:
jupyter kernelspec list
И четко указан в лаунчере Jupyter Lab
Ответ 9
Хотя принятый ответ от RobM работает, он был менее ясным, чем мог бы быть, и содержит несколько ненужных шагов. Проще говоря, для запуска записных книжек через Django из окружения записной книжки за пределами каталога проекта:
Установка:
pip install django-extensions
Добавьте 'django-extensions'
в список INSTALLED_APPS
в settings.py
INSTALLED_APPS += ['django_extensions']
Запустите блокнот из Django, затем закройте его:
python manage.py shell_plus --notebook
Это создаст ваше ядро, которое мы теперь отредактируем, чтобы указать абсолютный путь Python, а не относительный путь.
В OSX файл ядра находится по адресу: ~/Library/Jupyter/kernels/django_extensions/kernel.json
В Linux: ~/.jupyter/kernels/django_extensions/kernel.json
Нам нужно только сделать два изменения:
Первый - отредактировать первое значение в списке "argv"
из "python"
по полному адресу версии python в вашей виртуальной среде Django. Например: "/Users/$USERNAME/Documents/PROJECT_FOLDER/venv/bin/python"
Во-вторых, в словарь "env"
добавьте "DJANGO_SETTINGS_MODULE": "mysite.settings",
где mysite
- это папка, содержащая ваши настройки Django.
При необходимости измените значение "display_name"
.
Теперь, когда вы запускаете ноутбук из любого каталога, выбор ядра "Django Shell-Plus"
позволит вашим ноутбукам взаимодействовать с Django. Любые пакеты, такие как pandas, должны быть установлены в venv Django.