Byłbym wdzięczny za pokazanie mi, jak wykonać proste żądanie POST za pomocą JSON z frameworkiem Django REST. Nie widzę żadnych przykładów tego w tutorialu w dowolnym miejscu?Jak zrobić prosty JSON POST za pomocą Django REST Framework? Token CSRF jest niepoprawny lub niepoprawny
Oto mój obiekt modelu roli, który chciałbym POST. To będzie zupełnie nowa funkcja, którą chciałbym dodać do bazy danych, ale otrzymuję błąd 500.
{
"name": "Manager",
"description": "someone who manages"
}
Oto moja prośba curl w wierszu terminalu 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
działa z żądania GET i mogę ciągnąć w dół wszystkie role w w bazie danych, ale nie mogę utworzyć żadnych nowych ról. Nie mam ustawionych uprawnień. Używam standardowego widoku w views.py
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
I w moich urls.py
dla tej aplikacji, odpowiednie url - widok przekształceń są prawidłowe:
url(r'^roles/$', views.RoleList.as_view()),
url(r'^role/(?P<pk>[0-9]+)/$', views.RoleDetail.as_view()),
Komunikat o błędzie jest:
{
"detail": "CSRF Failed: CSRF token missing or incorrect."
}
Co się tu dzieje i jaka jest tego przyczyna? Czy localhost jest żądaniem między witrynami? Dodałem @csrf_exempt
do RoleDetail
i RoleList
, ale wydaje się, że nic nie zmienia. Czy ten dekorator można dodać do klasy, czy też trzeba go dodać do metody? Dodanie @csrf_exempt
dekoracji, mój błąd staje:
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'
Potem niepełnosprawnych CSRF throughtout cała aplikacja, a ja teraz dostać tę wiadomość:
{ "non_field_errors": [ "nieprawidłowe dane"]} kiedy mój obiekt JSON, który znam, jest prawidłowy json. To błąd inny niż terenowy, ale utknąłem tutaj.
Cóż, okazało się, że mój json był nieważny?
{
"name": "admin",
"description": "someone who administrates"
}
vs
[
{
"name": "admin",
"description": "someone who administrates"
}
]
uwzględniając wsporniki obejmujących, [], powoduje żądanie POST niepowodzeniem. Ale używając walidatora jsonlint.com, oba moje obiekty json sprawdzają poprawność.
Aktualizacja: Problem polegał na wysłaniu testu POST za pomocą narzędzia PostMan, a nie w zapleczu. Zobacz https://stackoverflow.com/a/17508420/203312
Czy 'RoleSerializer' coś zdefiniowałeś? Być może warto się nim zajrzeć. – stellarchariot