2015-06-15 2 views
0

Я хотел бы ограничить количество пользователей моего локально размещенного приложения для одного пользователя в любой момент.Ограничение числа пользователей локально размещенного приложения R shiny

В идеале, когда второй пользователь попытался запустить приложение одновременно (пользователи получают доступ к приложению, введя локальный IP-адрес в поле адреса), приложение отобразит сообщение по умолчанию и прекратит дальнейший прогресс. Обнуление любых других пользовательских команд может не иметь значения, если единственное, что отображается при вводе, - это сообщение об отказе.

Содержание приложения не имеет значения, так что мы можем использовать это приложение в качестве примера: http://shiny.rstudio.com/gallery/tabsets.html

Спасибо за любую помощь или информацию вы можете дать.

+0

из любопытства, почему вы пытаетесь ограничить пользователей веб-сайта одному в то время, ? Это опасное предложение, поскольку только один ошибочный посетитель или искатель Интернета (т. Е. Googlebot) могут полностью отключить сайт для реальных пользователей. –

+0

Привет, Я создаю локально используемый инструмент, а не веб-сайт. Само приложение никогда не будет вынуждено выходить в интернет из-за данных, к которым он обращается. Причина, по которой я спрашиваю об этом, заключается в том, что приложение обращается к базе данных SQL через RODBC и запускает запрос. В то же время я сталкиваюсь с проблемами, имеющими более одного приложения, и эта функциональность не требуется в любом случае - ее очень маловероятно, что когда-либо будет больше, чем один пользователь за раз, и есть опасения, что многие большие запросы в то же время будут замедляться вниз по сети. Спасибо за ваш ответ! – Behrooz

ответ

0

Я бы не рекомендовал это делать, я думаю, что это очень опасно, но есть способы, которыми вы могли бы взломать это вместе. Вот одно решение (как я уже сказал, он взломан, и я не сделал бы это сам). Основная идея состоит в том, чтобы иметь глобальную переменную, которая отслеживает, использует ли кто-либо приложение. Если никто не использует приложение, покажите приложение и включите флаг, и обязательно выключите флаг, когда пользователь выйдет.

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

+0

Привет, дааттали, большое спасибо за решение. Я скоро вернусь к вам, если я натолкнусь на любые заезды. Не могли бы вы объяснить, почему вы не использовали это решение? Стремитесь держаться подальше от всего опасного! – Behrooz

+0

Ну, во-первых, это очень раздражает для пользователя. Разрешение только одного пользователя за раз очень ограничено. Во-вторых, что, если кто-то просто откроет веб-страницу, а затем отправится на обед, тогда никто не сможет получить к нему доступ. Кроме того, я не провел никаких серьезных испытаний по этому вопросу, и я не знаю, является ли «onsessionended» на 100% надежным. Возможно, возможно, что кто-то обращается к веб-странице, и когда они уезжают по какой-то причине, флаг не возвращается обратно к false. Я не знаю, может ли это случиться, но, конечно, первые два. –

+0

Спасибо за ответ и объяснение. Интересно, есть ли какая-то возможность создать функциональность «тайм-аут» в приложении, чтобы уклониться от возможности блокирования доступа. В любом случае, я решил, что буду открывать несколько соединений и нашел другое решение, но при необходимости должен иметь свой код. – Behrooz

Смежные вопросы