Вот мое взятие.
, Хотя происходя из точки зрения Java, я на самом деле предпочитаю REST. Конверт SOAP с несколькими пространствами имен и его сложной структурой является отвращением. Это пытается решить главным образом мнимые проблемы, и ничего не решает эффективно. Только вещь о SOAP, который я нашел полезными, состоит в том, что он имеет стандарты для авторизации и ошибок. С другой стороны, оба могли быть решены намного легче включением четырех стандартных атрибутов в корневом элементе XML - имя пользователя, пароль, errorCode, errorDescription.
Хорошее описание API и документация - действительно все, что имеет значение. Различие между REST и SOAP в зрелой платформе находится главным образом в нескольких строках конфигурации.
Для SOAP, отправьте хеш как часть безопасности SOAP; для REST мне нравится упаковывать все в полезной нагрузке и избегать HTTP-заголовков для аутентификации. У меня есть только субъективные причины, хотя, так как я должен был бороться с платформами, которые легко не представляют HTTP-заголовков.
Мое персональное предпочтение имеет различный URIs для различных версий протокола. По моему опыту, это дает Вам больше гибкости в более новых версиях, и старые клиенты, которые соединяются с неподдерживаемыми версиями протокола, прекращают работать сразу и по очевидным причинам. Кроме того, иногда можно отобразить старую версию приложения к старому URI, чтобы не иметь код поддержки прежней версии в новой серверной версии.
Что касается того, сколько времени Вы поддерживаете старую версию протокола... идеально, пока у Вас есть клиенты, которые используют его. Это - больше бизнеса, чем техническое решение. Необходимо поддерживать по крайней мере одну предыдущую версию протокола. Это обычно находится в Вашем интересе продвинуть клиенты к новой версии понижать затраты на поддержку прежней версии; с клиентской стороны новая версия должна означать новые возможности, лучший протокол и своего рода дополнительный бизнес-стимул (если одни только новые возможности недостаточно).
Я знаю на вопрос уже был дан ответ, но ...
Намного более простой подход - выгрузить данные модуля аутентификации в файл json после создания суперпользователя:
./manage.py dumpdata --indent=2 auth > initial_data.json
Вы также можете выгрузить данные сеансов:
./manage.py dumpdata --indent=2 sessions
Вы можете затем добавьте информацию о сеансе в дамп модуля аутентификации (и, возможно, увеличьте expire_date, чтобы он не истек ... никогда ;-).
С этого момента вы можете использовать
/manage.py syncdb --noinput
для загрузки суперпользователя и его сеанса при создании базы данных без интерактивного запроса о суперпользователе.
Мое решение состояло в том, чтобы просто не удалять эти таблицы аутентификации при стирании моей базы данных.
Взгляните на команду управления dumpdata
. Например:
python manage.py dumpdata > initial_data.json
Если этот файл, называемый прибором, имеет имя initial_data
(.xml или .json), то команда syncdb
выберет его и заполнит ваши таблицы соответствующим образом. . Он по-прежнему будет спрашивать вас, хотите ли вы создать пользователя, но я считаю, что вы можете спокойно ответить «нет»,
Вместо удаления всей базы данных просто удалите таблицы своего приложения перед запуском syncdb
Это выполнит это за вас в одной строке (для каждого приложения):
python manage.py sqlclear appname | python manage.py dbshell
Первая команда просмотрит ваше приложение и сгенерирует требуемый SQL для удаления таблиц. Этот вывод затем передается в dbshell для его выполнения.
После этого запустите вашу syncdb, чтобы воссоздать таблицы:
python manage.py syncdb
Если вы хотите, чтобы у вас была возможность - как и я - действительно начать со свежей базой данных, не задавая этот вопрос суперпользователя, то вы можете просто отменить регистрацию обработчика сигнала, который задает этот вопрос. Просмотрите самую нижнюю часть файла:
django/contrib/auth/management/__init__.py
, чтобы увидеть, как выполняется регистрация функции суперпользователя. Я обнаружил, что могу отменить эту регистрацию и никогда не получить вопрос во время "syncdb", если я поместил этот код в свой "models.py":
from django.db.models import signals
from django.contrib.auth.management import create_superuser
from django.contrib.auth import models as auth_app
# Prevent interactive question about wanting a superuser created. (This
# code has to go in this otherwise empty "models" module so that it gets
# processed by the "syncdb" command during database creation.)
signals.post_syncdb.disconnect(
create_superuser,
sender=auth_app,
dispatch_uid = "django.contrib.auth.management.create_superuser")
Я не уверен, как гарантировать запуск этого кода после кода Django, выполняющего регистрацию. Я думал, что это будет зависеть от того, будет ли ваше приложение или приложение django.contrib.auth упомянуто первым в INSTALLED_APPS, но, похоже, это работает для меня независимо от того, в каком порядке я их разместил. Может быть, они сделаны в алфавитном порядке, а я ' м повезло, что имя моего приложения начинается с буквы после "d"? Или Django достаточно умен, чтобы сначала делать свои собственные вещи, а затем мои на случай, если я захочу испортить их настройки? Дай мне знать, если узнаешь. : -)
Я использую sqlite в качестве базы данных для разработчиков. После изменения классов модели просто удалите соответствующие таблицы с помощью sqlite manager (плагин firefox, в любом случае открытый для проверки данных) и запустите manage.py syncdb
, чтобы воссоздать то, что отсутствует. ]