2011-01-17 3 views
2

Как установить фрагменты в django? (В частности, this)установка фрагментов

У меня есть файл /{project}/snippets/EnforceLoginMiddleware.py и я попытался любое количество перестановок внутри MIDDLEWARE_CLASSES, чтобы загрузить его, а также прибегая к помощи django snippets install но безрезультатно :(

Любая помощь будет признателен :)

PS (Почему я не могу найти какую-либо документацию или примеры по установке фрагментов. может быть, я просто плохой Googler)

ответ

5

«snippets» не указывает на определенный элемент Django, это просто означает: вот фрагмент кода для вас. В этом случае это промежуточное ПО, специальный модуль Django, который будет вызываться до и после веб-запроса. Read django docs при необходимости

Я использую это промежуточное программное обеспечение тоже просто вставить все в файле с именем middleware.py в основной папке приложения (любая папка приложения будет делать, учитывая это приложение упоминается в INSTALLED_APPS)

Затем добавьте эти строки в ваш settings.py файл:

MIDDLEWARE_CLASSES = (
    #...all others middleware, on the last line, paste : 
    'main.middleware.EnforceLoginMiddleware', 
) 

Обратите внимание, что здесь приложение, где я положил файл называется main, ваш может быть назван по-разному.

Не забудьте прочитать строку документации из сниппета:

Middlware class which requires the user to be authenticated for all urls except 
those defined in PUBLIC_URLS in settings.py. PUBLIC_URLS should be a tuple of regular 
expresssions for the urls you want anonymous users to have access to. If PUBLIC_URLS 
is not defined, it falls back to LOGIN_URL or failing that '/accounts/login/'. 
Requests for urls not matching PUBLIC_URLS get redirected to LOGIN_URL with next set 
to original path of the unauthenticted request. 
Any urls statically served by django are excluded from this check. To enforce the same 
validation on these set SERVE_STATIC_TO_PUBLIC to False. 
+0

Большое спасибо! – Sevenearths

1

в вашем примере ваша новая записи в MIDDLEWARE_CLASSES бы л ook like '{project} .snippets.EnforceLoginMiddleware.EnforceLoginMiddleware' (замените его именем пакета для вашего проекта).

Убедитесь, что в папке с отпечатками также есть файл __init__.py!

P.S .: Возможно, это связано с тем, что в Django нет таких вещей, как «фрагмент», когда дело доходит до официальных компонентов Django. Они обычно являются простыми фрагментами кода Python и должны рассматриваться как таковые. Djangosnippets - это просто сайт, на котором вы можете публиковать и делиться кодом django (также называемым фрагментами).

2

Вы должны убедиться, что ваш фрагмент кода на вашем PYTHONPATH (sys.path) или, что фрагмент находится в модуле, который существует на вашем PYTHONPATH.

В этом случае, если вы добавите файл __init__.py в свою папку с отрывками, это будет обрабатывать папку фрагментов как модуль, а затем вы можете сделать from snippets.EnforceLoginMiddleware import EnforceLoginMiddleware. Я думаю, что это решающий шаг, который вам не хватает.

Ваши классы промежуточного слоя будет выглядеть:

MIDDLEWARE_CLASSES = (..., 'snippets.EnforceLoginMiddleware.EnforceLoginMiddleware') 
+0

Спасибо. Ваше право, но я решил включить модуль в основной файл 'middleware.py' в корень каталога проекта, так как он будет применяться к системе – Sevenearths

+1

@Sevenearths, и это точно, где это должно быть слишком. У меня возникла проблема с тем, как сначала включить файлы из произвольных каталогов. Грохочетные модули и PYTHONPATH могут сбивать с толку вначале. –