Как изменить настройки Django на основе текущего запроса? - PullRequest
4 голосов
/ 31 мая 2011

Я управляю несколькими сайтами из одного экземпляра django и ожидаю, что инфраструктура в конечном итоге будет обслуживать несколько сотен сайтов из одной или нескольких установок.

Мне нужно пропатчить некоторые настройки django на основе текущего запроса.Я написал некоторое промежуточное программное обеспечение, чтобы обезьяна исправила настройки, но мне нужно, чтобы эти параметры были исправлены до того, как промежуточное программное обеспечение будет вызвано, потому что другие приложения не принимают внесенные мартовскими изменениями (т. Е. Приложения запускаются, а промежуточное программное обеспечение запускается, поэтому приложения не работают).не используйте настройки, пропатченные обезьянами).

Я должен также добавить, что это в основном для сторонних приложений, которые я не написал, так что я не хочу идти дальше, добавляя декораторы иличто-нибудь подобное, потому что это испортит мой путь обновления.

Итак:

  • Как я могу получить доступ к текущему запросу в init .py приложения?file?
  • Будет ли приложение init .py вызываться один раз за запрос или только один раз?Если это только один раз, как еще я могу сделать это, чтобы я мог манипулировать настройками один раз для каждого запроса?
  • Безопасно ли делать такое исправление обезьян?Я знаю, что это делает код немного более непрозрачным, но я не хочу использовать разные wsgi-файлы для каждого сайта, потому что я хочу позволить пользователям редактировать некоторые из этих настроек и получать мои исправления для обезьян из базы данных.
  • Есть ли лучшее решение, которое позволило бы сохранять определенные настройки в базе данных?

Ответы [ 4 ]

5 голосов
/ 25 июля 2011

Этот модуль - django-tupperware делает то, о чем вы спрашиваете: https://bitbucket.org/jiaaro/django-tupperware/ Попробуйте.

1 голос
/ 31 мая 2011

Если вы действительно хотите иметь сотни сайтов, которые будут динамически реконфигурироваться все время, вы можете попробовать Djangos django / conf / __ init __. Py , который используется для предоставления настроек остальным рамки. Вы можете изменить его так, как это зависит от запроса и его поля Host. Или, по крайней мере, вы получите много интересных неудач.

1 голос
/ 31 мая 2011

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

0 голосов
/ 05 февраля 2013

Мое решение этой проблемы - давать каждый запрос, ВСЕ настройки и обновлять их на лету с помощью промежуточного программного обеспечения, как мне это сделать? Это довольно просто: Это промежуточное ПО, которое делает все это

from django.conf import settings

class DumpObject: pass

class Settings(object):
    def process_request(self,request):
        request.settings = DumpObject()
        for setting in dir(settings):
            if not setting.startswith('__'):
                setattr(request.settings, setting, getattr(settings,setting))

DumpObject как раз там, так что я могу использовать нотацию object.property, это мог быть словарь, но я хотел сохранить некоторое сходство в синтаксисе. Это предполагает, что ни одно из ваших имен настроек не начинается с __, что является правильным предположением. Поэтому, если я хочу переопределить определенный параметр, я не сохраняю файл настроек, я делаю это в этом промежуточном программном обеспечении. как это:

class Settings(object):
    def process_request(self,request):
        request.settings = DumpObject()
        for setting in dir(settings):
            if not setting.startswith('__'):
                setattr(request.settings, setting, getattr(settings,setting))

         if 'mydomain' in str(request.host): #this is thanks to django-hosts project
            request.settings.GOOGLE_ANALYTICS_ID = '89298393-238'

Конечно, это не учитывает проблему доступа к настройкам по-старому из django.conf настройки импорта

settings.GOOGLE_ANALYTICS_ID = 'the value in settings.py'

Но это действительно не имеет значения, потому что вы, вероятно, захотите изменить настройки только в контексте наличия доступного объекта запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...