2012-08-14 16 views
5

Estoy implementando un proyecto web realmente liviano, que tiene solo una página, mostrando los datos en un diagrama. Yo uso Django como un servidor web y d3.js como trazado de rutina para este diagrama. Como se puede imaginar, hay solo algunas series de tiempo simples que tienen que ser respondidas por el servidor Django, entonces me preguntaba si simplemente podría mantener esta variable en RAM. Mi primera prueba fue positiva, tuve algo como esto en mi views.py:django vars en ram

X = np.array([123,23,1,32,123,1]) 

@csrf_exempt 
def getGraph(request): 
    global X 
    return HttpResponse(json.dumps(X)) 

Aviso, X se actualiza por otra función de vez en cuando, pero todos los accesos de usuario es de sólo lectura. ¿Tengo que tratar con

  1. problemas de seguridad mediante la definición de una variable global?
  2. inconsistencias en general?

Encontré a thread discutiendo variables globales en Django, pero en ese caso, la dificultad es manejar el acceso de escritura múltiple.

Para responder a posibles preguntas sobre por qué no quiero almacenar datos en la base de datos: todos los datos que obtuve en mi X ya están almacenados en una enorme base de datos remota y esta aplicación web solo necesita mostrar datos.

Respuesta

2

Almacenarlo en una variable sí tiene implicaciones de subprocesamiento (y también escalabilidad, ¿qué pasa si tienes dos servidores Django ejecutando la misma aplicación?). El consejo de la comunidad de Django es no!

Sin embargo, esto suena como una buena opción para el sistema de caché Django. Simplemente guarde en caché su vista getGraph con @cache_page y el trabajo estará listo. No es necesario utilizar Memcache, la caché-backend incorporada en la memoria-caché-backend * funcionará bien. Ponga un número muy alto como el tiempo de espera en el caché (años).

De esta manera está almacenando la respuesta HTTP (JSON) no el valor de X. Pero desde su código de muestra, eso no es un problema. Si necesita volver a calcular X que es necesario volver a calcular el JSON, y si es necesario volver a calcular el JSON que tendrá que volver a calcular X.

https://docs.djangoproject.com/en/dev/topics/cache/?from=olddocs/


o simplemente 'back-end de memoria incorporado', no pude resistirme

+0

Como miembro de la comunidad de Django, no necesariamente diría "no". He hecho algunas cosas muy similares. Pero +1 para el backend de caché, es una forma mucho mejor de resolver este problema. –

+1

@Joe Intenté esto y funciona bien con las solicitudes HTTP normales, pero cuando lo llamo mediante 'AJAX' no se almacena en caché. Supongo que Django considera que cada solicitud de 'AJAX' es diferente a la anterior y calcula 'X' nuevamente. ¿Cómo lidiar con eso? Pero gracias, una vez más por recomendar el sistema de caché Django, parece ser bastante más elegante que los vars globales –

+1

¡no importa! Lo resolví usando 'La API de caché de bajo nivel'. Es simplemente perfecto. Muchas gracias –