r - चमकदार-सर्वर में सत्र कैसे काम करते हैं?



shiny shiny-server (1)

मुझे चमकदार-सर्वर में सत्र कैसे काम करते हैं यह समझने में कुछ परेशानी हो रही है मैं मानता हूं कि जब उपयोगकर्ता ब्राउज़र को बंद कर देता है, तो सत्र समाप्त हो जाता है print(session$isClosed()) का उपयोग करके सर्वर फ़ंक्शन में मुझे शुरुआत में एक FALSE उत्तर मिलता है (और ठीक है) और तब जब मैं ब्राउज़र को बंद नहीं करता हो जाता। क्या कोई मुझे चमकदार सर्वर सत्रों के बारे में कोई सुराग दे सकता है? मैं सत्र विशेष भूखंडों को स्टोर करने के लिए उपयोगकर्ताओं को अपने भूखंडों को केवल डाउनलोड करने की अनुमति देता हूं।


ठीक है, एक चमकदार सत्र ऑब्जेक्ट के साथ शुरू करने के लिए एक विशिष्ट ('आर 6') डेटा संरचना चमकदार, सार्वजनिक और निजी तत्वों से बना है। इसका उद्देश्य एक उपयोगकर्ता और चमकदार (और बाद में इस पर अधिक) के बीच संबंध के एक उदाहरण को रिकॉर्ड करना है।

>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) 

सत्र वस्तु का पता लगाने का एक अच्छा तरीका चमकदार गैलरी क्लाइंट-डेटा-और-क्वेरी-स्ट्रिंग में चमकदार उदाहरण के साथ खेलना है। यह see अनुमति देता है कि session$clientdata में उदाहरण 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))

यदि आप कोशिश करते हैं, तो रीफ्रेश करना (या ब्राउज़र () के साथ तोड़ना) "स्टॉप" प्रिंट करेगा और ऐप को रोक देगा।

26 सितंबर 2017 संपादित करें:

सामान्यतः, मुझे लगता है कि एक सत्र की निरंतरता (और किसी भी मामले में Shiny Server या Shiny Server Pro पर सीधे session कोड का परीक्षण करना उचित है) सतर्क रहने के लिए बेहतर है। संभावित रूप से सबसे महत्वपूर्ण उपयोग के मामले Shiny Server Pro साथ आते हैं, जहां किसी भी कनेक्शन का may लॉगिन स्थिति आदि may प्रभावित कर may )।

मुझे यह भी पता है कि shiny टीम ने इन क्षेत्रों में हाल के संस्करणों में बदलाव किए हैं। उदाहरण के लिए, ऐसा लगता है कि onSessionEnded अभी भी काम आता है, संभवतः यह इस उपयोग के लिए सबसे अच्छा कार्य नहीं है।

निम्न कोड को एक उदाहरण के रूप में देखें ( shiny संदर्भ गाइड से), onStop का उपयोग करते 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