Документация Python для django.views.generic с помощью pydoc

Когда я запускаю команду:

pydoc django.views.generic

Я получаю ошибку:

problem in django.views.generic - 
<class 'django.core.exceptions.ImproperlyConfigured'>:
Requested setting DEFAULT_INDEX_TABLESPACE, 
but settings are not configured. You must either define 
the environment variable DJANGO_SETTINGS_MODULE or call 
settings.configure() before accessing settings

Как я могу получить документацию по pydoc для django.views.generic?

2 ответа

Решение

Импорт многих модулей Django включает другие модули, которые зависят от среды проекта Django. Создайте фиктивный проект и используйте его настройки.

$ django-admin.py startproject dummy
$ cd ./dummy
$ DJANGO_SETTINGS_MODULE=dummy.settings pydoc django.views.generic

Обратите внимание на последнюю строку, которая устанавливает env var DJANGO_SETTINGS_MODULE к пути импорта файла settings.py. Обычно вам это не нужно, так как manage.py и wsgi.py настроили это для вас, но pydoc ничего не знает об этом.

Если у вас уже есть проект, вы, очевидно, можете пропустить фиктивный проект и просто использовать настройки вашего проекта.


При использовании более новых версий Django вам также необходимо позвонить django.setup() прежде чем Джанго, как правило, можно использовать. Для этого оберните pydoc в скрипт, а не вызывайте pydoc напрямую.

my_pydoc.py

import django
import pydoc
import os

os.environ['DJANGO_SETTINGS_MODULE'] = 'dummy.settings'
django.setup()
pydoc.cli()
python my_pydoc.py django.views.generic

Хотя davidism работает для некоторых вещей, он не будет работать для моих собственных приложений, так как я получил AppRegistryNotReady исключение. Я обнаружил, что мне нужно сделать некоторую рекламу в файлах приложения, чтобы она заработала:

import sys
importer = sys.modules['__main__'].__spec__
if importer.name == 'pydoc':
    import django
    django.setup()

Источник

Наконец это работает, по крайней мере, для views.py, Другие файлы могут нуждаться в других решениях. Это кажется хрупким и зависит от версии, но это работает для Django 1.10.2 и Python 3.5.2.


sys.argv[0] имеет ту же информацию, /usr/lib/python3.5/pydoc.pyТаким образом, это может быть выполнено более просто и надежно:

import sys, os
if os.path.splitext(os.path.basename(sys.argv[0]))[0] == 'pydoc':
    import django
    django.setup()
Другие вопросы по тегам