#reactjs #django #django-rest-framework
Вопрос:
Итак, у меня есть эта базовая модель:
class Text(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
title = models.CharField(max_length=255)
def __str__(self):
return self.title
поэтому обычно, когда вы используете обычный Django и хотите выполнить запрос Text
из базы данных на основе пользователя, вы бы сделали:
def main_page(request):
userTexts = Text.objects.filter(user=request.user)
context = {}
return render(request, '', context)
но теперь я использую стек Django REST React и создал полностью отдельный интерфейс, и единственный способ доступа к данным из бэкенда-это сделать HTTP-запрос к нему, так что теперь request.user
он больше не будет работать, потому что он просто вернется anonymousUser
к счастью, хотя у меня уже работает система аутентификации и в моем состоянии реакции уже есть объект пользователя, все, что мне нужно сделать, это создать представление и вызов API для запроса данных с серверной части, но я не могу себе представить, как сделать и то, и другое.
Ответ №1:
На самом деле, здесь не имеет значения, как вы пытаетесь получить доступ к внутреннему URL-адресу, напрямую вставляя его в панель браузера или используя xhr React.
Вам просто нужно установить файлы cookie сеанса для внутреннего URL ( domain.com:port
), который недоступен с помощью javascript в идеальном мире:
Файл cookie с атрибутом HttpOnly недоступен для API JavaScript Document.cookie; он отправляется только на сервер. Например, файлы cookie, сохраняющие сеансы на стороне сервера, не обязательно должны быть доступны для JavaScript и должны иметь атрибут HttpOnly. Эта мера предосторожности помогает смягчить атаки с использованием межсайтовых сценариев (XSS).
anonymousUser
означает, что файл cookie сеанса не установлен и процесс аутентификации (входа в систему) не завершен.
Почему это происходит? Я не знаю, это зависит от архитектуры бэкенда, деталей процесса входа в систему и т. Д…
И не забудьте установить правильные политики CORS, если интерфейсы и бэкенды domain.com:port
отличаются.