Django API REST:CreateAPIVi中的函数出现问题

2024-09-28 20:39:08 发布

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

我正在研究我的Django API Rest,但这对我来说是相当新的,我还有一个关于我的代码的问题。你知道吗

我一直在看书Django Rest Doc

-------------------------------------------------------------------------------------------------------------------------------------

第一部分-我的代码:

-------------------------------------------------------------------------------------------------------------------------------------

我有一个序列化程序.py描述我的ModelSerializer的文件如下:

class IndividuCreateSerializer(serializers.ModelSerializer) :
    class Meta :
        model = Individu
        fields = [
            'Etat',
            'Civilite',
            'Nom',
            'Prenom',
            'Sexe',
            'Statut',
            'DateNaissance',
            'VilleNaissance',
            'PaysNaissance',
            'Nationalite1',
            'Nationalite2',
            'Profession',
            'Adresse',
            'Ville',
            'Zip',
            'Pays',
            'Mail',
            'Telephone',
            'Image',
            'CarteIdentite',
            ]

    def create(self, validated_data):
       print('toto')
       obj = Individu.objects.create(**validated_data)
       Identity_Individu_Resume(self.context.get('request'), obj.id)
       return obj

这个create函数调用另一个函数,它不在我的API模块中,而是在我的主模块中:Identity_Individu_Resume

正如您在这里看到的,此函数接受最后创建的对象并应用多个进程:

@login_required
def Identity_Individu_Resume(request, id) :

    personne = get_object_or_404(Individu, pk=id)

    NIU = lib.Individu_Recherche.NIUGeneratorIndividu(personne)
    personne.NumeroIdentification = NIU

    if personne.Image != " " :
        NewImageName = 'pictures/' + personne.Nom +'_'+ personne.Prenom +'_'+  NIU + '.jpg'
        FilePath = settings.MEDIA_ROOT 
        FilePathOLD = settings.MEDIA_ROOT + str(personne.Image)
        FilePathNEW = settings.MEDIA_ROOT + NewImageName

        file = os.path.exists(FilePath)
        if file :
            os.rename(FilePathOLD, FilePathNEW)

        personne.Image = NewImageName

    if personne.CarteIdentite != " " :
        NewCarteName = 'Carte_Identite/' + 'Carte_Identite_' + personne.Nom +'_'+ personne.Prenom +'_'+  NIU + '.jpg'
        FilePath = settings.MEDIA_ROOT 
        FilePathOLD = settings.MEDIA_ROOT + str(personne.CarteIdentite)
        FilePathNEW = settings.MEDIA_ROOT + NewCarteName

        file = os.path.exists(FilePath)
        if file :
            os.rename(FilePathOLD, FilePathNEW)

        personne.CarteIdentite = NewCarteName

    else :
        pass

    personne.save()

    context = {
                "personne" : personne,
                "NIU" : NIU,
    }

    return render(request, 'Identity_Individu_Resume.html', context)

然后,我的API模块中有一个视图.py文件,该文件具有一个名为IndividuCreateAPIView的特定类,该类非常简单,可以调用上面描述的序列化程序类:

class IndividuCreateAPIView(CreateAPIView) :
    queryset = Individu.objects.all()
    serializer_class = IndividuCreateSerializer

然后我有了我的网址.py文件:

urlpatterns = [
    url(r'^$', IndividuListAPIView.as_view() , name="IndividuList"),
    url(r'^docs/', schema_view),
    url(r'^create/$', IndividuCreateAPIView.as_view() , name="Create"),
]

-------------------------------------------------------------------------------------------------------------------------------------

第二部分-使用API REST接口:

-------------------------------------------------------------------------------------------------------------------------------------

在这一部分中,我将API Rest接口与http://localhost:8000/Api/Identification/一起使用

enter image description here

当我创建一个对象时,我的序列化程序.py文件运行良好,我的数据库中有一个创建良好的对象:

enter image description here

所以没有问题!你知道吗

-------------------------------------------------------------------------------------------------------------------------------------

第三部分-将API REST与pythonic文件一起使用:

-------------------------------------------------------------------------------------------------------------------------------------

在这种情况下,我遇到了一个问题。你知道吗

我有一个文件API_create.py,它是从我的终端执行的,应该模拟一个试图连接到我的API并创建一个对象的外部应用程序。你知道吗

导入请求

url = 'http://localhost:8000/Api/Identification/create/'

filename1 = '/Users/valentin/Desktop/Django/DatasystemsCORE/Media/pictures/photo.jpg'
filename2 = '/Users/valentin/Desktop/Django/DatasystemsCORE/Media/Carte_Identite/carte_ID.gif'
files = {'Image' : open(filename1,'rb'), 'CarteIdentite': open(filename2,'rb')}

data = {
    "Etat": "Vivant",
    "Civilite": "Monsieur",
    "Nom": "creation",
    "Prenom": "via-api",
    "Sexe": "Masculin",
    "Statut": "Célibataire",
    "DateNaissance": "1991-11-23",
    "VilleNaissance": "STRASBOURG",
    "PaysNaissance": "FR",
    "Nationalite1": "FRANCAISE",
    "Nationalite2": "",
    "Profession": "JJJ",
    "Adresse": "12, rue des fleurs",
    "Ville": "STRASBOURG",
    "Zip": 67000,
    "Pays": "FR",
    "Mail": "",
    "Telephone": ""
    }

response = requests.post(url, files=files, data=data)

print(response.text)

但是,当我执行这个脚本时,我的对象被很好地创建了,但是我的脚本中的函数create序列化程序.py不叫!你知道吗

在这种情况下,我得到:

enter image description here

我的问题是:为什么create函数不起作用?我不明白,因为我的网址是正确的,应该调用这个函数,以取代我的牛(空)生成的牛和改变图片名称太。。。你知道吗

你能帮我找出它为什么不起作用吗?你知道吗


Tags: 文件对象函数pyimageapidatasettings
1条回答
网友
1楼 · 发布于 2024-09-28 20:39:08

这可能是因为login_required视图中的Identity_Individu_Resume装饰器。您可以尝试删除它,或者需要为auth token提供请求:response = requests.post(url, files=files, data=data, headers={'Authorization': 'Token <MY_TOKEN>'})。你知道吗

升级版

实际上,我认为最好将api和非api视图的公共部分移到第三个函数中,并分别从两个视图中调用它。在这种情况下,您可能也想将login_required添加到IndividuCreateAPIView视图中。在这种情况下,您需要添加IsAuthenticated权限,如下所示:

from rest_framework.permissions import IsAuthenticated
class IndividuCreateAPIView(CreateAPIView) :
    queryset = Individu.objects.all()
    serializer_class = IndividuCreateSerializer
    permission_classes = (IsAuthenticated,)

相关问题 更多 >