sesiones manejo las funcionan ejemplos control como _cookie r shiny shiny-server

r - manejo - sesiones en php



¿Cómo funcionan las sesiones en el servidor brillante? (1)

Bueno, para comenzar con un objeto de sesión brillante hay una estructura de datos específica (''R6'') en elementos brillantes, hechos de elementos públicos y privados. Su propósito es registrar una instancia de la relación entre un usuario y brillante (más sobre esto más adelante).

>str(session) Classes ''ShinySession'', ''R6'' <ShinySession> Public: @uploadEnd: function (jobId, inputId) @uploadieFinish: function () @uploadInit: function (fileInfos) allowReconnect: function (value) clientData: reactivevalues clone: function (deep = FALSE) close: function () closed: FALSE decrementBusyCount: function () defineOutput: function (name, func, label) dispatch: function (msg) doBookmark: function () downloads: Map, R6 exportTestValues: function (..., quoted_ = FALSE, env_ = parent.frame()) files: Map, R6 fileUrl: function (name, file, contentType = "application/octet-stream") flushOutput: function () freezeValue: function (x, name) getBookmarkExclude: function () getTestEndpointUrl: function (inputs = TRUE, outputs = TRUE, exports = TRUE, format = "rds") groups: NULL handleRequest: function (req) incrementBusyCount: function () initialize: function (websocket) input: reactivevalues isClosed: function () isEnded: function () makeScope: function (namespace) manageHiddenOutputs: function () manageInputs: function (data) ns: function (id) onBookmark: function (fun) onBookmarked: function (fun) onEnded: function (endedCallback) onFlush: function (flushCallback, once = TRUE) onFlushed: function (flushedCallback, once = TRUE) onInputReceived: function (callback) onRestore: function (fun) onRestored: function (fun) onSessionEnded: function (sessionEndedCallback) output: shinyoutput outputOptions: function (name, ...) progressStack: environment reactlog: function (logEntry) registerDataObj: function (name, data, filterFunc) registerDownload: function (name, filename, contentType, func) reload: function () request: environment resetBrush: function (brushId) restoreContext: RestoreContext, R6 rootScope: function () saveFileUrl: function (name, data, contentType, extra = list()) sendBinaryMessage: function (type, message) sendCustomMessage: function (type, message) sendInputMessage: function (inputId, message) sendInsertUI: function (selector, multiple, where, content) sendModal: function (type, message) sendNotification: function (type, message) sendProgress: function (type, message) sendRemoveUI: function (selector, multiple) session: active binding setBookmarkExclude: function (names) setShowcase: function (value) showProgress: function (id) singletons: token: d44d583f13b3cd4ccce43f59fe410f61 unhandledError: function (e) updateQueryString: function (queryString) user: NULL wsClosed: function () Private: .clientData: ReactiveValues, R6 .input: ReactiveValues, R6 .outputOptions: list .outputs: list bookmarkCallbacks: environment bookmarkedCallbacks: environment bookmarkExclude: busyCount: 2 closedCallbacks: environment createBookmarkObservers: function () enableTestEndpoint: function () fileUploadContext: environment flushCallbacks: environment flushedCallbacks: environment getOutputOption: function (outputName, propertyName, defaultValue) inputMessageQueue: list inputReceivedCallbacks: environment invalidatedOutputErrors: Map, R6 invalidatedOutputValues: Map, R6 outputValues: list progressKeys: character registerSessionEndCallbacks: function () restoreCallbacks: environment restoredCallbacks: environment sendErrorResponse: function (requestMsg, error) sendMessage: function (...) sendResponse: function (requestMsg, value) shouldSuspend: function (name) showcase: FALSE storeOutputValues: function (values = NULL) testEndpointUrl: session/d44d583f13b3cd4ccce43f59fe410f61/dataobj/shinyte ... testValueExprs: list websocket: WebSocket write: function (json)

Una buena forma de explorar el objeto de sesión es jugar con el brillante ejemplo en la galería brillante client-data-and-query-string . Permite see lo que está contenido, por ejemplo, en la session$clientdata o cualquier otro elemento del objeto.

Un par de puntos adicionales y engañosamente triviales:

  • ¿Cuándo comienza una sesión? Cuando un usuario se conecta con la aplicación brillante
  • ¿Cuándo termina una sesión? cuando un usuario se desconecta de la brillante aplicación

Como ejemplo, para mostrar cómo el problema es bastante complejo, si actualizo el navegador, finalizo la sesión actual y creo una nueva.

Al llegar a la session$isClosed() , esta no es la función correcta para conectarse a una acción específica cuando finaliza una sesión. Esta es en realidad la función de una brillante función de devolución de llamada

onSessionEnded(fun, session = getDefaultReactiveDomain())

Un ejemplo mínimo podría ser el siguiente:

library(shiny) ui =( fluidPage( titlePanel("This is an example") ) ) server = function(input, output, session){ session$onSessionEnded({ print("Stop!") stopApp }) } runApp(list(ui = ui, server = server))

Si lo intenta, la actualización (o la separación con el navegador ()) imprimirá "Detener" y detendrá la aplicación.

26 de septiembre de 2017 Editar:

En general, creo que es mejor tener cuidado si la continuidad de una sesión es importante (y en cualquier caso, es apropiado probar el código de session directamente en Shiny Server o Shiny Server Pro ). Posiblemente los casos de uso más importantes vienen con Shiny Server Pro , donde cualquier desconexión may afectar el estado de inicio de sesión, etc.).

También sé que el shiny equipo ha realizado cambios en estas áreas en versiones recientes. Por ejemplo, parece que mientras onSessionEnded todavía funciona, posiblemente ya no sea la mejor función para este uso.

Vea el siguiente código como un ejemplo (de la guía de referencia shiny ), usando onStop , que puede funcionar cuando termina una sesión, así como cuando la aplicación se detiene.

library(shiny) cat("Doing application setup/n") onStop(function() { cat("Doing application cleanup/n") }) shinyApp( ui = basicPage("onStop demo"), server = function(input, output, session) { onStop(function() cat("Session stopped/n")) } )

Tengo algunos problemas para entender cómo funcionan las sesiones en el servidor brillante. Supongo que una sesión termina cuando el usuario cierra el navegador, sin embargo, al usar la print(session$isClosed()) en la función del servidor obtengo una respuesta FALSE al principio (muy bien) y luego cuando cierro el navegador nada sucede. ¿Alguien puede darme una pista sobre las sesiones de servidor brillante? Me gustaría almacenar parcelas específicas de la sesión para permitir que los usuarios descarguen sus parcelas solamente.