会话如何在闪亮服务器中工作?
How sessions work in shiny-server?
我在理解会话在 shiny-server 中的工作方式时遇到了一些麻烦。我假设当用户关闭浏览器时会话结束,但是,通过在服务器函数中使用 print(session$isClosed())
我在开始时得到 FALSE
响应(好吧)然后当我关闭浏览器时什么都没发生。谁能给我一个关于闪亮服务器会话的线索?我想存储特定于会话的图,让用户只下载他们的图。
好吧,从闪亮的会话对象开始是闪亮的特定 ('R6') 数据结构,由 public 和私有元素组成。它的目的是记录一个用户和 shiny 之间关系的一个实例(稍后会详细介绍)。
>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)
探索会话对象的一个好方法是使用 shiny example in shiny gallery client-data-and-query-string。它允许 see
例如包含在 session$clientdata
或对象的任何其他元素中的内容。
一些额外的和误导性的琐碎点:
- 会话什么时候开始?当用户连接闪亮的应用程序时
- 会话什么时候结束?当用户与闪亮的应用程序断开连接时
举个例子,为了说明这个问题实际上是多么复杂,如果我刷新浏览器,我会结束当前会话并创建一个新会话。
来到 session$isClosed()
,这不是在会话结束时连接到特定操作的正确函数。
这其实就是闪亮的回调函数的作用
onSessionEnded(fun, session = getDefaultReactiveDomain())
一个最小的例子如下:
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))
如果您尝试刷新(或使用 browser() 中断)将打印 "Stop" 并停止应用程序。
2017 年 9 月 26 日编辑:
一般来说,如果会话的连续性很重要,我认为最好谨慎(无论如何,直接在 Shiny Server
或 [ 上测试 session
代码是合适的=19=]). Shiny Server Pro
可能是最重要的用例,其中任何断开连接 may
都会影响登录状态等)。
我也知道 shiny
团队在最近的版本中对这些方面进行了更改。例如,虽然 onSessionEnded
似乎仍然有效,但它可能不再是这个用例的最佳功能。
请参阅以下代码作为示例(来自 shiny
参考指南),使用 onStop
,它可以在会话结束时以及应用程序停止时工作。
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"))
}
)
我在理解会话在 shiny-server 中的工作方式时遇到了一些麻烦。我假设当用户关闭浏览器时会话结束,但是,通过在服务器函数中使用 print(session$isClosed())
我在开始时得到 FALSE
响应(好吧)然后当我关闭浏览器时什么都没发生。谁能给我一个关于闪亮服务器会话的线索?我想存储特定于会话的图,让用户只下载他们的图。
好吧,从闪亮的会话对象开始是闪亮的特定 ('R6') 数据结构,由 public 和私有元素组成。它的目的是记录一个用户和 shiny 之间关系的一个实例(稍后会详细介绍)。
>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)
探索会话对象的一个好方法是使用 shiny example in shiny gallery client-data-and-query-string。它允许 see
例如包含在 session$clientdata
或对象的任何其他元素中的内容。
一些额外的和误导性的琐碎点:
- 会话什么时候开始?当用户连接闪亮的应用程序时
- 会话什么时候结束?当用户与闪亮的应用程序断开连接时
举个例子,为了说明这个问题实际上是多么复杂,如果我刷新浏览器,我会结束当前会话并创建一个新会话。
来到 session$isClosed()
,这不是在会话结束时连接到特定操作的正确函数。
这其实就是闪亮的回调函数的作用
onSessionEnded(fun, session = getDefaultReactiveDomain())
一个最小的例子如下:
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))
如果您尝试刷新(或使用 browser() 中断)将打印 "Stop" 并停止应用程序。
2017 年 9 月 26 日编辑:
一般来说,如果会话的连续性很重要,我认为最好谨慎(无论如何,直接在 Shiny Server
或 [ 上测试 session
代码是合适的=19=]). Shiny Server Pro
可能是最重要的用例,其中任何断开连接 may
都会影响登录状态等)。
我也知道 shiny
团队在最近的版本中对这些方面进行了更改。例如,虽然 onSessionEnded
似乎仍然有效,但它可能不再是这个用例的最佳功能。
请参阅以下代码作为示例(来自 shiny
参考指南),使用 onStop
,它可以在会话结束时以及应用程序停止时工作。
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"))
}
)