tutorial theme template superusuario password createsuperuser crear python django django-admin

python - theme - django-admin command



Cómo suprimir las advertencias de depreciación en Django? (12)

Actualmente me encuentro con este mismo problema cuando uso Django 1.8. En lugar de suprimir por completo esas advertencias, decidimos mostrarlas solo en el modo DEBUG.

Podemos agregar un controlador de consola en la configuración de registro y usar este controlador para capturar py.warnings. Aquí está el fragmento de código,

''filters'': { ''require_debug_true'': { ''()'': ''django.utils.log.RequireDebugTrue'' }, ... }, ''handlers'': { ''console'': { ''level'': ''DEBUG'', ''filters'': [''require_debug_true''], ''class'': ''logging.StreamHandler'', ''formatter'': ''standard'', }, ... }, ''loggers'': { ''py.warnings'': { ''handlers'': [''console'', ], ''level'': ''INFO'', ''propagate'': False }, ... }

El archivo completo de configuración de Django: https://github.com/haiwen/seahub/blob/21c827c68047e13700fe102d22a3f5515b22af89/seahub/settings.py#L484

Cada vez que uso el comando django-admin , incluso en TAB-completion, lanza un RemovedInDjango19Warning (y mucho más si utilizo el comando de prueba ). ¿Cómo puedo suprimir esas advertencias?

Estoy usando Django 1.8 con Python 3.4 (en un entorno virtual). Por lo que sé, todas esas advertencias provienen de bibliotecas, no de mi código.

Ejemplos

Aquí hay unos ejemplos:

  • …/lib/python3.4/importlib/_bootstrap.py:321: RemovedInDjango19Warning: django.contrib.contenttypes.generic is deprecated and will be removed in Django 1.9. Its contents have been moved to the fields, forms, and admin submodules of django.contrib.contenttypes. return f(*args, **kwds)

  • …/lib/python3.4/site-packages/django/contrib/admin/util.py:7: RemovedInDjango19Warning: The django.contrib.admin.util module has been renamed. Use django.contrib.admin.utils instead. "Use django.contrib.admin.utils instead.", RemovedInDjango19Warning)

  • …/lib/python3.4/site-packages/django/templatetags/future.py:25: RemovedInDjango19Warning: Loading the ``url`` tag from the ``future`` library is deprecated and will be removed in Django 1.9. Use the default ``url`` tag instead. RemovedInDjango19Warning)

Actualizar

Desde la versión 1.11 de Django ( notas de publicación ), las advertencias de desaprobación ya no son ruidosas por defecto. Así que supongo que esto ya no será un problema, ya que la versión 1.11 es la última versión compatible con Python 2 y también cuenta con soporte a largo plazo.


Agregar un filtro de registro a settings.py puede suprimir estas advertencias de consola (al menos para los comandos manage.py en Django 1.7, Python 3.4).

Un filtro puede suprimir advertencias de forma selectiva. El siguiente código crea un nuevo filtro "suppress_deprecated" para la consola y lo agrega a los filtros de registro predeterminados. Agregue este bloque a settings.py para configurar la variable LOGGING:

import logging, copy from django.utils.log import DEFAULT_LOGGING LOGGING = copy.deepcopy(DEFAULT_LOGGING) LOGGING[''filters''][''suppress_deprecated''] = { ''()'': ''mysite.settings.SuppressDeprecated'' } LOGGING[''handlers''][''console''][''filters''].append(''suppress_deprecated'') class SuppressDeprecated(logging.Filter): def filter(self, record): WARNINGS_TO_SUPPRESS = [ ''RemovedInDjango18Warning'', ''RemovedInDjango19Warning'' ] # Return false to suppress message. return not any([warn in record.getMessage() for warn in WARNINGS_TO_SUPPRESS])

La cadena ''mysite.settings.SuppressDeprecated'' debe cambiar si el módulo del sitio web raíz (o la ubicación y / o el nombre del filtro) es diferente.


Dejaré esto para los recién llegados:

En cuanto a django 1.11 advertencias obsoletas ya no son ruidosas por defecto. Para activarlos ejecute python -Wd manage.py runserver por ejemplo.

fuente


Django pone advertencias a través del módulo de advertencia de python estándar. Si su proyecto de Python arroja advertencias y son "aceptables" por el momento, solo use warnings.filterwarnings() o warnings.simplefilter() . No estoy seguro de dónde está el "mejor" lugar para estos, pero los he colocado en mi archivo common_settings.py (para mí, este es un archivo registrado que no se modifica, que es importado por local_settings.py).

P.ej:

warnings.filterwarnings(action="ignore", category=RemovedInDjango110Warning, module=''django.template.utils'', lineno=37)

Por desgracia, el comentario sobre silenciar las comprobaciones del sistema no funcionará aquí, ya que su ejemplo no arroja un error de comprobación del sistema.


En django 1.7, se introdujo una nueva configuración SILENCED_SYSTEM_CHECKS para suprimir las advertencias

Una lista de identificadores de mensajes generados por el marco de verificación del sistema (es decir, ["models.W001"]) que desea reconocer e ignorar permanentemente. Las advertencias silenciadas ya no se enviarán a la consola; Los errores silenciados se seguirán imprimiendo, pero no impedirán que se ejecuten los comandos de administración.

La documentación se puede encontrar aquí.

Aquí hay una lista de todos los controles para suprimir Ejemplo:

Si desea suprimir la advertencia TEMPLATES_ ,

Las configuraciones independientes de TEMPLATE_ * fueron desaprobadas en Django 1.8

su configuración sería:

SILENCED_SYSTEM_CHECKS = ["1_8.W001"]


En manage.py, agrégalo a la línea superior -

#!/usr/bin/env PYTHONWARNINGS=ignore python

Esto suprimirá todas las advertencias, lo que, en mi opinión, puede ser indeseable si está utilizando muchas bibliotecas de terceros.

Descargo de responsabilidad: recomendado solo después de que ya hayas visto las advertencias al menos 1,000 demasiadas veces, y debes eliminarlas cuando actualices Django.

Nota: esto puede tener algunos efectos indeseables en algunas plataformas, por ejemplo, tragar más resultados que solo advertencias.


Esta secuencia de comandos django estándar agrega TAB-finalización para usted bash - https://github.com/django/django/blob/master/extras/django_bash_completion

PYTHONWARNINGS no está definido - error en la consola. Agregue export PYTHONWARNINGS = "ignore" y anule PYTHONWARNINGS en _django_completion ()

Función original:

_django_completion() { COMPREPLY=( $( COMP_WORDS="${COMP_WORDS[*]}" / COMP_CWORD=$COMP_CWORD / DJANGO_AUTO_COMPLETE=1 $1 ) ) }

Mi version. No rompa el comportamiento básico en otros casos.

_django_completion() { export PYTHONWARNINGS="ignore" COMPREPLY=( $( COMP_WORDS="${COMP_WORDS[*]}" / COMP_CWORD=$COMP_CWORD / DJANGO_AUTO_COMPLETE=1 $1 ) ) unset PYTHONWARNINGS }


Mientras reviso las advertencias de desaprobación en otras dependencias de mi proyecto Django 1.8, usando

python -Wd manage.py runserver

, Pude filtrar las advertencias de desaprobación de Django agregando temporalmente

import warnings from django.utils.deprecation import RemovedInDjango110Warning warnings.filterwarnings(action="ignore", category=RemovedInDjango110Warning)

a mi settings.py (puede estar en cualquier módulo que se cargue al inicio). No pude averiguar cómo incluir el filtro como una opción extra -W , es decir,

python -Wd -Wi::RemovedInDjango110Warning manage.py runserver

resultó en una Invalid -W option ignored: unknown warning category: ''RemovedInDjango110Warning'' .


Nada de lo anterior ha funcionado para mí, Django 1.9. Arreglé esto agregando las siguientes líneas a settings.py:

import logging def filter_deprecation_warnings(record): warnings_to_suppress = [ ''RemovedInDjango110Warning'' ] # Return false to suppress message. return not any([warn in record.getMessage() for warn in warnings_to_suppress]) warn_logger = logging.getLogger(''py.warnings'') warn_logger.addFilter(filter_deprecation_warnings)


Para una solución de interfaz de línea de comandos rápida, el prefacio manage.py con python -W ignore cuando se ejecuta, como en:

python -W ignore manage.py runserver

-o-

python -W ignore manage.py shell_plus

-o-

python -W ignore manage.py makemigrations

Esto está funcionando para mí ahora, para suprimir todas las advertencias de eliminación de Django 1.10 mientras se ejecuta Django 1.9.


Por alguna razón, la solución provista por Fred Schleifer no me funcionó en Django 1.9, así que tuve que encontrar una solución diferente.

En settings.py , configuré una función LOGGING_CONFIG personalizada:

LOGGING_CONFIG = ''my_project.logging_utils.configure''

Luego my_project.logging_utils mi módulo my_project.logging_utils personalizado así:

from logging.config import dictConfig import warnings from django.utils.deprecation import RemovedInDjango110Warning IGNORE_DJANGO_110_WARNINGS = { # This is a specific warning raised by a third-party library. r''rest_framework_swagger/.urls'': r''django/.conf/.urls/.patterns/(/) is deprecated.*'' } def configure(settings): dictConfig(settings) for module, message in IGNORE_DJANGO_110_WARNINGS.items(): warnings.filterwarnings( action=''ignore'', category=RemovedInDjango110Warning, module=module, message=message )

El IGNORE_DJANGO_110_WARNINGS contiene un mapeo desde los nombres de los módulos hasta las expresiones regulares de las advertencias que IGNORE_DJANGO_110_WARNINGS . Elegí ser muy específico en el tipo de advertencias que suprimí, ya que todavía quería ver algunas que no esperaba. A medida que se actualicen las bibliotecas individuales de terceros, eliminaré sus entradas asociadas del dict.


# in settings.py import warnings from django.utils.deprecation import RemovedInDjango20Warning DEBUG = True if DEBUG: warnings.simplefilter(''default'') warnings.filterwarnings(''ignore'', category=RemovedInDjango20Warning) # use it if you annoyed by DeprecationWarning warnings.filterwarnings(''ignore'', category=DeprecationWarning)