一尘不染

如何为Django设置Jupyter / IPython Notebook?

django

我一直在使用中描述的方法,这个职位设立IPython的笔记本电脑与Django的发挥很好。该方法的要点是创建一个IPython扩展,该扩展设置DJANGO_SETTINGS_MODULE并在IPython启动时运行django.setup()。

该扩展的代码是:

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 Notebook的情况下,此设置对我而言已无效。通过在笔记本的第一个单元格中添加类似的代码,我可以在Jupyter笔记本中运行Django代码。但是,我无法弄清楚如何让Jupyter自动运行扩展,因此我不必为正在创建的每个笔记本再次执行此操作。

如何使Django和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()

阅读 1511

收藏
2020-03-31

共2个答案

一尘不染

只是为了完整性(但现在是2018年,所以自发布此问题以来,情况可能有所变化):你实际上可以在Django环境中安装Jupyter Python内核,然后将其连接(运行在)另一台Jupyter服务器/环境(你在其中运行ve安装了小部件,扩展程序,更改了主题等)。django_extensions现在仍然只做部分必要的工作:-)

假设你拥有一个与Django分开的Jupyter虚拟环境,并且其内核/扩展安装了--user。所有Jupyter扩展(及其依赖项)都安装在此venv中,而不是Django的一个(一个)(如果需要将它们与Django代码一起使用,则在Django环境中仍然需要熊猫,matplotlib等)。

在Django虚拟环境(可以运行其他版本的Python,包括版本2解释器)中,安装ipython内核:

pip install -U ipykernel
ipython kernel install --user --name='environment_name' --display-name='Your Project'

这将在用户的Jupyter内核目录中创建具有指定名称的内核配置目录(在Linux ~/.jupyter/上是OSX,而​​在OSX上~/Library/Jupyter/),其中包含其kernel.json文件和图像/图标(默认情况下,内核的默认Jupyter图标)。重新安装)。该内核将在创建时处于活动状态的虚拟环境中运行,从而使用完全相同的python版本以及Django项目使用的所有已安装模块。

运行的./manage.py shell_plus --notebook功能非常相似,但是除了需要在当前venv中安装所有内容(包括Jupyter服务器和所有扩展)之外,它还无法在与项目根目录(包含根目录)不同的目录中运行笔记本./manage.py。另外,它将使用在路径上找到的第一个可执行文件python运行内核,而不是虚拟环境的可执行文件,从而使内核在不从活动Django虚拟环境内的命令行启动时表现异常。

为了解决这些问题,以便我们能够在配置好的任何Django项目中运行一个Notebook,并能够运行存储在文件系统上任何位置的Notebook,我们需要:

  1. 确保第一个’argv’参数包含虚拟环境中包含的python解释器的完整路径
  2. 添加(如果尚未存在)将包含外壳环境变量的“ 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服务器:将其添加到django_extensions创建的kernel.json中将使其能够在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’功能的扩展名(可选,但有用:-))

2020-03-31
一尘不染

  1. django-extensions从https://github.com/django-extensions/django-extensions/blob/master/docs/index.rst安装

pip install django-extensions

  1. 更改你的设置文件以包含“ django-extensions”
 INSTALLED_APPS += ['django_extensions']
  1. 像这样运行你的Django服务器:
python manage.py shell_plus --notebook
  1. 更改以适合,并在第一个单元格中运行
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()
2020-03-31