J'ai un site Django qui fonctionne sur mon PC et fonctionnait brièvement sur mon serveur après l'avoir chargé. J'ai remarqué que mon serveur avait Django 1.6 et je mis à niveau vers 1.8.
Après le redémarrage, aucune des pages de mon site ne se charge et j'obtiens l'erreur:
ImportError Aucun module nommé context_processors
J'ai lu les documents sur Django et allauth. Django mentionne qu'en 1.8 les context_processors se sont déplacés et allauth dit que des balises allauth spécifiques ne sont plus nécessaires dans le TEMPLATE_CONTEXT_PROCESSORS
de settings.py
.
Django: https://docs.djangoproject.com/en/1.8/ref/settings/
Allauth: https://Django-allauth.readthedocs.org/en/latest/installation.html
Quelqu'un d'autre a rencontré ça? Suis-je sur la bonne voie? Dois-je changer quelque chose dans les paramètres? Je ne peux pas vraiment dire si c'est un problème Django ou allauth donc je ne sais pas par où commencer.
Toute aide est appréciée!
Traceback:
Django Version: 1.8.4
Python Version: 2.7.6
Installed Applications:
('Django.contrib.admin',
'Django.contrib.auth',
'Django.contrib.contenttypes',
'Django.contrib.sessions',
'Django.contrib.messages',
'Django.contrib.staticfiles',
'plant',
'journal',
'userimg',
'Django.contrib.sites',
'allauth',
'allauth.account')
Installed Middleware:
('Django.contrib.sessions.middleware.SessionMiddleware',
'Django.middleware.common.CommonMiddleware',
'Django.middleware.csrf.CsrfViewMiddleware',
'Django.contrib.auth.middleware.AuthenticationMiddleware',
'Django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'Django.contrib.messages.middleware.MessageMiddleware',
'Django.middleware.clickjacking.XFrameOptionsMiddleware')
Traceback:
File "/usr/local/lib/python2.7/dist-packages/Django-1.8.4-py2.7.Egg/Django/core/handlers/base.py" in get_response
132. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/Django/django_project/plant/views.py" in plant_main
24. return render(request, 'plant/plant_main.html', context)
File "/usr/local/lib/python2.7/dist-packages/Django-1.8.4-py2.7.Egg/Django/shortcuts.py" in render
67. template_name, context, request=request, using=using)
File "/usr/local/lib/python2.7/dist-packages/Django-1.8.4-py2.7.Egg/Django/template/loader.py" in render_to_string
99. return template.render(context, request)
File "/usr/local/lib/python2.7/dist-packages/Django-1.8.4-py2.7.Egg/Django/template/backends/Django.py" in render
74. return self.template.render(context)
File "/usr/local/lib/python2.7/dist-packages/Django-1.8.4-py2.7.Egg/Django/template/base.py" in render
208. with context.bind_template(self):
File "/usr/lib/python2.7/contextlib.py" in __enter__
17. return self.gen.next()
File "/usr/local/lib/python2.7/dist-packages/Django-1.8.4-py2.7.Egg/Django/template/context.py" in bind_template
237. processors = (template.engine.template_context_processors +
File "/usr/local/lib/python2.7/dist-packages/Django-1.8.4-py2.7.Egg/Django/utils/functional.py" in __get__
60. res = instance.__dict__[self.name] = self.func(instance)
File "/usr/local/lib/python2.7/dist-packages/Django-1.8.4-py2.7.Egg/Django/template/engine.py" in template_context_processors
90. return Tuple(import_string(path) for path in context_processors)
File "/usr/local/lib/python2.7/dist-packages/Django-1.8.4-py2.7.Egg/Django/template/engine.py" in <genexpr>
90. return Tuple(import_string(path) for path in context_processors)
File "/usr/local/lib/python2.7/dist-packages/Django-1.8.4-py2.7.Egg/Django/utils/module_loading.py" in import_string
26. module = import_module(module_path)
File "/usr/lib/python2.7/importlib/__init__.py" in import_module
37. __import__(name)
Exception Type: ImportError at /plant/
Exception Value: No module named context_processors
Le problème était que je n'avais aucun paramètre TEMPLATES dans settings.py comme requis après la mise à niveau vers Django 1.8. Je ne sais pas vraiment pourquoi cela fonctionnait sur mon PC en utilisant le Django.
À partir des documents allauth, j'ai collé cela dans mon fichier de paramètres:
TEMPLATES = [
{
'BACKEND': 'Django.template.backends.Django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
# Already defined Django-related contexts here
# `allauth` needs this from Django
'Django.template.context_processors.request',
],
},
},
]
Et copié le contenu de mon ancien TEMPLATE_DIRS
définition dans la définition DIRS des MODÈLES. Le résultat final ressemble à ceci:
TEMPLATES = [
{
'BACKEND': 'Django.template.backends.Django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
# Already defined Django-related contexts here
# `allauth` needs this from Django
'Django.template.context_processors.request',
],
},
},
]
Selon la documentation d'une récente mise à jour allauth, context_processors
doit maintenant être spécifié dans le paramètre TEMPLATES et non TEMPLATE_CONTEXT_PROCESSORS
réglage.
Merci à Joey Wilhelm de m'avoir indiqué dans la bonne direction à ce sujet.
J'ai rencontré le même problème mais je passe de 1.9.1 à 1.10. J'ai trouvé qu'il y avait une petite différence dans les paramètres.
Ceci est le code de 1.9.1
TEMPLATES = [
{
'BACKEND': 'Django.template.backends.Django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'Django.template.context_processors.debug',
'Django.template.context_processors.request',
'Django.core.context_processors.request',
'Django.contrib.auth.context_processors.auth',
'Django.contrib.messages.context_processors.messages',
],
},
},
]
Ceci est le code pour 1.10
TEMPLATES = [
{
'BACKEND': 'Django.template.backends.Django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'Django.template.context_processors.debug',
'Django.template.context_processors.request',
'Django.contrib.auth.context_processors.auth',
'Django.contrib.messages.context_processors.messages',
],
},
},
]
La ligne Django.core.context_processors.request
n'est pas valide en 1.10. Supprimez-le et le code fonctionne bien.
Juste un conseil: lorsqu'un retraçage ne vous fournit pas les informations dont vous avez besoin pour identifier la ligne de code exacte; Il peut être utile d'activer le mode DEBUG
et d'ouvrir la page dans le navigateur. Il y a ce merveilleux petit local_vars
élément, où vous pouvez voir l'état de la variable locale lorsque le retraçage se produit. Cela peut être super pratique!
(Dans mon cas, c'était lié à des changements dans allauth)
Dans mon cas, j'ai dû supprimer la ligne suivante dans settings.py:
'Django.core.context_processors.csrf',
J'ai redémarré le serveur et je n'ai plus vu cette erreur par la suite.
Maintenant, c'est la source mise à jour: https://docs.djangoproject.com/en/1.11/ref/templates/upgrading/
TEMPLATES = [
{
'BACKEND': 'Django.template.backends.Django.DjangoTemplates',
'DIRS': [
# insert your TEMPLATE_DIRS here
],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
# Insert your TEMPLATE_CONTEXT_PROCESSORS here or use this
# list if you haven't customized them:
'Django.contrib.auth.context_processors.auth',
'Django.template.context_processors.debug',
'Django.template.context_processors.i18n',
'Django.template.context_processors.media',
'Django.template.context_processors.static',
'Django.template.context_processors.tz',
'Django.contrib.messages.context_processors.messages',
],
},
},
]