使用Django和Neo4J数据库创建API的明确指南,第2部分
#初学者 #python #django #neomodel

在今天的帖子中,我们将分解体系结构的中间部分(称为this post)。总而言之,我们需要为每个API URL创建视图。首先,您要做的就是在应用程序文件夹中创建一个名为“ urls.py”的文件。在您的项目的URL.PY文件中,在管理页面的URL下添加以下行:

path('', include('yourappname.urls')),

通过此命令为您的Django项目创建超级用户:

python manage.py createsuperuser

并为管理员提供您的用户名和密码。

1.注册API视图和URL

您的第一份工作是导入Views.py文件中的所有依赖项和模型。


from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .models import NeoUser

响应以JSON格式返回API响应,并且需要在查询时所需的HTTP代码状态。

现在,您需要捕获API请求的字段并检查空字段。我们正在使用Django的基于类的视图(CBV)。当我们将数据发布到数据库时,请求类型将发布,因此函数。


class SignUp(APIView):
    def post(self, request):
        username = request.data.get('username')
        email = request.data.get('email')
        password = request.data.get('password')

        if not username or not email or not password:
            return Response({"error": "Please provide username, 
       email, and password."}, status=status.HTTP_400_BAD_REQUEST)

最后一步是将数据保存为节点,并将响应返回为HTTP代码:

       try:
            user = User.nodes.get(username=username)
            return Response({"error": "Username already exists."}, status=status.HTTP_409_CONFLICT)
        except User.DoesNotExist:
            user = User(username=username, email=email, password=hashed_password)
            user.save()
            return Response({"message": "User created successfully."}, status=status.HTTP_201_CREATED)

有几件事要记住:

  • 用于创建对象或节点,返回HTTP代码201
  • 对于成功查询,返回HTTP代码200
  • 对于不良请求或在不遵守规则的情况下发送请求,返回HTTP代码400
  • 对于未经授权的请求,返回HTTP代码401
  • 最后,返回HTTP代码404

现在转到您的应用程序的urls.py文件,并为您创建的视图添加URL:

from django.urls import path
from . import views

urlpatterns = [
    path('api/signup', views.UserSignupView.as_view(), name='user-signup'),


]

2.用户API视图和URL

我们将从数据库中检索数据,因此我们需要实现GET请求。其余步骤就像上一节。

views.py

class UserListView(APIView):


    def get(self, request):
        users = NeoUser.nodes.all()
        if not users:
            return Response({"message": "No users found"}, status=status.HTTP_404_NOT_FOUND)
        return Response(users, status=status.HTTP_200_OK)

现在在您的app/urls.py中,在注册URL之后立即添加以下行:

...

path('api/userlist/', views.UserListView.as_view(), name='user-list'),

您现在制作了2个API。在运行Django服务器时,像以下方式一样在邮递员中击中它们(我的字段在模型中名为fullname,将其更改为您在模型中放置的字段):

sign up

3.创建串行序列

如果您在Curl或Postman中点击了创建的用户列表API,您将看到响应JSON显示了用户的每个字段的null值:

{
"username": null,
"phone" : null
}

这很奇怪,因为在您的Cypher-shell或Neo4J桌面应用中,如果运行以下命令,则会在其中显示节点:


MATCH (n:NeoUser) RETURN n LIMIT 25

产生:

cypher

当我们在数据库中进行查询时,我们需要“序列化”它,这将数据库的保存位转换为每个数据的各自数据类型。此外,我们的注册API还有验证步骤,例如不使用相同的用户名或电话号码注册。我们可以在视图中或在序列化器内部执行此操作。我将在我们的序列化器中显示此过程。在应用程序的文件夹中创建一个serializer.py。这是为您的用户数据制作序列化器的步骤:

  • 导入REST Framework的序列化器类和模型
from rest_framework import serializers
from .models import NeoUser
  • 序列化模型的每个字段
class Neo4jUserSerializer(serializers.Serializer):
    username = serializers.CharField()
    email = serializers.CharField()
    phone = serializers.CharField()
    password = serializers.CharField()
  • 验证并检查重复项
def validate(self, data):
        id = data.get('uid')
        username = data.get('username')
        email = data.get('email')
        phone = data.get('phone')

        if NeoUser.nodes.filter(username=username):
            raise serializers.ValidationError("Username already 
                    exists")
...
        return data
  • 使用已验证的数据创建一个QuerySet
def create(self, validated_data):       
        username = validated_data.get('fullname')
        email = validated_data.get('email')
        password = validated_data.get('password')
        phone = validated_data.get('phone')
  • 用QuerySet创建一个节点并保存节点
        neo_user = NeoUser(uid=id,fullname=username, email=email,password=password,emp_id=emp_id,phone=phone)
        neo_user.save()

       # don't forget to return the queryset

       return validated_data

整个Seializer代码在这里:

from rest_framework import serializers
from .models import NeoUser

class Neo4jUserSerializer(serializers.Serializer):
    username = serializers.CharField()
    email = serializers.CharField()
    phone = serializers.CharField()
    password = serializers.CharField()

def validate(self, data):
        id = data.get('uid')
        username = data.get('username')
        email = data.get('email')
        phone = data.get('phone')

        if NeoUser.nodes.filter(username=username):
            raise serializers.ValidationError("Username already 
                    exists")
        # other field's duplicate checking
        return data

def create(self, validated_data):       
        username = validated_data.get('fullname')
        email = validated_data.get('email')
        password = validated_data.get('password')
        phone = validated_data.get('phone')

    neo_user = NeoUser(uid=id,fullname=username, email=email,password=password,emp_id=emp_id,phone=phone)
        neo_user.save()

       return validated_data

4.在视图中添加序列化器

我们快要完成了。您要做的就是在您以前创建的视图中添加序列化器。在注册API中,您必须在保存之前进行有效性检查。

class UserSignupView(APIView):
    def post(self, request):

      if request.method == 'POST':
        serializer = Neo4jUserSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response({"message": "User registered successfully", "status": 200}, status=status.HTTP_201_CREATED)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

对于用户列表API,您将节点对象传递到序列化器中,并且序列化器将为您返回序列化节点:

class UserListView(APIView):

    def get(self, request):
        users = NeoUser.nodes.all()
        if not users:
            return Response({"message": "No users found"}, status=status.HTTP_404_NOT_FOUND)
        serializer = Neo4jUserSerializer(users, many=True)
        return Response(serializer.data, status=status.HTTP_200_OK)

您现在可以将数据视为将数据保存在模型中的方式:


{
    username: 'user 1',
    phone: '01666666666'
}

按照以下步骤,您可以自己制作自己的登录API。如果您面临任何问题,请在下面的评论中告诉我。在下一篇文章中,我们将学习一个重要的主题 - 基于JWT的身份验证中的用户身份验证。保重并暂时再见。