在今天的帖子中,我们将分解体系结构的中间部分(称为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,将其更改为您在模型中放置的字段):
3.创建串行序列
如果您在Curl或Postman中点击了创建的用户列表API,您将看到响应JSON显示了用户的每个字段的null值:
{
"username": null,
"phone" : null
}
这很奇怪,因为在您的Cypher-shell或Neo4J桌面应用中,如果运行以下命令,则会在其中显示节点:
MATCH (n:NeoUser) RETURN n LIMIT 25
产生:
当我们在数据库中进行查询时,我们需要“序列化”它,这将数据库的保存位转换为每个数据的各自数据类型。此外,我们的注册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的身份验证中的用户身份验证。保重并暂时再见。