我一直在使用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()
答案 0 :(得分:47)
从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
改为适合,并在第一个单元格中运行
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()
答案 1 :(得分:10)
这里有什么对我有用
pip install jupyter
mkdir notebooks
cd notebooks
../manage.py shell_plus --notebook
AND ,重要的是,没有的工作是从笔记本环境中更改目录。如果我尝试使用任何不在manage.py shell_plus --notebook
运行目录中的笔记本,那么核心配置不正确。对我来说,一次只为一个目录配置笔记本就足够了。
例如,在您的docker撰写文件中;
ports:
- "8890:8888"
这就是我所做的:
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”:
你应该好好去。例如:
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,我们需要:
"env": {
"DJANGO_SETTINGS_MODULE": "my_project.settings",
"PYTHONPATH": "$PYTHONPATH:/home/projectuser/projectfolder/my_project"
}
编辑此环境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项目,而您的当前工作目录是该项目的根目录。
安装jupyter
使用点
pip install jupyter
使用pipenv
pipenv install jupyter
安装django-extentions
使用点
pip install django-extensions
使用pipenv
pipenv install django-extensions
通过将django-extensions
添加到Django项目INSTALLED_APPS
文件的settings.py
设置中来进行设置。:
INSTALLED_APPS = (
...
'django_extensions',
)
运行django-extensions
中的shell_plus
管理命令。使用选项--notebook
启动笔记本:
python manage.py shell_plus --notebook
Jupyter Notebooks将在您的浏览器中自动打开。
启动新的Django Shell-Plus笔记本
就是这样!
同样,您不必在第一个单元格中运行任何内容,并且可以通过运行dir()
来查看当前本地作用域中的名称来佐证。
如果要将笔记本放在根目录的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:
安装 Django 并安装 django-extensions :
pip install Django
pip install django-extensions
启动一个新的Django项目。您必须在目录树的那部分中执行此操作,以后可以由Jupyter访问。
django-admin startproject _myDjangoProject_
启动Jypter
输入并运行以下代码:
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