Как настроить блокнот 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, который мы настроили, и чтобы иметь возможность запускать блокноты, хранящиеся в любом месте файловой системы, нам необходимо:

  1. убедитесь, что первый параметр argv содержит полный путь к интерпретатору python, содержащемуся в виртуальной среде
  2. добавьте (если он еще не существует) раздел 'env, который будет содержать переменные окружения оболочки, а затем используйте их, чтобы сообщить Python, где найти наш проект и какие настройки Django он должен использовать. Мы делаем это, добавляя что-то вроде следующего:
   "env": {
      "DJANGO_SETTINGS_MODULE": "my_project.settings",
      "PYTHONPATH": "$PYTHONPATH:/home/projectuser/projectfolder/my_project"
   }
  1. необязательно: измените 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

  1. Установите django-extensions с https://github.com/django-extensions/django-extensions/blob/master/docs/index.rst

     pip install django-extensions
    
  2. Измените ваш файл настроек, чтобы включить "django-extensions"

     INSTALLED_APPS += ['django_extensions']
    
  3. Запустите свой сервер Django следующим образом:

    python manage.py shell_plus --notebook
    
  4. измените, чтобы удовлетворить, и запустите это в вашей первой камере

    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()
    
  5. Теперь вы сможете импортировать ваши модели django и т.д., Например:

    from app.models import Foobar
    Foobar.objects.all()
    

Ответ 3

Вот что у меня сработало

  1. установить расширения Django (я использовал 1.9.6) как и другие ответы
  2. установить Jupyter
    pip install jupyter
  3. некоторые вещи, которые я сделал для настройки jupyter внутри моего контейнера Docker - смотрите ниже, относится ли это к вам †
  4. из вашего базового каталога Django создайте каталог для ноутбуков, например
    mkdir notebooks
  5. Перейти в этот каталог
    cd notebooks
  6. запустить расширения django shell_plus из этого каталога:
    ../manage.py shell_plus --notebook
    Сервер ноутбука должен быть запущен и может запустить новый браузер. Если он не запускает окно браузера, следуйте инструкциям, чтобы вставить ссылку или токен.
  7. из браузера откройте новую записную книжку "Django Shell Plus", как показано на снимке экрана с ответом Джона Ми

И, что важно, что не работало, так это смена каталогов из среды ноутбука. Если я пытался работать с любым ноутбуком, который не был в каталоге, в manage.py shell_plus --notebook был запущен manage.py shell_plus --notebook, то ядро не было настроено правильно. Для меня достаточно было настроить ноутбук для работы только с одним каталогом за раз.

† Настройка Docker (необязательно)

  1. добавьте сопоставление портов для вашего контейнера для порта 8888

Например, в вашем докере создайте файл;

ports:
      -  "8890:8888"
  1. Сконфигурируйте ваш файл настроек проекта для использования 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, и ваш текущий рабочий каталог является корнем этого проекта.

меры

  1. Установить jupyter

    Используя пункт

    pip install jupyter
    

    Использование pipenv

    pipenv install jupyter
    
  2. Установите django-extentions

    Используя пункт

    pip install django-extensions
    

    Использование pipenv

    pipenv install django-extensions
    
  3. Настройте django-extensions, добавив его в параметр INSTALLED_APPS вашего файла settings.py проекта Django.:

    INSTALLED_APPS = (
        ...
        'django_extensions',
    )
    
  4. Запустите shell_plus управления shell_plus которая является частью django-extensions. Используйте опцию --notebook чтобы запустить ноутбук:

    python manage.py shell_plus --notebook
    

    Блокноты Jupyter откроются автоматически в вашем браузере.

  5. Начать новый ноутбук 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.