Mostrando entradas con la etiqueta django. Mostrar todas las entradas
Mostrando entradas con la etiqueta django. Mostrar todas las entradas

martes, 6 de agosto de 2019

Django ipdb with docker-compose

Algunas veces necesitamos hacer debug sobre una aplicación corriendo en Django en docker-compose. Por defecto ipdb.set_trace() o breakpoint() no funciona, para hacerlo funcionar debemos hacer lo siguiente:

Para habilitar el modo interactivo debemos añadir stdin_open y tty al docker-compose.yml.

Por ejemplo:
version: "3"
services:
  app_tests:
    build: .
    stdin_open: true
    tty: true
    command: ./run_my_tests.sh

Ahora cuando corras tests con tu máquina en docker-compose se va a detener al momento que encuentre un ipdb.set_trace() o breakpoint()
Como ultimo paso solo falta usar el comando de docker attach <container id> con esto estaremos conectados al proceso que corre dentro del contenedor y podremos interactuar con el proceso.

Nota:
Si queremos obtener el id del contenedor debemos correr docker ps
Si queremos desconectarnos del contenedor sin detenerlo debemos usar Ctrl+pCtrl+q

martes, 23 de diciembre de 2014

Django PostgreSQL Idle in Transaction

Es u problema muy común en los sitos que corren django y PostgreSql que allá conexiones que queden en "Idle in Transaction" Son producto de transacciones sin cerrar o esperando commit o roolback.

Este tipo de problema tiene dos posibles momentos en los que sucede esto. Uno es a la hora de hacer responder peticiones y otra es a la hora de señales de django que se ejecutan al cargar un modelo.

Para cuando las consultas queda abiertas al hacer peticiones, django trae consigo TransactionMiddleware, al añadir al final 'django.middleware.transaction.TransactionMiddleware' a MIDDLEWARE_CLASSES debería solucionarse de manera definitiva el problema.

En el otro caso me sucedió en un sistema, que estaba ejecutado una consulta en class_prepared.connect. Y dejaba u proceso abierto que evitaba que el resto de las consultas se ejecutara. ¿Solución? Estas dos lineas de código y listo:


from django.db import connection
#cierro la ejecución despues de terminar de ejecutar las cosultas
connection.close()

sábado, 29 de noviembre de 2014

Django models añadir permisos para ver a todos. (view_*)

Algo muy común que se usa en Django son los permisos de modelo para controlar quien puede objetos particulares. Django provee permisos por defectos en todos los modelos, crear, editar y eliminar.

Hay varias formas de agregar este permiso de "ver" en la web, pero la forma más sencilla que yo e visto es hacerlo en "post_syncdb". Cuando uses el comando syncdb, todos los modelos de tu sistema se chequeara si tienen el permiso view y si no se los creara.

Solo tienes que poner el siguiente script en el __init.py en el directorio de management/ de cualquiera de tus aplicaciones. Necesita estar dentro de un directorio de management o si no, no sera descubierto por el comando syncdb.

from django.db.models.signals import post_syncdb
from django.contrib.contenttypes.models import ContentType
from django.contrib.auth.models import Permission
 
def add_view_permissions(sender, **kwargs):
    """
    This syncdb hooks takes care of adding a view permission too all our 
    content types.
    """
    # for each of our content types
    for content_type in ContentType.objects.all():
        # build our permission slug
        codename = "view_%s" % content_type.model
 
        # if it doesn't exist..
        if not Permission.objects.filter(content_type=content_type, codename=codename):
            # add it
            Permission.objects.create(content_type=content_type,
                                      codename=codename,
                                      name="Can view %s" % content_type.name)
            print "Added view permission for %s" % content_type.name
 
# check for all our view permissions after a syncdb
post_syncdb.connect(add_view_permissions)

miércoles, 29 de octubre de 2014

Añadir nuevos permisos a los modelos en DJANGO

Un problema muy común cuando empezamos a trabajar con permisos y autenticación en DJANGO es que empezamos a añadir permisos propios a los modelos y el migrate de south no lo reconoce y el syncdb tampoco. Como en este ejemplo:


class T21Turma(models.Model):
 class Meta:
 permissions = (("can_view_boletim", "Can view boletim"),
 ("can_view_mensalidades", "Can view mensalidades"),)


Para obligar que el sistema lo agregue simplemente hay que hacer:

python manage.py syncdb --all

Espero que les sirva, a mi me funciono.