【问题标题】:Limiting the number of users in a locally hosted R shiny app限制本地托管的 R 闪亮应用程序中的用户数量
【发布时间】:2015-06-16 05:05:07
【问题描述】:

我想将本地托管的 r shiny 应用程序的用户数量限制为任何时候一位用户。

因此,理想情况下,当第二个用户尝试同时运行应用程序(用户通过在地址字段中输入本地 IP 来访问应用程序)时,应用程序将显示默认消息并停止任何进一步的进展。如果输入时显示的唯一内容是此拒绝消息,则取消任何其他用户命令可能无关紧要。

应用的内容无关紧要,我们可以以这个应用为例:http://shiny.rstudio.com/gallery/tabsets.html

感谢您提供的任何帮助或信息。

【问题讨论】:

  • 出于好奇,您为什么要尝试将网站的用户一次限制为一个?这是一个危险的提议,因为只有一个错误的访问者或网络爬虫(即 Googlebot)可以完全为实际用户禁用该网站。
  • 嗨,我正在创建一个本地使用的工具,而不是一个网站。由于它访问的数据,应用程序本身永远不需要上网。我问这个的原因是因为应用程序通过 RODBC 访问 SQL 数据库并运行查询。我遇到了同时拥有多个应用程序的问题,并且无论如何都不需要此功能-一次不太可能有多个用户,并且担心同时许多大型查询会变慢下网络。感谢您的回复!

标签: r shiny


【解决方案1】:

我不建议这样做,我认为这很危险,但有一些方法可以将它们组合在一起。这是一种解决方案(正如我所说,它很hacky,我自己不会这样做)。基本思想是有一个全局变量来跟踪是否有人在使用该应用程序。如果没有人使用该应用程序,请显示该应用程序并打开标志,并确保在用户退出时关闭该标志。

shinyBusy <- FALSE

runApp(shinyApp(
  ui = fluidPage(
    shinyjs::useShinyjs(),
    shinyjs::hidden(
      h1(id = "busyMsg", "App is busy")
    ),
    shinyjs::hidden(
      div(
        id = "app",
        p("Hello!")
      )
    )
  ),
  server = function(input, output, session) {
    if (shinyBusy) {
      shinyjs::show("busyMsg")
    } else {
      shinyBusy <<- TRUE
      session$onSessionEnded(function() shinyBusy <<- FALSE)
      shinyjs::show("app")
    }
  }
),
launch.browser = TRUE)

注意:为了显示/隐藏应用程序元素,我使用了我编写的包shinyjs

【讨论】:

  • 嗨 daattali,非常感谢您的解决方案,如果遇到任何问题,我会尽快回复您。你能解释一下为什么你不使用这个解决方案吗?渴望远离任何危险的事物!
  • 嗯,首先,这对用户来说很烦人。一次只允许一个用户是非常有限的。其次,如果有人只是打开网页然后出去吃饭,那么没有人可以访问它。此外,我还没有对此进行任何稳健的测试,我不知道onsessionended 是否 100% 稳健。也许有人访问了该网页,并且当他们出于某种原因离开时,该标志未重置为 false。我不知道这是否会发生,但肯定是前两个。
  • 感谢您的回答和解释。我想知道是否有可能在应用程序中创建“超时”功能以规避有人阻止访问的可能性。无论如何,我决定我将保持打开多个连接并找到不同的解决方案,但如果需要,请提供您的代码。
猜你喜欢
  • 2018-10-19
  • 2018-06-16
  • 1970-01-01
  • 2018-04-08
  • 2019-02-12
  • 1970-01-01
  • 2021-01-22
  • 2016-12-20
  • 2013-06-20
相关资源
最近更新 更多