Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

820
Visualizações
¿Cómo registrar solicitudes y respuestas en Django?

¿Cómo puedo registrar todas mis solicitudes y respuestas (encabezados y cuerpo) en Django usando un middleware? Estoy usando Django 2.2 con Django rest framework, por lo que a veces las solicitudes y respuestas son del tipo original de Django, a veces de drf. La aplicación se sirve detrás de gunicorn. Desarrollé un middleware, pero el principal problema es que no puedo leer el cuerpo de la solicitud dos veces porque me da un error.

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Este es un ejemplo de registro de solicitudes en la base de datos.

Nota : Esto llegará a la base de datos una vez más con cada solicitud. Por lo tanto, ralentizará el tiempo de respuesta.

modelos.py

 class Request(models.Model): endpoint = models.CharField(max_length=100, null=True) # The url the user requested user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True) # User that made request, if authenticated response_code = models.PositiveSmallIntegerField() # Response status code method = models.CharField(max_length=10, null=True) # Request method remote_address = models.CharField(max_length=20, null=True) # IP address of user exec_time = models.IntegerField(null=True) # Time taken to create the response date = models.DateTimeField(auto_now=True) # Date and time of request body_response = models.TextField() # Response data body_request = models.TextField() # Request data

middleware.py

 class SaveRequest: def __init__(self, get_response): self.get_response = get_response # Filter to log all request to url's that start with any of the strings below. # With example below: # /example/test/ will be logged. # /other/ will not be logged. self.prefixs = [ '/example' ] def __call__(self, request): _t = time.time() # Calculated execution time. response = self.get_response(request) # Get response from view function. _t = int((time.time() - _t)*1000) # If the url does not start with on of the prefixes above, then return response and dont save log. # (Remove these two lines below to log everything) if not list(filter(request.get_full_path().startswith, self.prefixs)): return response # Create instance of our model and assign values request_log = Request( endpoint=request.get_full_path(), response_code=response.status_code, method=request.method, remote_address=self.get_client_ip(request), exec_time=_t, body_response=str(response.content), body_request=str(request.body) ) # Assign user to log if it's not an anonymous user if not request.user.is_anonymous: request_log.user = request.user # Save log in db request_log.save() return response # get clients ip address def get_client_ip(self, request): x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR') if x_forwarded_for: _ip = x_forwarded_for.split(',')[0] else: _ip = request.META.get('REMOTE_ADDR') return _ip

configuración.py

 # Activate the middleware in settings.py like this. MIDDLEWARE = [ ... # Django default middleware '<your_appname>.middleware.SaveRequest' ]
over 4 years ago · Santiago Trujillo Relatório

0

Originalmente traté de hacer algo como request = copy.copy(request) pero claramente es un error porque la copia superficial no copia objetos anidados. Entonces, el enfoque correcto es ( __call__ es el método de instancia de clase de middleware):

 def __call__(self, request): request_body = copy.copy(request.body) # Here goes more code for further processing # and now I can safely use request_body before or after # the view code runs

Actualizar

Como sugirió Felix Eklöf , también puede usar str(request.body) y python se encargará de copiar el contenido del cuerpo, porque las cadenas son inmutables en python. (Supongo que tiene mejor legibilidad también).

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda