Django webapp // Комментирование постов на веб-странице

В настоящее время я создаю webapp с помощью фреймворка Python django. Есть одна задача, с которой я не очень понимаю, как справиться.

Допустим, моя страница отображает различные вопросы пользователей (как твиты в twitter). Теперь я хочу предоставить пользователям возможность писать ответы на различные отображаемые вопросы. Когда пользователь нажимает на кнопку ответа под определенным вопросом, под вопросом отображается форма с текстовой областью, которую можно отправить. Когда заполненная форма с текстом отправляется в бэкенд, мне нужно создать связь базы данных между вновь созданным ответом и вопросом. Для того чтобы найти соответствующий вопрос в БД необходим его ID (первичный ключ).

Вот моя проблема. Я не знаю, откуда можно безопасно получить удостоверение личности.

Простым способом было бы поместить ID в html-часть вопроса и затем использовать его с помощью javascript, или хранить ID как переменные javascript. Однако, поскольку DOM и значения переменных javascript могут быть изменены пользователями на фронтенде, этот способ не кажется мне безопасным. Если пользователь изменит значение ID в DOM для конкретного вопроса, заполнит форму и отправит ее в бэкенд, то отправленный ID не будет правильным для этого конкретного вопроса. Мой запрос к БД, использующий этот (злонамеренно измененный) ID, получает запись базы данных в таблице вопросов, которая не является вопросом, на который пользователь дал ответ. Например, допустим, злоумышленник дает ответ на вопрос №3, но меняет ID в DOM, который будет использоваться как часть формы, на #10. Тогда база данных вопросов будет запрошена по первичному ключу 10 вместо 3. Таким образом, созданная связь базы данных будет между вопросом #10 и размещенным ответом, который не является корректным.

Как в таком случае можно использовать идентификаторы баз данных, не подвергая их злонамеренным изменениям?

Любая помощь/советы очень приветствуются. Большое спасибо.

Лучшие

Стандартный способ (я думаю) справиться с этим - использовать представления/маршрутизацию. Ваше детальное представление для вопроса уже "знает" ID этого конкретного вопроса. Например, если ваш детальный вид вопроса выглядит следующим образом:

def detail(request, question_id):
    question = Question.objects.get(pk=question_id)

тогда ваш url_pattern для маршрутизации к этому представлению будет выглядеть следующим образом:

urlpatterns = [
    path('<int:question_id>/', views.detail, name='detail'),
]

Если вы хотите, чтобы пользователи добавляли ответы на вопросы, ваше представление для этого уже должно знать question_id, для которого пользователь хочет добавить ответы. И вы даете ему это знание, добавляя маршрутизацию следующим образом:

urlpatterns = [
    path('<int:question_id>/', views.detail, name='detail'),
    path('<int:question_id>/add_answer/', views.add_answer, name='add_answer')
]

Django в основном позаботится обо всем остальном за вас.

Я бы посоветовал просмотреть главу views в учебнике Django. Или весь учебник, если вы этого не сделали

Вернуться на верх