首页 文章

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

提问于
浏览
38

我一直在使用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玩得很好?

UPDATE: 对于@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()

5 回答

  • 3
    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()
    
  • 39

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

    这就是对我有用的东西

    • install Django Extensions(我使用1.9.6)按照其他答案

    • 安装jupyter
      pip install jupyter

    • 我在Docker容器中设置了jupyter的一些东西 - 如果这适用于你,请参阅下面†
      从基础Django目录

    • ,为笔记本创建一个目录,例如:
      mkdir notebooks

    • 转到该目录
      cd notebooks

    • 从该目录中启动django extensions shell_plus:
      ../manage.py shell_plus --notebook
      笔记本服务器现在应该正在运行,并且可能会启动新的浏览器 . 如果它未启动浏览器窗口,请按照说明粘贴链接或令牌 .

    • 从浏览器中打开一个新的"Django Shell Plus"笔记本,按照John Mee 's answer'的截图

    AND ,重要的是,无法正常工作的是从笔记本环境中更改目录 . 如果我尝试使用不在运行 manage.py shell_plus --notebook 的目录中的任何笔记本,则表示未正确配置内核 . 对我来说,一次只为一个目录配置笔记本就足够了 .

    †Docker Setup(可选)

    • 为端口8888添加容器的端口映射

    例如,在docker compose文件中;

    ports:
          -  "8890:8888"
    
    • 配置项目设置文件以使用ip 0.0.0.0

    这就是我做的:

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

    只是为了完整性(但它已经安装了小部件,扩展,更改了主题等) . django_extensions 现在仍然只做部分工作:-)

    这假设您有一个Jupyter虚拟环境_1421011一个,其内核/扩展安装 --user . 所有Jupyter扩展(及其依赖项)都安装在这个venv中,而不是Django 's one/ones (you' ll在Django环境中仍需要pandas,matplotlib等,如果你需要将它们与Django代码一起使用的话) .

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

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

    这将创建一个内核配置目录,其中包含用户的Jupyter内核目录中的指定--name(在Linux上它是〜/ .jupyter /,在OSX上它是〜/ Library / Jupyter /),包含其kernel.json文件和图像/图标(默认情况下,使用我们正在安装的内核的默认Jupyter图标 . 这个内核将在创建时活动的虚拟环境中运行,因此使用完全相同版本的python和我们的Django项目使用的所有已安装模块 .

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

    为了解决这些问题,我们能够创建一个在我们已经配置的任何Django项目中运行的Notebook,并且能够运行存储在文件系统中任何位置的笔记本,我们需要:

    • 确保第一个'argv'参数包含虚拟环境中包含的ipython内核的完整路径

    • 添加(如果尚未存在)包含shell环境变量的'env'部分,然后使用这些来告诉Python在哪里找到我们的项目以及它应该使用哪些Django设置 . 我们通过添加如下内容来完成此操作:

    “env”:{“DJANGO_SETTINGS_MODULE”:“your_project.settings”,“PYTHONPATH”:“$ PYTHONPATH:/ home / projectuser / projectfolder / your_project”}

    • 可选:将'display_name'更改为人性化并替换图标 .

    编辑这个环境kernel.json文件,你会看到类似的东西:

    {
     "display_name": "My Project", 
     "language": "python", 
     "env": {
      "DJANGO_SETTINGS_MODULE": "my_project.settings",
      "PYTHONPATH": "$PYTHONPATH:/home/projectuser/projectfolder/your_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/your_project" :PYTHONPATH扩展为包含你的项目's main directory (the one containing manage.py) so that settings can be found even if the kernel isn't在该确切的目录中运行(这里django_extensions将使用泛型 python ,因此运行错误的虚拟环境,除非从内部启动整个Jupyter服务器:将其添加到kernel.json由django_extensions创建,将使它能够在Django项目目录中的任何位置运行笔记本)

    • "/home/projectuser/.pyenv/versions/2.7.15/envs/my_project_venv/bin/python" :内核执行的第一个参数(argv列表),应该是项目's virtual environment python interpreter (this is another thing django_extension gets wrong: fixing this will allow any notebook server to run that specific Django environment'内核及其所有已安装模块的完整路径

    • "django_extensions.management.notebook_extension" :这是将在笔记本中加载'shell_plus'功能的扩展名(可选但很有用:-))

  • 7

    以下适用于我使用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目录

    • 从第一个/顶级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)
    

相关问题