我正在研究我的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/
一起使用
当我创建一个对象时,我的序列化程序.py文件运行良好,我的数据库中有一个创建良好的对象:
所以没有问题!你知道吗
-------------------------------------------------------------------------------------------------------------------------------------
第三部分-将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不叫!你知道吗
在这种情况下,我得到:
我的问题是:为什么create函数不起作用?我不明白,因为我的网址是正确的,应该调用这个函数,以取代我的牛(空)生成的牛和改变图片名称太。。。你知道吗
你能帮我找出它为什么不起作用吗?你知道吗
这可能是因为
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
权限,如下所示:相关问题 更多 >
编程相关推荐