我一直在使用 this post 中描述的方法来设置 IPython Notebook 以与 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()
从 https://github.com/django-extensions/django-extensions/blob/master/docs/index.rst 安装 django-extensions pip install django-extensions 更改您的设置文件以包含 'django-extensions' INSTALLED_APPS += [ 'django_extensions'] 像这样运行你的 Django 服务器: python manage.py shell_plus --notebook alter to suit,并在你的第一个单元格 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 模型了等等 例如:从 app.models 导入 Foobar Foobar.objects.all()
只是为了完整性(但它是 2018 年,所以自从发布这个问题以来情况可能发生了变化):您实际上可以在您的 Django 环境中安装一个 Jupyter Python 内核,然后将连接(运行)不同的 Jupyter 服务器/环境(你在已安装小部件、扩展程序、更改主题等)。 django_extensions
现在仍然只做部分必需的工作 :-)
这假设您有一个独立于 Django 的 Jupyter 虚拟环境,并且其内核/扩展与 --user
一起安装。所有的 Jupyter 扩展(及其依赖项)都安装在这个 venv 中,而不是 Django 的一个/一个(如果你需要将它们与 Django 代码一起使用,你仍然需要在 Django 环境中使用 pandas、matplotlib 等)。
在您的 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/
)中创建一个具有指定 --name 的内核配置目录,其中包含其 kernel.json 文件和图像/图标(默认情况下是默认的 Jupyter使用我们正在安装的内核的图标)。该内核将在创建时处于活动状态的虚拟环境中运行,因此使用完全相同版本的 python 和我们的 Django 项目使用的所有已安装模块。
运行 ./manage.py shell_plus --notebook
做的事情非常相似,但除了需要在当前 venv 中安装所有东西(包括 Jupyter 服务器和所有扩展)之外,它还无法在与项目根目录不同的目录中运行笔记本(包含 {2 })。此外,它将使用它在路径上找到的第一个名为 python 的可执行文件运行内核,而不是虚拟环境的可执行文件,这使得它在未从活动 Django 虚拟环境中的命令行启动时行为不端。
为了解决这些问题,以便我们能够创建一个在我们如此配置的任何 Django 项目中运行的 Notebook,并能够运行存储在文件系统上任何位置的笔记本,我们需要:
确保第一个 'argv' 参数包含虚拟环境中包含的 python 解释器的完整路径添加(如果尚未存在)将包含 shell 环境变量的 '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”功能的扩展(可选但有用:-))
这就是对我有用的东西
按照其他答案安装 Django 扩展(我使用 1.9.6)安装 jupyter pip install jupyter 我在 Docker 容器中设置 jupyter 所做的一些事情 - 如果这适用于您,请参见下文† 从您的基本 Django 目录创建一个目录笔记本,例如 mkdir notebooks 进入那个目录 cd notebooks start django extensions shell_plus 从那个目录里面: ../manage.py shell_plus --notebook 笔记本服务器现在应该正在运行,并且可能会启动一个新的浏览器。如果它没有启动浏览器窗口,请按照说明粘贴链接或令牌。根据 John Mee 的答案截图,从浏览器中打开一个新的“Django Shell Plus”笔记本
并且,重要的是,没有工作的是从笔记本环境中更改目录。如果我尝试使用不在运行 manage.py shell_plus --notebook
的目录中的任何笔记本,则内核配置不正确。对我来说,一次只为一个目录配置笔记本就足够了。如果您需要更强大的解决方案,您应该能够在启动 jupyter 之前设置 PYTHONPATH
。例如,将 export PYTHONPATH="$PYTHONPATH:/path/to/django/project"
添加到 virtualenv 激活脚本。但我没有试过这个。
† Docker 设置(可选)
为您的容器添加端口映射 8888
例如,在您的 docker compose 文件中;
ports:
- "8890:8888"
将项目设置文件配置为使用 ip 0.0.0.0
这就是我所做的:
NOTEBOOK_ARGUMENTS = [
'--ip', '0.0.0.0',
'--allow-root',
'--no-browser',
]
notebooks
时,该目录中是否有 manage.py
或者您如何从那里运行它?
../manage.py shell_plus --notebook
,注意 ../
。对我来说很好用 Django 2.1。
注意:我使用的是 Python 3.7 和 Django 2.1,它适用于 Django 2.2。我不必在我的第一个单元格中运行任何东西,只要您不介意将笔记本放在 Django 项目的根目录中,这就像魅力一样。
假设您的项目有一个虚拟环境,并且它已被激活。我使用 pipenv
来创建虚拟环境并跟踪我的 python 项目的依赖关系,但这取决于您使用什么工具。
还假设您已经创建了一个 Django 项目,并且您当前的工作目录是该项目的根目录。
脚步
使用 pip pip install jupyter 使用 pipenv pipenv install jupyter 安装 django-extensions 使用 pip pip install django-extensions 使用 pipenv pipenv install django-extensions 通过将 django-extensions 添加到 Django 项目 settings.py 文件的 INSTALLED_APPS 设置来设置.: INSTALLED_APPS = ( ... 'django_extensions', ) 运行作为 django-extensions 一部分的 shell_plus 管理命令。使用选项 --notebook 启动笔记本: python manage.py shell_plus --notebook Jupyter Notebooks 将在您的浏览器中自动打开。启动一个新的 Django Shell-Plus 笔记本
https://i.stack.imgur.com/b0774.png
而已!
同样,您不必在第一个单元格中运行任何内容,您可以通过运行 dir()
来确认当前本地范围内的名称。
https://i.stack.imgur.com/wMR7T.png
编辑:
如果要将笔记本放在根目录下名为 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
python manage.py shell_plus --notebook
,导致错误 myproject module not found
并且笔记本无法正常工作,按照建议我从目录 python ../../manage.py shell_plus --notebook
运行笔记本并且一切正常现在很好 - 谢谢! @Imiguelvargasf
实际上,您(可能不需要)需要做所有这些废话。只需安装 django-extensions 并运行 jupyter!
(myprojectvenv)$ cd myproject
(myprojectvenv)$ pip install jupyter
(myprojectvenv)$ pip install django-extensions
(myprojectvenv)$ jupyter notebook
https://i.stack.imgur.com/FoCeQ.png
你应该很高兴。例如:
from myproject.models import Foobar
Foobar.objects.all()
pip install jupyter
中安装了 jupyter
以下对我使用 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 笔记本: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
现在你可以从例子开始,eg: from django.template import Template, Context template = Template('这个项目的名字是{{ projectName }}') context = Context({'projectName': 'MyJypyterDjangoSite'}) template .render(上下文)
虽然 RobM 接受的答案有效,但它并不像它可能的那样清楚,并且有一些不必要的步骤。简而言之,要从项目目录之外的笔记本环境中通过 Django 运行笔记本:
安装:
pip install django-extensions
将 'django-extensions'
添加到 settings.py
中的 INSTALLED_APPS
列表
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"
编辑为您的 Django 虚拟环境中 python 版本的完整地址。例如:"/Users/$USERNAME/Documents/PROJECT_FOLDER/venv/bin/python"
其次,在 "env"
字典中添加 "DJANGO_SETTINGS_MODULE": "mysite.settings",
,其中 mysite
是包含您的 Django 设置的文件夹。
(可选)更改 "display_name"
的值。
现在,当您从任何目录运行笔记本时,选择 "Django Shell-Plus"
内核将允许您的笔记本与 Django 交互。任何包(例如 pandas)都需要安装在 Django venv 中。
运行此命令。
PYTHONPATH=/path/to/project/root DJANGO_SETTINGS_MODULE=settings python manage.py shell_plus --notebook
我将在 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'
以便在 ./bin
目录中创建另一个名为 ipython
的脚本。我将 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 的启动器中明确列出
不定期副业成功案例分享
ipython
、jupyter
。您可以安装它们pip install ipython
、pip install jupyter
django-configurations
,请使用以确保正确:django-configurations.readthedocs.io/en/latest/cookbook/…python manage.py runserver
复制粘贴这些导入语句.然后他们可以使用模型而无需手动导入。