python - Django Rest Framework 隐藏 JSON 数据
问题描述
我刚刚开始学习 Django Rest Framework。我想隐藏当我们转到其 url 时可见的 api,以便在他们输入该 url 时没有人可以看到任何数据。我只需要 url 来发布数据(例如,来自会员表格...姓名电子邮件和其他东西)。我怎样才能做到这一点。这里的大多数问题只涉及隐藏他们使用 JSONRenderer 的可浏览 api,但我想完全删除 JSON。如果我想错了方向,请务必告诉我。这背后的想法是,我不希望通过该 url 向每个人询问我向用户询问的信息。我尝试通过以下方式实现这一目标。这是这样做的好方法还是会弄乱应用程序,因为我没有看到任何错误并且发布请求正在工作。我在前端使用 React。这是我第一次发布问题。请告诉您是否需要任何其他信息。提前非常感谢。
我只在第一个if块 {if request.method == 'GET':} 中完成了此操作,我返回了一个字符串而不是 serializer.data,现在每当我转到 membersform/ 它只显示“serializer.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 members_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
member_id是2021S00None,这里 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
# [...]
关于membership_id
从日期、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()
推荐阅读
- javascript - 错误:您无法渲染
在另一个里面 . 你的应用程序中不应该有多个 - sql - 实体中的字段可以受到多个约束吗?
- node.js - 如果存在,如何更新文档,如果在 mongodb 中不存在,如何将其插入?
- java - 在 build fat jar 中添加 java spark 代码单元测试使 spark 稍后运行失败
- php - PHP 严格标准:静态函数 DatabaseHandler::init
- python - 为什么我不能从 Plotly 写入 /var/www/html/index.html?
- excel - VBA 语法 - 带有 IF 语句的 Vlookup
- excel - 统计个人占据排行榜的条款数
- php - Storage::put() 在 Linux 服务器上不起作用
- github - 如何从 github CLI 或 API 将团队添加到 GitHub Enterprise Org?