Я буду использовать Django только как бэкэнд. Передняя часть будет выполнена с использованием React и шаблонов django. Я использую django-rest-framework, чтобы создать api для отдыха для моего сайта.Как использовать django только бэкэнд и сообщение с django-rest-framework
Я сделал сериализатор для пользователя.
class CustomUserSerializer(serializers.ModelSerializer):
class Meta:
model = CustomUser
fields = (
'id', 'email', 'password', 'username', 'first_name', 'last_name', 'date_of_birth', 'gender', 'mobile_number'
)
extra_kwargs = {
'password': {'write_only': True},
'id': {'read_only': True}
}
def create(self, validated_data):
user = CustomUser.objects.create(
email=validated_data['email'],
username=validated_data['email'],
first_name=validated_data['first_name'],
last_name=validated_data['last_name'],
date_of_birth=validated_data['date_of_birth'],
gender=validated_data['gender'],
mobile_number=validated_data['mobile_number']
)
user.set_password(validated_data['password'])
user.save()
return user
class CustomUserViewSet(viewsets.ModelViewSet):
queryset = CustomUser.objects.all()
serializer_class = CustomUserSerializer
В браузере, когда я перехожу к/custom/users/Я могу просматривать пользователей. Я также могу создать новых пользователей, которые после успешной регистрации возвращают пользователя. Также он работает, если я использую httpie/curl.
(djangoweb) [email protected]:~$ http --json POST http://55.55.55.5/custom/users/ email="[email protected]" password="terminal2123" username="t223erm" first_name="te2er" last_name="mi2nal" date_of_birth=1992-12-12 gender=2 mobile_number=66222666666336
Он создает и возвращает новый объект пользователя.
Так что я сделал форму для регистрации пользователя, который я не служу с сервера Джанго:
<form action="http://55.55.55.5/custom/users/" method="post" id="register-form">
<input type="text" placeholder="email" name="email"/>
...
...
<button id="post">Register</button>
</form>
И Аякса, чтобы отправить форму.
// using the javscript Cookies library
var csrftoken = Cookies.get('csrftoken');
function csrfSafeMethod(method) {
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});
$('#post').click(function(event) {
event.preventDefault();
var $form = $('#register-form');
var data = $form.serialize();
$.ajax({
type: "POST",
url: "http://55.55.55.5/custom/users/",
data: JSON.stringify(data),
sucess: function() { console.log("Success!"); },
contentType: "application/json; charset=utf-8",
dataType: "json",
crossDomain:false,
beforeSend: function(xhr, settings) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
});
});
Теперь после того, как если я нажимаю кнопку, проблема начинается:
- Даже если я дал
event.preventDefault()
страница автоматически загружается в URL сервера Джанго (т.е. http://55.55.55.5/custom/users/). - Я получаю сообщение об ошибке: «detail»: «CSRF Failed: токен CSRF отсутствует или неверен».
Как я могу обработать сообщение на сервере django, используя django-rest-framework? Я не нашел ничего полезного для этой проблемы. Не могли бы вы посоветовать мне, как это сделать? Спасибо.
Уточните, кому отводится внешняя страница? Является ли статический HTML/JS, непосредственно отображаемый сервером, или Django рендеринга? Предполагая, что это статический файл, я не уверен, что имеет смысл даже использовать CSRF, так как вы, вероятно, должны использовать маркер или аналогичный для безопасности. – dkarchmer
@dkarchmer Да, это статический HTML/JS, полученный от nodejs. Как я могу использовать токен, если я еще не пользователь? Я думал, что токены выдаются, если пользователь аутентифицируется. Не могли бы вы направить меня. Спасибо. – Robin