2017-09-22 1 views
0

Impossible de trouver une question liée à ce problème. Je le fais probablement de la mauvaise manière parce que je suis sûr qu'il doit y avoir un moyen plus facile d'y parvenir, mais je ne pouvais pas encore le comprendre.Comment retourner un objet Python via Jinja2 à Python?

-> J'essaye de ramener un objet Python de Jinja2 à Python, donc je peux revenir en arrière sur ses valeurs en Python.

Je suis le passage d'un éventail d'utilisateurs de Python (Flask) à un menu déroulant en HTML qui ressemble à ceci:

Cela fonctionne parfaitement et je peux sélectionner un utilisateur dans le menu déroulant. Maintenant, je veux accéder aux attributs user.address des utilisateurs en Python. (bien sûr, ces attributs sont déjà définis dans la classe d'utilisateurs).

J'ai donc une fonction comme celui-ci en Python (Flask) qui se déclenche lorsque vous appuyez sur un bouton:

@app.route("/display_user", methods=["POST"]) 
def display_user(): 

    user = request.form["user"] 
    address = user.address 
    return render_template("show.html", address=address) 

Maintenant que je reçois l'erreur suivante:

"AttributeError: 'str' object has no attribute 'address'".

Je suis récupérer le json comme une chaîne qui ressemble à ceci:

{'firstname': 'test','lastname': 'test','birthday': 'test','address': 'test'} 

Je devrais maintenant probablement créer un dict de t son string/json et ensuite accéder à ces valeurs avec ['adresse'], mais de toute façon je ne pouvais pas comprendre comment. Je l'ai essayé avec json.dumps() qui n'a pas fonctionné, toujours le même message d'erreur. J'ai aussi pensé qu'il devait y avoir un moyen plus facile/meilleur d'y parvenir.

Des suggestions? (en utilisant Python 3.6.2)

+0

ce n'est pas JSON en passant, c'est un python [ 'repr'] (https://docs.python.org /3/library/functions.html#repr) –

+0

okay, je vois maintenant. Merci!y a-t-il un moyen de passer d'une réprimande à une instance de cette classe? ou faire revenir Jinja2 l'instace/json de l'utilisateur? – Pascal

Répondre

0

Si vous récupérez json sous forme de chaîne, vous pouvez utiliser json.loads.

import json 
values = json.loads('{"firstname": "test","lastname": "test","birthday": "test","address": "test"}') 
print(values["firstname"]) 

Ceci affichera le test. Veuillez noter que la chaîne que vous avez publiée n'est pas Json. Les chaînes JSON doivent utiliser des guillemets doubles.

+0

ok, ça explique pourquoi ça ne marche pas. On dirait que je ne récupère pas un json mais le repr de l'objet. Je pourrais remplacer tous les «avec», mais cela ne semble pas la meilleure solution .. – Pascal

0

ok, donc j'ai fini avec cette solution:

Je ne suis rentré le ._id et non l'ensemble par exemple de l'utilisateur comme suit:

Jinja2/HTML:

<option value="{{ user._id }}">{{ user.firstname }} {{ user.lastname}} ({{ user.birthdate }})</option> 

Ensuite, je viens de faire une nouvelle requête pour l'utilisateur dans ma base de données (j'utilise MongoDB) en utilisant son _id.

Python 3.6:

user_id = request.form["user"] 
user = User.get_by_id(user_id) 

Et puis je pouvais accéder à ses attributs avec user.address et ainsi de suite. Fonctionne bien, mais je ne suis pas très satisfait de la solution car j'ai besoin d'interroger la base de données à nouveau.

Donc, si quelqu'un a une approche différente, je suis heureux de l'entendre :-)

+0

C'est probablement la meilleure situation, sinon quelqu'un pourrait simplement forger l'objet clientide –

+0

ok merci pour votre contribution :) Je vais rester avec cette solution pour l'instant. – Pascal