IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

AttributeError: 'NoneType' object has no attribute 'get' dans request_json


Sujet :

Python

  1. #1
    apt
    apt est déconnecté
    Membre régulier
    Inscrit en
    Mai 2002
    Messages
    867
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 867
    Points : 118
    Points
    118
    Par défaut AttributeError: 'NoneType' object has no attribute 'get' dans request_json
    Bonjoue à tous,

    J'ai le code python suivant :

    main.py :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    @APP.route('/auth', methods=['POST'])
    def auth():
        """
        Create JWT token based on email.
        """
        request_data = request.get_json()
        if request_data is None:
            print("request returned None")
        else:
            print("doing somethings")
        email = request_data.get('email')
        password = request_data.get('password')
        if not email:
            LOG.error("No email provided")
            return jsonify({"message": "Missing parameter: email"}, 400)
        if not password:
            LOG.error("No password provided")
            return jsonify({"message": "Missing parameter: password"}, 400)
        body = {'email': email, 'password': password}
     
        user_data = body
        print('user_data : ',user_data)
        #return jsonify(token=_get_jwt(user_data).decode('utf-8'))
        return jsonify(token=_get_jwt(user_data))
     
     
    @APP.route('/contents', methods=['GET'])
    def decode_jwt():
        """
        Check user token and return non-secret data
        """
        if not 'Authorization' in request.headers:
            abort(401)
        data = request.headers['Authorization']
        token = str.replace(str(data), 'Bearer ', '')
        try:
            data = jwt.decode(token, JWT_SECRET, algorithms=['HS256'])
        except: # pylint: disable=bare-except
            abort(401)
        response = {'email': data['email'],
                    'exp': data['exp'],
                    'nbf': data['nbf'] }
        return jsonify(**response)
     
     
    def _get_jwt(user_data):
        exp_time = datetime.datetime.utcnow() + datetime.timedelta(weeks=2)
        payload = {'exp': exp_time,
                   'nbf': datetime.datetime.utcnow(),
                   'email': user_data['email']}
        return jwt.encode(payload, JWT_SECRET, algorithm='HS256')
     
     
    if __name__ == '__main__':
        APP.run(host='127.0.0.1', port=8080, debug=True)
    exécuté sous un conteneur docker.

    L'image docker est créée avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    docker build --tag jwt-api-test .
    et exécutée avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    80:8080 --env-file=.env_file jwt-api-test


    .env_file:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    JWT_SECRET='myjwtsecret'
    LOG_LEVEL=DEBUG
    Et dans la fenêtre du terminal, ou il a été exécuté le conteneur Docker, je peux lire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      File "/app/main.py", line 84, in auth    email = request_data.get('email')
    AttributeError: 'NoneType' object has no attribute 'get'
    Et quand je teste dans un deuxième terminal, la commande Curl suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    export TOKEN=`curl --data '{"email":"test@test.com","password":"pass"}' --header "Content-Type: application/json" -X POST localhost:80/auth  | jq -r '.token'`
    je reçois l'erreur :



    ou parfois :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    parse error: Invalid numeric literal at line 1, column 10
    je crois que request_data est toujours à none, pourtant les paramètres sont bien passés dans le test curl ?

    Merci de votre aide.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par apt Voir le message
    pourtant les paramètres sont bien passés dans le test curl ?
    Si ça ne marche pas avec curl, c'est que vous n'êtes pas clair sur les paramètres à passer (ou que le problème est "ailleurs"). Lire la plus ou moins bonne traduction en Python de ce qui ne marche pas avec curl n'apportera pas grand chose (on ne va pas inventer les données à passer, ni regarder ce qu'il se passe côté serveur).

    Par contre, si vous codez un truc comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        if request_data is None:
            print("request returned None")
        else:
            print("doing somethings")
        email = request_data.get('email')
    ça sert à quoi de tester si le retour est None si on fait comme s'il ne l'était pas?

    Pas étonnant qu'on ait le message d'erreur "AttributeError: 'NoneType' object has no attribute 'get'" qui est la question de base.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    apt
    apt est déconnecté
    Membre régulier
    Inscrit en
    Mai 2002
    Messages
    867
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 867
    Points : 118
    Points
    118
    Par défaut
    Bonjour wiztricks,

    Le code principal est utilisé pour, en premier, créer le jeton jwt, constitué d'un email et d'un mot de passe, dans le cas d'un POST, avec la terminaison '/auth', et dans une deuxième étape, en GET, décrypter ce jeton.


    Le bout de code que tu m'as parlé, je l'ai ajouté pour tester s'il y a bien récupération, en json, dans request_data, de l'email et le mot de passe, passés en paramètre.

    Voici, un nouveau LOG, du test curl (une nouvelle erreur !!) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    export TOKEN=`curl --data '{"email":"test@test.com","password":"pass"}' --header "Content-Type: application/json" -X POST localhost:80/auth  | jq -r '.token'`

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    2021-07-30 22:30:27,569 - main - ERROR - Exception on /auth [POST]Traceback (most recent call last):
      File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 2447, in wsgi_app
        response = self.full_dispatch_request()
      File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1952, in full_dispatch_request
        rv = self.handle_user_exception(e)
      File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1821, in handle_user_exception
        reraise(exc_type, exc_value, tb)
      File "/usr/local/lib/python3.7/site-packages/flask/_compat.py", line 39, in reraise
        raise value
      File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1950, in full_dispatch_request
        rv = self.dispatch_request()
      File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1936, in dispatch_request
        return self.view_functions[rule.endpoint](**req.view_args)
      File "/app/main.py", line 85, in auth
        return jsonify(token=_get_jwt(user_data))
      File "/usr/local/lib/python3.7/site-packages/flask/json/__init__.py", line 370, in jsonify
        dumps(data, indent=indent, separators=separators) + "\n",
      File "/usr/local/lib/python3.7/site-packages/flask/json/__init__.py", line 211, in dumps
        rv = _json.dumps(obj, **kwargs)
      File "/usr/local/lib/python3.7/json/__init__.py", line 238, in dumps
        **kw).encode(obj)
      File "/usr/local/lib/python3.7/json/encoder.py", line 199, in encode
        chunks = self.iterencode(o, _one_shot=True)
      File "/usr/local/lib/python3.7/json/encoder.py", line 257, in iterencode
        return _iterencode(o, 0)
      File "/usr/local/lib/python3.7/site-packages/flask/json/__init__.py", line 100, in default
        return _json.JSONEncoder.default(self, o)
      File "/usr/local/lib/python3.7/json/encoder.py", line 179, in default
        raise TypeError(f'Object of type {o.__class__.__name__} '
    TypeError: Object of type bytes is not JSON serializable
    EDIT :
    Apres un moment voici ce qui affiché dans le terminal ou dans l'application docker (LOG) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    [2021-07-30 22:40:43 +0000] [1] [CRITICAL] WORKER TIMEOUT (pid:12)
     
     
     
    doing somethings
     
     
    user_data : {'email': 'test@test.com', 'password': 'pass'}
     
     
    doing somethings
     
     
    user_data : {'email': 'test@test.com', 'password': 'pass'}
     
     
    doing somethings
     
     
    user_data : {'email': 'test@test.com', 'password': 'pass'}
     
     
    [2021-07-30 22:40:43 +0000] [12] [INFO] Worker exiting (pid: 12)
     
     
    [2021-07-30 22:40:43 +0000] [13] [INFO] Booting worker with pid: 13
     
     
    2021-07-30 22:40:43,208 - main - DEBUG - Starting with log level: DEBUG

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Ici, l'erreur Object of type bytes is not JSON serializable, s'applique à l'instruction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jsonify(token=_get_jwt(user_data))
    .
    A vous d'en faire quelque chose car on ne va pas reprendre la logique de votre code pour imaginer ce que vous avez fait de travers.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. [Python 3.X] AttributeError: 'NoneType' object has no attribute 'write'
    Par myth2104 dans le forum Général Python
    Réponses: 2
    Dernier message: 07/07/2015, 01h37
  2. Réponses: 3
    Dernier message: 04/03/2014, 22h41
  3. Réponses: 2
    Dernier message: 06/07/2012, 19h38
  4. AttributeError "nonetype" object has no attribute
    Par Invité dans le forum Général Python
    Réponses: 2
    Dernier message: 14/12/2010, 20h49
  5. Réponses: 2
    Dernier message: 26/05/2006, 14h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo