【发布时间】:2021-08-03 19:56:45
【问题描述】:
我刚开始学习 Django Rest Framework。我想隐藏当我们转到其 url 时可见的 api,这样当他们输入该 url 时,没有人可以看到任何数据。我只需要 url 来发布数据(例如,来自会员表格......姓名电子邮件和其他东西)。我怎样才能做到这一点。这里的大多数问题只涉及隐藏他们使用 JSONRenderer 的可浏览 api,但我想完全删除 JSON。如果我想错了方向,请务必告诉我。这背后的想法是,我不希望通过该 url 向每个人询问我向用户询问的信息。我尝试通过以下方式实现这一目标。这是这样做的好方法还是会弄乱应用程序,因为我没有看到任何错误并且发布请求正在工作。我在前端使用 React。这是我第一次发布问题。请告诉您是否需要任何其他信息。提前非常感谢。
我只在第一个 if 块 {if request.method == 'GET':} 中完成了此操作,我返回了一个字符串而不是 serializer.data,现在每当我转到 membersform/它只显示“serializer.data”而不是所有对象。
views.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)
models.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 members_type 和 id(pk) 的格式(例如:2021B000001),所以我在 POST 方法 if block 中实现了它。这是这样做的正确方法还是有其他方法?非常感谢你的帮助。任何建议都会有所帮助,因为我仍在学习 Django,并且觉得我只是在蛮力地通过一些东西。
编辑:这是更新的 models.py 和 views.py
models.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
views.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 是 2021S00None ,这里 None 应该是 id(pk)。
【问题讨论】:
标签: python django api django-rest-framework django-views