Python Django Rest API:使用令牌身份验证将当前用户添加到用户字段

Python Django Rest API:使用令牌身份验证将当前用户添加到用户字段,python,django,django-rest-framework,jwt,Python,Django,Django Rest Framework,Jwt,要求: Python 3.7 Django 2.0 我正在处理我的Django Rest API,我想在创建对象但不知道时将当前用户添加到我的用户字段中 我正在对API Rest使用JWT身份验证 我回答了这个问题: 但它似乎与我的代码不兼容 我有我的序列化程序.py文件: class IndividuCreateSerializer(serializers.ModelSerializer) : class Meta : model = Individu

要求:

Python 3.7
Django 2.0
我正在处理我的
Django Rest API
,我想在创建对象但不知道时将当前用户添加到我的用户字段中

我正在对API Rest使用JWT身份验证

我回答了这个问题:

但它似乎与我的代码不兼容

我有我的序列化程序.py文件:

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',
            'Utilisateur',
            'Image',
            'CarteIdentite',
            ]

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

   permission_classes = (IsAuthenticated,)
   authentication_classes = (JSONWebTokenAuthentication,)
   queryset = Individu.objects.all()
   serializer_class = IndividuCreateSerializer

   def user_create(self,serializer):
      serializer.validated_data['Utilisateur'] = self.request.user
      return super(IndividuCreateAPIView, self).user_create(serializer)
和我的/Api/views.py文件:

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',
            'Utilisateur',
            'Image',
            'CarteIdentite',
            ]

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

   permission_classes = (IsAuthenticated,)
   authentication_classes = (JSONWebTokenAuthentication,)
   queryset = Individu.objects.all()
   serializer_class = IndividuCreateSerializer

   def user_create(self,serializer):
      serializer.validated_data['Utilisateur'] = self.request.user
      return super(IndividuCreateAPIView, self).user_create(serializer)
为了尝试我的API,我配置了一个pythonic文件,它与其他web应用程序的工作相同

此文件看起来像:

import requests

mytoken = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6IkFkbWluIiwiZXhwIjoxNTE5Mzc4MDExLCJlbWFpbCI6InZhbGVudGluQGRhdGFzeXN0ZW1zLmZyIiwib3JpZ19pYXQiOjE1MTkzNzQ0MTF9.7AKpbNEcdir2FLU064QzwwZGiylV-P7LBm1nOJIekwE"
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, headers={'Authorization': 'JWT {}'.format(mytoken)})

print(response.text)
我的对象创建良好,但我的用户字段为空。 我如何编写此代码以便将当前用户添加到用户字段中


谢谢大家!

您可以将当前用户直接传递到序列化程序的save方法内部视图:

class IndividuCreateAPIView(CreateAPIView) :

   permission_classes = (IsAuthenticated,)
   authentication_classes = (JSONWebTokenAuthentication,)
   queryset = Individu.objects.all()
   serializer_class = IndividuCreateSerializer

   def perform_create(self,serializer):
      serializer.save(Utilisateur=self.request.user)

您可以将当前用户直接传递到序列化程序的内部视图中的save方法:

class IndividuCreateAPIView(CreateAPIView) :

   permission_classes = (IsAuthenticated,)
   authentication_classes = (JSONWebTokenAuthentication,)
   queryset = Individu.objects.all()
   serializer_class = IndividuCreateSerializer

   def perform_create(self,serializer):
      serializer.save(Utilisateur=self.request.user)

您可以将其他参数传递给序列化程序的save方法。这里的检查示例:我试图编写以下代码:
defsave(self):返回{'usilisateur':self.request.user}
,但它似乎不起作用。我正在搜索Yet您需要将其作为视图的
create
方法中的
save
参数传递。您可以将其他参数传递给序列化程序的save方法。这里的检查示例:我试图编写以下代码:
defsave(self):返回{'usilisateur':self.request.user}
,但它似乎不起作用。我正在搜索Yet您需要将其作为视图的
create
方法中的
save
参数传递。我尝试了,但用户字段仍然没有填充。根据我的authentificate方法,是否有可能出现此问题?@Deadpool Is
usilimateur
您是否试图填写此字段?或者您有其他型号的字段
用户
?在这种情况下,您需要将此字段添加到序列化程序中,并将用户作为save的kwarg
serializer.save(user=self.request.user)传递给save。
@Deadpool您的用户是否经过身份验证?如果添加
打印(self.request.user
to
perform\u create
你看到匿名用户的用户实例了吗?我的用户通过JWT进行了身份验证。因此我假设他通过python文件中的相关令牌进行了很好的身份验证。我犯了一个错误,将
perform\u create
写入了错误的位置!你的脚本似乎工作得很好!非常感谢!我将把我的项目作为一个开源项目,我正在搜索Django Developer,以便与我一起改进这个软件;)我尝试过,但用户字段仍然没有填充。根据我的authentificate方法,是否有可能出现此问题?@Deadpool是
usilimateur
是您尝试填充的字段?或者您有其他模型的字段
User
?在这种情况下,您需要将此字段添加到序列化程序中,并将用户作为save的kwarg
serializer.save传递给用户(user=self.request.user)
@Deadpool您的用户是否经过身份验证?如果添加
打印(self.request.user
to
perform\u create
你看到匿名用户的用户实例了吗?我的用户通过JWT进行了身份验证。因此我假设他通过python文件中的相关令牌进行了很好的身份验证。我犯了一个错误,将
perform\u create
写入了错误的位置!你的脚本似乎工作得很好!非常感谢!我将把我的项目作为一个开源项目,我正在搜索Django Developer,以便与我一起改进这个软件;)