Django API REST:CreateAPIView

时间:2018-02-21 09:10:46

标签: python django rest django-rest-framework

我正在处理Django API Rest,但这对我来说很新,我还有一个关于我的代码的问题。

我一直在阅读Django Rest Doc

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

第一部分 - 我的代码:

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

我有一个 serializer.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模块中有一个 views.py 文件,其中包含一个名为IndividuCreateAPIView的特定类,该文件非常简单,并且上面描述了我的序列化程序类:

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

然后我有 urls.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

当我创建一个对象时,我的serializers.py文件中的create function运行良好,我在我的数据库中获得了一个创建良好的对象:

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)

但是,当我执行这个脚本时,我的对象是很好的创建但是我的serializers.py中的函数create没有被调用!

在这种情况下,我得到了:

enter image description here

我的问题是:为什么我的创建功能不起作用?我不明白因为我的网址是正确的,应该调用此函数以便用生成的NIU替换我的NIU(NULL)并更改图片名称......

你能帮我找到它为什么不起作用吗?

1 个答案:

答案 0 :(得分:1)

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

<强> UPD

实际上我认为将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,)