如何为Django设置Jupyter / IPython笔记本?

时间:2016-02-18 13:53:12

标签: django ipython ipython-notebook jupyter jupyter-notebook

我一直在使用this post中描述的方法来设置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笔记本电脑,这个设置现在已经打破了。我可以通过在笔记本的第一个单元格中添加类似的代码来在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()

9 个答案:

答案 0 :(得分:47)

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

    安装django-extensions
     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()
    

答案 1 :(得分:10)

这里有什么对我有用

  1. install Django Extensions(我使用1.9.6)根据其他答案
  2. 安装jupyter
    pip install jupyter
  3. 我在Docker容器中设置jupyter的一些东西 - 如果这适用于你,请参阅下面†
  4. 从你的基础Django目录,为笔记本创建一个目录,例如:
    mkdir notebooks
  5. 转到该目录
    cd notebooks
  6. 从该目录中启动django extensions shell_plus:
    ../manage.py shell_plus --notebook
    笔记本服务器现在应该正在运行,并且可能会启动新的浏览器。如果它没有启动浏览器窗口,请按照说明粘贴链接或令牌。
  7. 从浏览器中打开一个新的" Django Shell Plus"笔记本,根据John Mee的回答
  8. AND ,重要的是,没有的工作是从笔记本环境中更改目录。如果我尝试使用任何不在manage.py shell_plus --notebook运行目录中的笔记本,那么核心配置不正确。对我来说,一次只为一个目录配置笔记本就足够了。

    †Docker Setup(可选)

    1. 为端口8888
    2. 添加容器的端口映射

      例如,在您的docker撰写文件中;

      ports:
            -  "8890:8888"
      
      1. 配置项目设置文件以使用ip 0.0.0.0
      2. 这就是我所做的:

        NOTEBOOK_ARGUMENTS = [
            '--ip', '0.0.0.0', 
            '--allow-root',
            '--no-browser', 
        ]
        

答案 2 :(得分:9)

事实证明你(可能不)需要做所有的废话。只需安装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()

答案 3 :(得分:9)

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

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

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

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

这将在用户的Jupyter内核目录中创建具有指定名称的内核配置目录(在Linux上为~/.jupyter/,在OSX上为~/Library/Jupyter/),其中包含其kernel.json文件和images /图标(默认情况下,使用我们正在安装的内核的默认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"
   }
  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服务器:将其添加到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”功能的扩展名(可选,但有用:-))

答案 4 :(得分: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添加到Django项目INSTALLED_APPS文件的settings.py设置中来进行设置。:

    INSTALLED_APPS = (
        ...
        'django_extensions',
    )
    
  4. 运行django-extensions中的shell_plus管理命令。使用选项--notebook启动笔记本:

    python manage.py shell_plus --notebook
    

    Jupyter Notebooks将在您的浏览器中自动打开。

  5. 启动新的Django Shell-Plus笔记本

enter image description here

就是这样!


同样,您不必在第一个单元格中运行任何内容,并且可以通过运行dir()来查看当前本地作用域中的名称来佐证。

enter image description here

编辑:

如果要将笔记本放在根目录的notebooks目录中,可以执行以下操作:

$ mkdir notebooks && cd notebooks
$ python ../manage.py shell_plus --notebook

感谢Mark Chackerian的回答,提出了使笔记本在项目根目录以外的目录中运行的想法。

由于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

答案 5 :(得分:2)

以下适用于我使用win10,Python 3.5,Django 1.10:

  • 使用Anaconda发行版安装Python,以便安装 Jupyter
  • 安装 Django 并安装 django-extensions

    pip install Django
    
    pip install django-extensions
    
  • 启动一个新的Django项目。您必须在目录树的那部分中执行此操作,以后可以由Jupyter访问。

    django-admin startproject _myDjangoProject_
    
  • 启动Jypter

  • 将Jupyter导航到目录 myDjangoProject 并输入第一个/顶部 myDjangoProject -directory
  • 从第一个/顶部 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)
    

答案 6 :(得分:0)

我将为RobM的完整answer添加一些信息,以像我一样使用buildout和djangorecipe djangorecipe的极少数开发人员的利益。我使用的是Jupyter实验室,但我认为所有信息都可以应用于旧的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"
}

由于buildout是如何创建ipython脚本的,因此我无需添加环境变量。

Rob已经提到过,jupiterlab仅安装在一个使用以下命令启动的环境中:

jupyter lab

不是在Django项目的环境中,我只安装ipykernel(已经有20个依赖项)。

由于我倾向于进行很多项目,因此我发现从jupyter lab开始的一点很有意义,其中有许多项目链接,以便我可以轻松地到达它们。多亏了django_extension提供的扩展名,我不需要任何额外的单元格即可初始化笔记本。

以这种方式添加的任何单个内核都可以通过以下命令找到:

jupyter kernelspec list

并且在Jupyter Lab的启动器中明确列出

答案 7 :(得分:0)

尽管RobM可接受的答案有效,但它尚不清楚,并且有一些不必要的步骤。简而言之,要在项目目录之外的笔记本环境中通过Django 运行笔记本,

安装:

 pip install django-extensions

'django-extensions'添加到INSTALLED_APPS的{​​{1}}列表中

settings.py

从Django中运行笔记本,然后将其关闭:

 INSTALLED_APPS += ['django_extensions']

这将创建您的内核,我们现在将其编辑为指向Python的绝对路径而不是相对路径。

在OSX上,内核文件位于:python manage.py shell_plus --notebook

在Linux上:~/Library/Jupyter/kernels/django_extensions/kernel.json

我们只需要进行两项更改:

首先是将~/.jupyter/kernels/django_extensions/kernel.json"argv"列表中的第一个值编辑为Django虚拟环境中python版本的完整地址。例如:"python"

第二,在"/Users/$USERNAME/Documents/PROJECT_FOLDER/venv/bin/python"字典中,添加"env",其中"DJANGO_SETTINGS_MODULE": "mysite.settings",是包含Django设置的文件夹。

(可选)更改mysite的值。

现在,当您从任何目录运行笔记本时,选择"display_name"内核将允许您的笔记本与Django进行交互。任何软件包(例如pandas)都需要安装在Django venv中。

答案 8 :(得分:0)

运行此命令。

PYTHONPATH=/path/to/project/root DJANGO_SETTINGS_MODULE=settings python manage.py shell_plus --notebook