我正在处理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/
当我创建一个对象时,我的serializers.py文件中的create function
运行良好,我在我的数据库中获得了一个创建良好的对象:
所以没有问题!
-------------------------------------------- -------------------------------------------------- --------------------------------------
第三部分 - 将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
没有被调用!
在这种情况下,我得到了:
我的问题是:为什么我的创建功能不起作用?我不明白因为我的网址是正确的,应该调用此函数以便用生成的NIU替换我的NIU(NULL)并更改图片名称......
你能帮我找到它为什么不起作用吗?
答案 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,)