Django Rest框架隐藏JSON数据

2024-09-30 04:39:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚刚开始学习Django Rest框架。我想隐藏当我们转到其url时可见的api,以便任何人在输入该url时都看不到任何数据。我只需要一个url来发布数据(例如,从会员表格…名称电子邮件等)。我怎样才能做到这一点。这里的大多数问题只涉及隐藏可浏览的api,他们使用JSONRenderer,但我想完全删除JSON。请告诉我我是否想错了方向。这背后的想法是,我不希望我要求用户提供的信息通过该url对每个人都可见。我试着通过以下方式实现这一点。这是一种很好的方法,还是会把应用程序搞砸,因为我看不到任何错误,post请求正在工作。我使用React作为前端。这是我第一次发布问题。如果您需要任何其他信息,请告知。先谢谢你

我只在第一个if块{if request.method=='GET':}中执行了此操作,我返回了一个字符串而不是serializer.data,现在每当我转到membershipform/时,它只显示“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,它遵循年度成员类型和id(pk)的格式(例如:2021B00001),因此我在block的POST方法中实现了它。这是正确的方法还是有其他方法?非常感谢你的帮助。任何建议都会对我很有帮助,因为我还在学习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

成员身份为2021S000none,此处无应为身份(pk)


Tags: iddatareturnifmodelsresponserequeststatus
1条回答
网友
1楼 · 发布于 2024-09-30 04:39:26

如果不需要访问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字段,您所做的可能会起作用,但是如果您不需要仅针对此特定视图而总是针对您的模型的行为,那么您可以在模型级别通过overriding predefined ^{} model method来做。这样,您就不必为创建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()

相关问题 更多 >

    热门问题