Django Rest Framework隐藏JSON数据



我刚刚开始学习Django Rest Framework。我想隐藏当我们访问其url时可见的api,这样无论何时输入该url,都不会有人看到任何数据。我只需要url来发布数据(例如会员表格…姓名电子邮件之类的(。我怎样才能做到这一点。这里的大多数问题只讨论了隐藏他们使用JSONRenderer的可浏览api,但我想完全删除JSON。请告诉我我是不是想错了方向。这背后的想法是,我不希望我从用户那里询问的信息通过该url对每个人都可见。我试图通过以下方式实现这一点。这是一种很好的方法吗?还是会把应用程序搞砸,因为我没有看到任何错误,并且发布请求正在工作。我使用React作为前端。这是我第一次发布问题。如果您需要任何其他信息,请告知。提前非常感谢。

我只在第一个if块{ifrequest.method=='GET':}中做过这件事,我返回了一个字符串而不是serializer.data,现在每当我转到membershipform/时,它只显示";串行器.data";而不是所有对象。

视图.py

class CsrfExemptSessionAuthentication(SessionAuthentication):
def enforce_csrf(self, request):
return 
@api_view(['GET', 'POST'])
@authentication_classes([CsrfExemptSessionAuthentication, BasicAuthentication])
def memberform_list(request):
if request.method == 'GET':
memberform = Memberform.objects.all()
serializer = MemberformSerializer(memberform, many=True)
return Response("serializer.data")
elif request.method == 'POST':
serializer = MemberformSerializer(data=request.data)
if serializer.is_valid():
instance = serializer.save()
# creating a membershipid
fid = instance.id
strid = str(fid)
temp = '{:>06}'
if len(strid) <= 6:
memstrid = temp.format(strid)
else:
memstrid = strid
memyear = str(instance.created_at.year)
memtype = instance.membership_type[0]
memid = memyear + memtype + memstrid
instance.membership_id = memid
instance.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

@api_view(['GET', 'PUT', 'DELETE'])
@authentication_classes([CsrfExemptSessionAuthentication, BasicAuthentication])
def memberform_detail(request, pk):
try:
memberform = Memberform.objects.get(pk=pk)
except Memberform.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
if request.method == 'GET':
serializer = MemberformSerializer(memberform)
return Response(serializer.data)
elif request.method == 'PUT':
serializer = MemberformSerializer(memberform, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
elif request.method == 'DELETE':
memberform.delete()
return Response(status=status.HTTP_204_NO_CONTENT)

型号.py

class Memberform(models.Model):
id = models.AutoField(primary_key=True)
created_at = models.DateTimeField(auto_now_add=True)
membership_id = models.CharField(max_length=13, null=True)
name = models.CharField(max_length=500)
email = models.CharField(max_length=200, unique=True)
alt_email = models.CharField(max_length=1500)
designation = models.CharField(max_length=500)
qualification = models.CharField(max_length=500)
specialization = models.CharField(max_length=500)
institute_university = models.CharField(max_length=1000)
institute_city = models.CharField(max_length=500)
institute_state = models.CharField(max_length=500)
institute_pincode = models.CharField(max_length=1000)
permanent_address = models.CharField(max_length=1000)
permanent_address_city = models.CharField(max_length=1000)
permanent_address_state = models.CharField(max_length=1000)
permanent_address_pincode = models.CharField(max_length=1000)
mobile = models.CharField(max_length=50)
official_phone = models.CharField(max_length=50)
membership_type = models.CharField(max_length=50)
research_interests = models.CharField(max_length=1500)
def __str__(self):
return self.name

此外,我想创建一个成员身份id,其格式为year-membership_type和id(pk((例如:2021B000001(,因此我在POST方法if block中实现了它。这是一种正确的方法吗?或者还有其他方法吗?非常感谢你的帮助。任何建议都会很有帮助,因为我还在学习Django,感觉自己只是在强行学习。

编辑:这是更新的models.py和views.py

型号.py

class Memberform(models.Model):
id = models.AutoField(primary_key=True)
created_at = models.DateTimeField(default=datetime.datetime.now)
membership_id = models.CharField(max_length=20, null=True)
membership_type = models.CharField(max_length=50)
....rest of the fields
def save(self, *args, **kwargs):
strid = str(self.id)
if len(strid) <= 6:
memstrid = '{:>06}'.format(strid)
else:
memstrid = strid
memyear = str(datetime.datetime.now().year)
memtype = self.membership_type[0] if self.membership_type else ""
memid = memyear + memtype + memstrid
self.membership_id = memid
super().save(*args, **kwargs)
def __str__(self):
return self.name

视图.py

@api_view(['GET', 'POST'])
@authentication_classes([CsrfExemptSessionAuthentication, BasicAuthentication])
def memberform_list(request):
if request.method == 'GET':
memberform = Memberform.objects.all()
serializer = MemberformSerializer(memberform, many=True)
return Response(serializer.data)
elif request.method == 'POST':
serializer = MemberformSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

@api_view(['GET', 'PUT', 'DELETE'])
@authentication_classes([CsrfExemptSessionAuthentication, BasicAuthentication])
def memberform_detail(request, pk):
try:
memberform = Memberform.objects.get(pk=pk)
except Memberform.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
if request.method == 'GET':
serializer = MemberformSerializer(memberform)
return Response(serializer.data)
elif request.method == 'PUT':
serializer = MemberformSerializer(memberform, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
elif request.method == 'DELETE':
memberform.delete()
return Response(status=status.HTTP_204_NO_CONTENT)

这是我发布请求时得到的回复,发布请求后的响应

created_at: "2021-05-14T02:29:21.105382Z"
id: 31
membership_id: "2021S00None"
membership_type: "Silver"
...rest of the data

membership_id是202100None,这里None应该是id(pk(。

如果您不需要访问Memberform列表,而只需要为该视图创建一个Memberform,则可以从视图支持的方法中删除'GET'

@api_view(['POST'])
@authentication_classes([CsrfExemptSessionAuthentication, BasicAuthentication])
def memberform_list(request):
serializer = MemberformSerializer(data=request.data)
if serializer.is_valid():
instance = serializer.save()
# creating a membershipid
# [...]

关于根据日期、id和类型字段构建的membership_id字段,您所做的可能会起作用,但如果您不需要仅针对该特定视图而始终针对模型的行为,则可以在模型级别通过重写预定义的save()模型方法来实现。这样,您就不必为创建Memberform对象的其他视图重复该字段创建。

class Memberform(models.Model):
# your fields
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
if not self.membership_id:
strid = str(self.id)
if len(strid) <= 6:
memstrid = '{:>06}'.format(strid)
else:
memstrid = strid
memyear = str(self.created_at.year)
memtype = self.membership_type[0] if self.membership_type else ""
memid = memyear + memtype + memstrid
self.membership_id = memid
member_form = Memberform.objects.get(id=self.id)
member_form.membership_id = self.membership_id
member_form.save()

最新更新