Рубрики
Без рубрики

Построить API Crud Django REST API

В этой статье мы будем добавлять функциональность Crud (Create, Read, Update, Delete) для уже существующих … Теги с Джанго, Питоном, Учебник.

В этой статье мы будем добавлять функциональность Crud (Create, Read, Update, Delete) для уже существующего API отдыха Django с аутентификацией пользователя. Это продолжение предыдущей статьи, в которой мы добавили функциональные возможности аутентификации, такие как регистр, логин, выйти в простой книжный магазин Django Rest API с одним конечным точком, который отправляет ответ {«сообщение»: «Добро пожаловать в книжный магазин!»} И пользователь должен быть аутентифицирован для доступа к нашей конечной точке.

Хотите ли вы:

  • Создайте простой отдых API с Django?
  • Добавьте аутентификацию в REST Framework Django API?

Давайте начнем 😀

Мы начнем с создания некоторых моделей. Модели Django в основном являются объектами Python, которые используются в доступе и управлении данными. Модели определяют структуру сохраненных данных, таких как типы полевых данных, создавая отношения между данными, применяя определенные ограничения на поля данных и намного больше. Для получения дополнительной информации о модели Django проверьте Документация v3.

Для нашего bookstore_app , мы создадим две модели Автор и Книга Отказ

# ./bookstore_app/api/models.py

from django.db import models
from django.conf import settings
from django.utils import timezone

# Create your models here.
class Author(models.Model):
  name = models.CharField(max_length=200)
  added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
  created_date = models.DateTimeField(default=timezone.now)

  def __str__(self):
    return self.name

class Book(models.Model):
  title = models.CharField(max_length=200)
  description = models.CharField(max_length=300)  
  author = models.ForeignKey(Author, on_delete=models.CASCADE)
  added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
  created_date = models.DateTimeField(default=timezone.now)

  def __str__(self):
    return self.title

Что-то принять к сведению о моделях, которые мы только что создали:

  1. В Книга Модель, книга должна иметь автора. Итак, мы создали поле Автор который является инострудкой, ссылаясь на Автор модель.
  2. Мы хотим отслеживать пользователь, который добавил запись для либо Книга или Автор Итак, мы создаем поле добавлено_by который является инострудкой, ссылаясь на Auth_user_model Отказ

Теперь у нас созданы наши модели, нам придется запускать миграции. Но до этого давайте Макемиграция После чего мы тогда проведем созданные миграции.

$ python manage.py makemigrations
$ python manage.py migrate

Время для тестируемого привода 🚀. Я буду проверять мои новые созданные модели в Django оболочка Добавляя несколько записей в Автор Отказ На терминале давайте начнем оболочку, запустив Python Manage.py Shell Отказ

$ python manage.py shell
Python 3.6.9 (default, Nov  7 2019, 10:44:02) 
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>

Глядя на поля в Автор Модели, у нас есть:

  • Имя : что является полем символов с максимальной длиной 200, поэтому он может принимать строки.
  • добавлено_by : который ссылается на пользовательскую модель. Итак, чтобы сделать новую запись, нам нужно пройти экземпляр пользователя.
  • create_date : Что по умолчанию на текущее время входа.

Итак, в оболочка Мы должны импортировать Пользователь и Автор Модели, чтобы сделать добавление записи в Автор возможно.

>>> from django.contrib.auth.models import User
>>> from api.models import Author
Давайте создадим пользователь:

Во-первых, мы делаем экземпляр пользователя, то мы называем метод сохранения в модели, чтобы сохранить в БД.

>>> user = User(first_name="John", last_name="Doe", username="johndoe")
>>> user.save()
Добавление автора:

Чтобы добавить автор, мы принимаем экземпляр автора, передав экземпляр пользователя, который мы уже создали для Добавлено

>>> author1 = Author(name="Author Mie", added_by=user)
>>> author1.save()
>>> author2 = Author(name="Author Mello", added_by=user)
>>> author2.save()

Мы успешно добавили два новых авторов. Чтобы получить все записи на таблицу авторов:

>>> Author.objects.all()
, ]>

Мы также можем с нашими моделями через интерфейс администратора Django, предоставленный Django, который доступен в https://localhost: 8000/admin . Но прежде чем мы сделаем это, мы сначала придется:

  1. Добавьте наши модели в интерфейс администратора
  2. Создать суперпульс

Чтобы добавить модели в интерфейс администратора

# bookstore_app/api/admin.py

from django.contrib import admin
from .models import Author, Book

# Register your models here.
admin.site.register(Author)
admin.site.register(Book)

Создать суперпользовательский

Учетная запись «Superuser» имеет полный доступ к серверу и все необходимые разрешения.

На терминале запустите Python Manage.py CreatesuperUser

$ python manage.py createsuperuser
Username: superadmin
Email address: superadmin@email.com
Password: 
Password (again):

Superuser created successfully.

Мы успешно создали суперпользователь. Теперь запустите сервер и войдите на страницу администратора в браузере, используя созданные вами учетные данные Superuser. После успешного входа в систему ваш интерфейс администратора будет выглядеть как изображение ниже. Теперь вы можете добавить больше авторов и книг, даже устанавливаемых разрешений, отключить определенные пользователи и больше, если это нужно. Конечно, вы Суперзор !!!

https://localhost:8000/admin

До сих пор мы смогли упорствовать наши данные и прочитать из БД на оболочке. Пришло время создать несколько представлений, чтобы обрабатывать пост, получить, поставить, удалять запросы на сервере. Но прежде чем мы начнем добавлять новые виды в API/Views.py Файл, давайте создадим сериализаторы для наших моделей.

Serializers позволяют комплексными данными, такими как Querysets и экземпляры модели, которые будут преобразованы в нативные типы данных Python, которые затем могут быть легко отображены в JSON.

Чтобы начать создание наших сериалов, давайте создадим serializers.py Файл в нашем API Папка приложения, а затем создать нашу Автоответчик и КнигиРиализатор Выберите поля, которые мы заботимся о различных моделях, которые мы перейдем к ответ.

# bookstore_app/api/serializers.py

from rest_framework import serializers
from .models import Author, Book

class AuthorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Author
        fields = ['id', 'name', 'added_by', 'created_by']

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = ['id', 'title', 'description', 'created_date', 'author', 'added_by']

У нас есть наш сериализатор готов, давайте откроем API/Views.py файл. Текущее содержание файла должно быть из предыдущего поста, Добавление аутентификации в остальные рамки Django API Отказ

# ./bookstore_app/api/views.py

from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import IsAuthenticated
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt

@api_view(["GET"])
@csrf_exempt
@permission_classes([IsAuthenticated])  
def welcome(request):
    content = {"message": "Welcome to the BookStore!"}
    return JsonResponse(content)

Пользователь может получить все книги

# ./bookstore_app/api/views.py

...
from .serializers import BookSerializer
from .models import Book
from rest_framework import status


@api_view(["GET"])
@csrf_exempt
@permission_classes([IsAuthenticated])
def get_books(request):
    user = request.user.id
    books = Book.objects.filter(added_by=user)
    serializer = BookSerializer(books, many=True)
    return JsonResponse({'books': serializer.data}, safe=False, status=status.HTTP_200_OK)

Пользователь может добавить книгу

# ./bookstore_app/api/views.py

...
from .models import Book, Author
import json
from django.core.exceptions import ObjectDoesNotExist

@api_view(["POST"])
@csrf_exempt
@permission_classes([IsAuthenticated])
def add_book(request):
    payload = json.loads(request.body)
    user = request.user
    try:
        author = Author.objects.get(id=payload["author"])
        book = Book.objects.create(
            title=payload["title"],
            description=payload["description"],
            added_by=user,
            author=author
        )
        serializer = BookSerializer(book)
        return JsonResponse({'books': serializer.data}, safe=False, status=status.HTTP_201_CREATED)
    except ObjectDoesNotExist as e:
        return JsonResponse({'error': str(e)}, safe=False, status=status.HTTP_404_NOT_FOUND)
    except Exception:
        return JsonResponse({'error': 'Something terrible went wrong'}, safe=False, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

Пользователь может обновить запись книги по ID

# ./bookstore_app/api/views.py

...
@api_view(["PUT"])
@csrf_exempt
@permission_classes([IsAuthenticated])
def update_book(request, book_id):
    user = request.user.id
    payload = json.loads(request.body)
    try:
        book_item = Book.objects.filter(added_by=user, id=book_id)
        # returns 1 or 0
        book_item.update(**payload)
        book = Book.objects.get(id=book_id)
        serializer = BookSerializer(book)
        return JsonResponse({'book': serializer.data}, safe=False, status=status.HTTP_200_OK)
    except ObjectDoesNotExist as e:
        return JsonResponse({'error': str(e)}, safe=False, status=status.HTTP_404_NOT_FOUND)
    except Exception:
        return JsonResponse({'error': 'Something terrible went wrong'}, safe=False, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

Пользователь может удалить запись книги по ID

# ./bookstore_app/api/views.py

...

@api_view(["DELETE"])
@csrf_exempt
@permission_classes([IsAuthenticated])
def delete_book(request, book_id):
    user = request.user.id
    try:
        book = Book.objects.get(added_by=user, id=book_id)
        book.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)
    except ObjectDoesNotExist as e:
        return JsonResponse({'error': str(e)}, safe=False, status=status.HTTP_404_NOT_FOUND)
    except Exception:
        return JsonResponse({'error': 'Something went wrong'}, safe=False, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

После выполнения взглядов и его функциональных действий мы теперь добавим их к API/URLS.PY файл.

# ./bookstore_app/api/urls.py

from django.urls import include, path
from . import views

urlpatterns = [
  ...
  path('getbooks', views.get_books),
  path('addbook', views.add_book),
  path('updatebook/', views.update_book),
  path('deletebook/', views.delete_book)
]

Теперь давайте получим нашу среду, а сервер Django начался. Чтобы получить доступ к Manage.py Файл, вы должны быть в проекте Django bookstore_app каталог.

$ cd bookstore_app
$ pipenv shell
$ python manage.py runserver

Вы можете использовать Почтальон Чтобы проверить с одинаковыми свойствами JSON, но я буду использовать Curl Отказ

Пусть тесты начнутся 😀

Зарегистрируйте новый пользователь

Чтобы создать пользователя, мы сделаем Пост Запрос на localhost: 8000/Регистрация/ и прохождение полей имя пользователя , пароль1. , Пароль2. Вы можете передать Email поле Но это необязательно.

> Request

$ curl -X POST -H "Content-Type: application/json" -d '{"username":"testuser", "password1":"testpassword", "password2":"testpassword"}' localhost:8000/registration/

> Response:
   {"key":"1565c60a136420bc733b10c4a165e07698014acb"}

Вы также получаете токен аутентификации после успешного входа в систему localhost: 8000/login/ Прохождение полей имя пользователя и пароль Отказ Чтобы проверить остальные конечные точки, нам нужно доказать серверу, что мы действительными аутентифицированными пользователями. Итак, чтобы сделать это, мы поставим токен, который мы получили после регистрации в Авторизация Недвижимость в Заголовки Диктовать префикс фактического токена с Токен Отказ

Authorization: Token 1565c60a136420bc733b10c4a165e07698014acb

Добавить новую книгу Чтобы добавить книгу, мы делаем Пост Запрос на localhost: 8000/API/Доклад Прохождение полей заглавие , Описание , Автор (Идентификатор автора, который мы ранее создали)

> Request
$ curl -X POST -H "Authorization: Token 1565c60a136420bc733b10c4a165e07698014acb" -d '{"title":"CRUD Django", "description":"Walkthrough for CRUD in DJANGO", "author": 1}' localhost:8000/api/addbook 

> Response
   {"book": {
       "id": 1, 
       "title": "CRUD Django", 
       "description": "Walkthrough for CRUD in DJANGO", 
       "author": 1, 
       "added_by": 2, 
       "created_date": "2020-02-29T21:07:27.968463Z"
     }
   }

Получить все книги Чтобы получить все книги, мы сделаем Получить Запрос на Localhost: 8000/API/GetBooks. Это даст нам список всех книг, которые были добавлены в настоящее время вошедшим в систему пользователем.

> Request
$ curl -X GET -H "Authorization: Token 9992e37dcee4368da3f720b510d1bc9ed0f64fca" -d '' localhost:8000/api/getbooks

> Response
{"books": [
      {
        "id": 1, 
        "title": "CRUD Django", 
        "description": "Walkthrough for CRUD in DJANGO", 
        "author": 1, 
        "added_by": 2, 
        "created_date": "2020-02-29T21:07:27.968463Z"
       }
    ]
 }  

Обновите книгу ввода по ID Чтобы обновить книгу, мы делаем Поставить Запрос передачи я D из книги, которую мы хотим обновить как параметр на URL для localhost: 8000/API/UpdateBook/ Передача полей поля, которые вы хотите изменить.

> Request
$ curl -X PUT -H "Authorization: Token 9992e37dcee4368da3f720b510d1bc9ed0f64fca" -d '{"title":"CRUD Django Updated V2", "description":"Walkthrough for CRUD in DJANGO", "author": 1}' localhost:8000/api/updatebook/1

> Response
{"book": {
    "id": 1, 
    "title": "CRUD Django Updated V2", 
    "description": "Walkthrough for CRUD in DJANGO", 
    "author": 1, 
    "added_by": 2, 
    "created_date": "2020-02-29T21:07:27.968463Z"
  }
}  

Удалить запись в книгу по ID Удалить книгу, мы делаем Удалить Запрос передачи ID книги, которую мы хотим удалить как параметр на URL для localhost: 8000/API/DELETEBOOK/

> Request
$ curl -X DELETE -H "Authorization: Token 9992e37dcee4368da3f720b510d1bc9ed0f64fca" -d '' localhost:8000/api/deletebook/1  

Урай 🎉 У нас есть полностью функциональный Crud Django RESP API. Если вы тестируете, используя почтальон, вы можете работать в ответ на ошибку {"Деталь": "CSRF не удалось: Token CSRF отсутствует или неверно. "} , очистка cookie cookie по почтелю исправит вопрос.

Все наш код для последних двух (2) постов и данного поста:

  • Создайте простой отдых API с Django?
  • Добавьте аутентификацию в REST Framework Django API?
  • Построить API Crud Django REST API

Проживает в этом репозитории Github, Bookstore Django REST API

Спасибо за чтение. 😃

Оригинал: “https://dev.to/nobleobioma/build-a-crud-django-rest-api-46kc”