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. Или весь учебник, если вы этого не сделали