장고를 백엔드로만 사용합니다. 프론트 엔드는 React와 django 템플릿을 사용하지 않고 끝납니다. 내 웹 사이트의 나머지 API를 만들려면 django-rest-framework을 사용하고 있습니다.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);
}
});
});
지금 후, 문제가 시작 : 나는 페이지가 자동으로 장고 서버의 URL로로드 event.preventDefault()
을했다하더라도
- (즉, http://55.55.55.5/custom/users/).
- "detail": "CSRF Failed : CSRF 토큰이 없거나 잘못되었습니다."오류가 발생합니다.
어떻게 django-rest-framework를 사용하여 django 서버에 대한 게시물을 처리 할 수 있습니까? 이 문제에 도움이되는 자료를 찾지 못했습니다. 어떻게 안내해 줄 수 있니? 고맙습니다.
프런트 엔드 페이지를 제공하는 사용자를 분명히 할 수 있습니까? 정적 HTML/JS 직접 서버에 의해 렌더링됩니다, 또는 장고 그것을 렌더링 무엇입니까? 정적 파일이라고 가정하면, 보안을 위해 토큰 등을 사용하고있을 가능성이 있으므로 CSRF를 사용하는 것이 합리적이지는 않습니다. – dkarchmer
@dkarchmer 예, nodejs에서 렌더링 한 정적 HTML/JS입니다. 내가 아직 사용자가 아닌 경우 어떻게 토큰을 사용할 수 있습니까? 나는 사용자가 인증하면 토큰이 주어 졌다고 생각했다. 제발 날 안내해 주시겠습니까? 고맙습니다. – Robin