Django REST Framework를 사용하여 POST를 심플하게 하는 방법CSRF 토큰이 없거나 잘못되었습니다.
JSON을 사용하여 Django REST 프레임워크를 사용하여 간단한 POST 요청을 하는 방법을 알려주시면 감사하겠습니다.튜토리얼에는 이런 예가 없습니다.
POST 하고 싶은 롤모델 오브젝트는 다음과 같습니다.데이터베이스에 추가하고 싶은 새로운 역할입니다만, 500 에러가 표시됩니다.
{
"name": "Manager",
"description": "someone who manages"
}
다음은 bash 터미널 프롬프트에서의 컬 요청입니다.
curl -X POST -H "Content-Type: application/json" -d '[
{
"name": "Manager",
"description": "someone who manages"
}]'
http://localhost:8000/lakesShoreProperties/role
URL
http://localhost:8000/lakesShoreProperties/roles
GET 요청과 함께 작동하며 데이터베이스의 모든 역할을 풀다운할 수 있지만 새 역할을 생성할 수 없습니다.설정된 권한이 없습니다.뷰에서는 표준 뷰를 사용하고 있습니다.화이
class RoleDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Role.objects.all()
serializer_class = RoleSerializer
format = None
class RoleList(generics.ListCreateAPIView):
queryset = Role.objects.all()
serializer_class = RoleSerializer
format = None
그리고 내 안에urls.py이 앱에 대한 관련 URL - 보기 매핑이 올바릅니다.
url(r'^roles/$', views.RoleList.as_view()),
url(r'^role/(?P<pk>[0-9]+)/$', views.RoleDetail.as_view()),
오류 메시지:
{
"detail": "CSRF Failed: CSRF token missing or incorrect."
}
여기서 무슨 일이 일어나고 있으며 이에 대한 해결책은 무엇입니까?localhost는 사이트 간 요청입니까?추가했습니다.@csrf_exempt로.RoleDetail그리고.RoleList아무것도 변하지 않는 것 같아요이 데코레이터는 클래스에도 추가할 수 있습니까, 아니면 메서드에 추가할 필요가 있습니까?추가@csrf_exempt데코레이션, 내 에러는 다음과 같습니다.
Request Method: POST
Request URL: http://127.0.0.1:8000/lakeshoreProperties/roles/
Django Version: 1.5.1
Exception Type: AttributeError
Exception Value:
'function' object has no attribute 'as_view'
그 후 앱 전체에서 CSRF를 비활성화하면 다음과 같은 메시지가 나타납니다.
{"non_field_errors": 알고 있는 JSON 개체가 유효한 경우 ["Invalid data"]}.필드 오류는 아니지만 난 여기 갇혔어
내 아들이 유효하지 않은 걸로 밝혀졌나요?
{
"name": "admin",
"description": "someone who administrates"
}
대
[
{
"name": "admin",
"description": "someone who administrates"
}
]
괄호 [ ]가 붙어 있으면 POST 요구가 실패합니다.그러나 jsonlint.com 검증기를 사용하면 두 json 개체가 모두 검증됩니다.
업데이트: 이 문제는 POST를 백엔드가 아닌 PostMan과 함께 전송하는 데 있었습니다.https://stackoverflow.com/a/17508420/203312 를 참조해 주세요.
CSRF는 디폴트로 Django REST Framework에서는 면제됩니다.따라서 Curl POST 요청은 정상적으로 동작합니다.Cookie에 CSRF 토큰이 포함되어 있는 경우 POSTMAN 요청 콜이 CSRF를 잘못 반환했습니다.쿠키를 정리하면 이 문제를 해결할 수 있습니다.
REST Framework 설정에서 가져옵니다.당신의 안에서settings.py파일, 사용자REST_FRAMEWORK에는 다음과 같은 것이 필요합니다.
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.TokenAuthentication',
),
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.AllowAny',
),
}
그러면 csrf 인증 대신 토큰 인증을 사용하도록 REST Framework가 설정됩니다.그리고 권한을 설정함으로써AllowAny인증할 수 있는 것은 원하는 장소뿐입니다.
CSRF 토큰을 요청과 함께 전송해야 할 수 있습니다.https://docs.djangoproject.com/en/1.7/ref/contrib/csrf/ #http://https://docs.djangoproject.com/en/1.7/ref/contrib/csrf/ 를 참조해 주세요.
업데이트: CSRF 면제를 이미 시도하셨기 때문에 (사용하시는 Django 버전에 따라) 도움이 될 수 있습니다.https://stackoverflow.com/a/14379073/977931
좋아, 이제 내가 한 말 취소할게CSRF는 의도대로 동작합니다.
POSTMAN이라는 크롬 플러그인을 사용하여 POST 요청을 하고 있었는데 CSRF를 활성화하면 POST 요청이 실패합니다.
단, Curl POST 요청은
curl -X POST -H "Content-Type: application/json" -d '
{
"name": "Manager",
"description": "someone who manages"
}' http://127.0.0.1:8000/lakeshoreProperties/roles/
정상적으로 동작하고 있다...괄호([])를 떼고 역할의 's' 뒤에 슬래시가 있는지, 즉 roles/와 csrf가 활성화 되어 있는지 확인해야 했습니다.
POSTMAN을 사용한 통화와 컬을 사용한 통화의 차이는 잘 모르겠지만, POSTMAN은 웹 브라우저로 실행되기 때문에 가장 큰 차이가 있습니다.즉, 전체 클래스의 RoleList에 대해 csrf를 디세블로 했지만 동일한 요청 하나가 Curl에서 작동하지만 POSTMAN에서는 실패합니다.
현재 상태를 업데이트하고 몇 가지 답변을 요약하려면:
하고 있는API와 내에서 .API는 AJAX를 사용합니다.
SessionAuthentication이렇게 하면 사용자가 로그인한 후 작성된 모든 AJAX 요청을 웹 사이트의 나머지 부분에 사용되는 동일한 세션 기반 인증을 사용하여 인증할 수 있습니다.하고 있는 의 인증방식을.예를 들어 AJAX는 AJAX를 합니다.
TokenAuthentication.
때문에 '아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아,SessionAuthenticationTokenAuthentication는 문제를 해결할 수 있지만 반드시 완전히 올바른 것은 아닙니다.
이러한 유형의 공격을 방지하려면 다음 두 가지 작업을 수행해야 합니다.
'안전한' 동작: '안전한' HTTP 동작)을합니다.
GET,HEAD★★★★★★★★★★★★★★★★★」OPTIONS서버측 상태를 변경하는 데 사용할 수 없습니다.'하지 않은' 동작( '안전하지 않은' HTTP 동작)을합니다.
POST,PUT,PATCH★★★★★★★★★★★★★★★★★」DELETECSRF에 관한 것입니다.★★★★★★★★★를 사용하고 있는 경우는SessionAuthenticationCSRF에POST,PUT,PATCH★★★★★★★★★★★★★★★★★」DELETE운용을 실시합니다.AJAX 요구를 작성하려면 , Django 메뉴얼의 설명에 따라서, HTTP 헤더에 CSRF 토큰을 포함할 필요가 있습니다.
따라서 예를 들어 이 답변에서 알 수 있듯이 csrf를 헤더에 포함하는 것이 중요합니다.
레퍼런스:AJAX, CSRF 및 CORS, Django REST 프레임워크 문서 사용.
당신의 URL은
http://localhost:8000/lakesShoreProperties/roles
로컬 호스트의 POST로의 송신127.0.0.1:8000/your-api/endpoint대신 날 위해 묘기를 부렸지
오래된 우체부는 csrf 토큰에 문제가 있습니다.쿠키와 함께 동작하지 않기 때문입니다.
새로운 버전의 우체부로 바꾸시는 것이 좋습니다.쿠키와 함께 사용할 수 있기 때문에, 이 문제는 재발하지 않습니다.
설정했다면AllowAnycsrf 문제에 직면한 경우
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.AllowAny'
]
}
에 다음에 이어지다를 .settings.py를 해결합니다.
REST_SESSION_LOGIN = False
언급URL : https://stackoverflow.com/questions/17507206/how-to-make-a-post-simple-json-using-django-rest-framework-csrf-token-missing-o
'source' 카테고리의 다른 글
| Typescript에서 오류를 발생시키는 함수를 선언하는 방법 (0) | 2023.02.16 |
|---|---|
| TypeScript에서 인터페이스 파일 정의를 기반으로 개체를 만들려면 어떻게 해야 합니까? (0) | 2023.02.16 |
| string | null 형식의 인수는 string 유형의 파라미터에 할당할 수 없습니다.유형 'null'은 유형 'string'에 할당할 수 없습니다. (0) | 2023.02.16 |
| MongoDB 기본 데이터베이스 경로는 무엇입니까? (0) | 2023.02.16 |
| Kotlin: JSONArray를 통해 반복 (0) | 2023.02.16 |