Почему не делает os.path.join (), работают в этом случае?

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

Я рекомендую:

  1. Создать набор правил, которые не позволяют злонамеренным клиентам добавлять данные после неправильного ответа
  2. Иметь структуру RTD, соответствующую вашим целям [ 1118]
  3. Используйте функции для безопасного управления бизнес-логикой
  4. Заставьте клиентов задуматься о том, что происходит в пользовательском интерфейсе

Правила должны выглядеть примерно так: если пользователь имеет значение true на узле проверки с тем же идентификатором, что и в текущей игре, пользователь может написать ответы, если узел проверки ложен, тогда пользователь ошибочно ответил на предыдущий вопрос и, следовательно, не может написать больше ответов. Мы вернемся к этому.

Ваша структура базы данных должна выглядеть примерно так:

{
  "questionnaires": {
    "questionnaire_id_1": {
      "question_1": {
        "question": "How much is 2 + 2",
        "alternatives": {
          "a": 4,
          "b": 3,
          "c": 2
        }
      },
      "question_2": {
        "question": "How much is 0 + 2",
        "alternatives": {
          "a": 4,
          "b": 3,
          "c": 2
        }
      }
    }
  },
  "answers": {
    "questionnaire_id_1": {
      "question_1": "a",
      "question_2": "c"
    }
  },
  "user_answers": {
    "questionnaire_id_1": {
      "uid_1": {
        "question_1": "a",
        "question_2": "c"
      },
      "uid_2": {
        "question_1": "a",
        "question_2": "c"
      },
      "uid_3": {
        "question_1": "a"
      }
    }
  },
  "questionnaires_permissions": {
    "questionnaire_id_1": {
      "uid_1": true,
      "uid_2": true,
      "uid_3": false
    },
    "questionnaire_id_2": {
      "uid_1": true,
      "uid_2": true,
      "uid_3": true
    }
  }
}

Есть questionnaires для выбора пользователя. Когда пользователь выбирает вопросник, он запускает функцию onCall Firebase , которая будет проверять, если пользователь ранее выбрал вопросник. Функция onCall проверит, существует ли questionnaires_permissions/{user_uid}. Если он не существует, он ответит ok move forward и создаст его, если он существует и является истинным, то он также ответит и ok move forward, но если он ложный, это означает, что пользователь ранее допустил ошибку, тогда это будет ответ user failed the test. Таким образом, пользовательский интерфейс может отражать то, что в первый раз выбирает анкету или вводит ее заново.

Узлы questionnaires позволяют пользователю читать все вопросы, узел answers имеет правильные ответы, доступные только для чтения функциями, а узел user_answers имеет фактические ответы пользователя (написанные пользователем). ).

Для создания users_answers/{questionnaire_id}/{uid}/{question} необходим слушатель RTD Functions . Когда пользователь создает ответ, функции срабатывают и проверяют правильность ответа. Если он неверен, он будет помечен как false на узле questionnaires_permissions/{questionnaire_id}/{uid}.

Клиент должен иметь прослушиватель в режиме реального времени для questionnaires_permissions/{questionnaire_id}/{uid}, если он меняется на false, тогда пользовательский интерфейс должен отображать предупреждение, сообщающее пользователю, что последний вопрос был неверным.

Последние 2 шага также могут быть одной операцией с использованием onCall.

Теперь мы должны взглянуть на правила базы данных.

{
  "rules": {
    "questionnaires": {
      ".read": "auth != null",
      ".write": false
    },
    "answers": {
      ".read": false,
      ".write": false
    },
    "user_answers": {
      "$questionnaire_id": {
        "$uid": {
          "$question_id": {
            ".read": false,
            ".write": "$uid === auth.uid && root.child('questionnaires_permissions').child($questionnaire_id).val() == true"
          }
        }
      }
    },
    "questionnaires_permissions": {
      "$questionnaire_id": {
        "$uid": {
          ".read": "$uid === auth.uid",
          ".write": false
        }
      }
    }
  }
}

Так что, если по какой-либо причине клиент malicios попытается написать после неправильного ответа, это будет невозможно, потому что правила базы данных не позволят этого

306
задан Kevin Guan 15 December 2015 в 18:54
поделиться

8 ответов

Последние строки не должны начинаться со слеша. Если они начинаются со слеша, то они считаются "абсолютным путём" и всё перед ними отбрасывается.

Цитируя Python docs для os.path.join:

Если компонент является абсолютным путём, то все предыдущие компоненты отбрасываются и соединение продолжается от абсолютного компонента пути.

Обратите внимание на Windows, поведение по отношению к буквам дисков, которое, кажется, изменилось по сравнению с более ранними версиями Python:

В Windows буква диска не сбрасывается, когда компонентом абсолютного пути является абсолютный путь (например r'\foo'). Если компонент содержит букву диска, все предыдущие компоненты выбрасываются, а буква диска сбрасывается. Обратите внимание, что поскольку для каждого диска существует текущий каталог, os.path.join("c:", "foo") представляет собой путь относительно текущего каталога на диске C: (c:foo), а не c:\foo.

399
ответ дан 23 November 2019 в 01:19
поделиться
os.path.join("a", *"/b".split(os.sep))
'a/b'

более полная версия:

import os

def join (p, f):
    f = os.path.normpath(f)
    if p == "":
        return (f);
    else:
        p = os.path.normpath(p)
        return (os.path.join(p, *f.split(os.sep)))

def test (p, f):
    print("os.path.join({}, {}) => {}".format(p, f, os.path.join(p, f)))
    print("        join({}, {}) => {}".format(p, f, join(p, f)))

if __name__ == "__main__":
    # /a/b/c for all
    test("/a/b", "/c")
    test("/a/b", "c")
    test("/a/b/", "c")
    test("", "/c")
    test("", "c")

получение:

os.path.join(/a/b, /c) => /c
        join(/a/b, /c) => /a/b/c
os.path.join(/a/b, c) => /a/b/c
        join(/a/b, c) => /a/b/c
os.path.join(/a/b/, c) => /a/b/c
        join(/a/b/, c) => /a/b/c
os.path.join(, /c) => /c
        join(, /c) => /c
os.path.join(, c) => c
        join(, c) => c
0
ответ дан 23 November 2019 в 01:19
поделиться

Вы можете strip '/':

>>> os.path.join('/home/build/test/sandboxes/', todaystr, '/new_sandbox/'.strip('/'))
'/home/build/test/sandboxes/04122019/new_sandbox'
0
ответ дан 23 November 2019 в 01:19
поделиться

Идея os.path.join() заключается в том, чтобы сделать вашу программу кросс-платформенной (linux/windows/etc).

Даже одна косая черта разрушает ее.

Так что это имеет смысл только при использовании с какой-то точкой отсчета вроде os.environ['HOME'] or os.path.dirname(__file__).

147
ответ дан 23 November 2019 в 01:19
поделиться

делайте так, без лишних косых черт

root="/home"
os.path.join(root,"build","test","sandboxes",todaystr,"new_sandbox")
2
ответ дан 23 November 2019 в 01:19
поделиться

Это потому, что ваш '/new_sandbox/' начинается с / и, таким образом, считается, что он относительно корневого каталога. Удалите ведущий /.

.
12
ответ дан 23 November 2019 в 01:19
поделиться

Не используйте прямые косые черты в начале компонентов пути, кроме как при обращении к корневому каталогу:

os.path.join('/home/build/test/sandboxes', todaystr, 'new_sandbox')

см. также: http://docs.python.org/library/os.path.html#os.path.join

22
ответ дан 23 November 2019 в 01:19
поделиться

Попробуйте с new_sandbox только

os.path.join('/home/build/test/sandboxes/', todaystr, 'new_sandbox')
3
ответ дан 23 November 2019 в 01:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: