2016-08-23 3 views
3

Я пытаюсь настроить простой API с помощью Django Rest Framework, проблема в том, что у моего API нет базы данных, но структура не будет работать без настройки базы данных.Django Rest Framework без базы данных

Вот моя конфигурация Django Framework Rest в settings.py:

INSTALLED_APPS = [ 
    'provider', 
    'django_nose', 
    'rest_framework', 
    'django.contrib.contenttypes', 
] 

REST_FRAMEWORK = { 
    'DEFAULT_AUTHENTICATION_CLASSES': [], 
    'DEFAULT_PERMISSION_CLASSES': [], 
} 

ошибка, которую я получил это: "settings.DATABASES настроен неправильно "

ImproperlyConfigured (django.core. exceptions.ImproperlyConfigured: settings.DATABASES неправильно настроен. Пожалуйста, поставьте значение ДВИГАТЕЛЯ. Для получения более подробной информации проверьте настройки .

Есть ли минимальные настройки, которые не включают django.contrib.contenttypes и django.contrib.auth?

+0

Когда вы получите эту ошибку? Зачем вам приложение contenttypes? – Linovia

+0

Обратите внимание, что у меня есть API, который не использует БД и не сталкивался с этой проблемой. – Linovia

+0

@Linovia Мне не нужно приложение contenttypes и приложение auth, но они не будут работать без них. Можете ли вы опубликовать минимальные настройки среды django rest, которые не имеют никакой базы данных и будут использоваться только как API? – kahrabian

ответ

4

Фактическая причина проблемы заключается в том, что DRF пытается добавить атрибут user к request. Кратко упоминается в документации, механизм выглядит следующим образом:

How authentication is determined

Если класс не проверяет подлинность, request.user будет установлен на экземпляр django.contrib.auth.models.AnonymousUser

Так что необходима django.contrib.auth приложение работает правильно, поэтому django.contrib.auth требует рабочей конфигурации базы данных для выполнения.

Решение этой проблемы заключается в том, чтобы установить параметры UNAUTHENTICATED_USER на None.

конфигурация будет выглядеть следующим после изменения:

INSTALLED_APPS = [ 
    'provider', 
    'django_nose', 
    'rest_framework', 
] 

REST_FRAMEWORK = { 
    'DEFAULT_AUTHENTICATION_CLASSES': [], 
    'DEFAULT_PERMISSION_CLASSES': [], 
    'UNAUTHENTICATED_USER': None, 
} 
1

У вас нет опции. DATABASES dict должен быть в settings.py. Вы можете использовать это:

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.sqlite3', 
     'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 
    } 
} 
+0

Я пытаюсь настроить API без какой-либо базы данных, даже размером с sqlite :) – kahrabian

+0

Почему? Есть ли причина для этого? – turkus

+0

Это избыточно, для него не будет другого использования. – kahrabian

-1

[не проверено] возможно, вы могли бы использовать фиктивный бэкэнд. Я вижу, что есть один из Джанго:

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.dummy', 
    } 
} 
+0

ahhh hmm или, может быть, нет .. https://github.com/django/django/blob/master/django/db/backends/dummy/base.py это на самом деле то, что он жалуется, вы могли бы, вероятно, создать такое, просто «пройдите» вместо того, чтобы поднимать исключение .. кто знает, что это может сработать – pleasedontbelong

5

Если вы действительно вынуждены использовать базу данных, но вы не хотите, вы можете использовать :memory: с SQLite бэкэнда, как это:

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.sqlite3', 
     'NAME': ':memory:', 
    } 
} 

Это использует базу данных в памяти, так что ваша файловая система не будет затронута.

Поскольку память изменчивая, вам может потребоваться автоматическая миграция при каждом запуске веб-приложения.

+1

Можете ли вы описать больше? – kahrabian

+0

Короче говоря, вместо использования дискового пространства на сервере вы будете использовать ОЗУ. Вот и все. Однако нет необходимости в этом. Некоторые предложили использовать файл, и вам не нужно будет его использовать. Вы можете использовать этот параметр, чтобы не видеть sqlite-файл, и он будет удален после завершения. Оба варианта хороши. –

Смежные вопросы