2012-10-18 2 views
0

Je viens de recevoir l'erreur de type suivant lors de l'exécution de mon script Python:Ce qui pourrait causer l'erreur TypeError: impossible de concaténer les objets 'str' et 'function'?

File "/Library/Python/2.7/site-packages/Flask-0.9-py2.7.egg/flask/app.py", line 1701, in __call__ 
return self.wsgi_app(environ, start_response) 
File "/Library/Python/2.7/site-packages/Flask-0.9-py2.7.egg/flask/app.py", line 1689, in wsgi_app 
response = self.make_response(self.handle_exception(e)) 
File "/Library/Python/2.7/site-packages/Flask-0.9-py2.7.egg/flask/app.py", line 1687, in wsgi_app 
response = self.full_dispatch_request() 
File "/Library/Python/2.7/site-packages/Flask-0.9-py2.7.egg/flask/app.py", line 1360, in full_dispatch_request 
rv = self.handle_user_exception(e) 
File "/Library/Python/2.7/site-packages/Flask-0.9-py2.7.egg/flask/app.py", line 1358, in full_dispatch_request 
rv = self.dispatch_request() 
File "/Library/Python/2.7/site-packages/Flask-0.9-py2.7.egg/flask/app.py", line 1344, in dispatch_request 
return self.view_functions[rule.endpoint](**req.view_args) 
File "/Users/Zach/Dropbox/stock/stk.py", line 31, in stock 
url="http://finance.yahoo.com/d/quotes.csv?s="+stock+"&f=snl1" 
TypeError: cannot concatenate 'str' and 'function' objects 

La ligne qui cause le problème semble être url="http://finance.yahoo.com/d/quotes.csv?s="+stock+"&f=snl1", en particulier la stock. variable après la recherche et du peu que je sais d'erreurs précédentes, je déduis que la cause doit être un problème avec la façon dont la variable est définie (ce n'est pas une chaîne, ou peut-être pas du tout); Cela dit, je décris cette variable comme une chaîne dans la fonction avant:

@app.route('/', methods=['GET', 'POST']) 
def home_search(): 
    if request.method == 'POST': 
      stock = request.form['s'] 
      return redirect(url_for('stock')) 

    return render_template('stk.html') 

Et voici la fonction, stock où je tente d'appeler et afficher la valeur précédemment définie:

@app.route('/stock', methods=['GET', 'POST']) 
def stock(): 
    print type(stock) 
    url="http://finance.yahoo.com/d/quotes.csv?s="+stock+"&f=snl1" 
    text=urllib2.urlopen(url).read() 

    return render_template('stock.html') 

Cependant, il est défini dans un autre @app.route que lorsque je l'appelle. Les variables dans Python ne devraient-elles pas être stockées et rappelées comme cela, ou les variables sont-elles vidées lors du chargement de nouvelles pages? Si c'est le cas, toutes les suggestions pour un travail ou une meilleure approche seraient grandement appréciées.

+1

Testez le type de 'stock' pour être sûr:' type (stock) ' – gecco

+0

Je ne suis pas un expert en flask, mais une fois que vous quittez la fonction' home_search() ',' stock' sera ramassé garbage, De plus, vous ne pouvez pas y accéder en dehors de la fonction de toute façon. –

+0

Je pense que le problème est ,, vous traitez 'stock' comme une chaîne dans la ligne' return redirect (url_for ('stock')) ' – avasal

Répondre

2

Les fonctions nommées sont des variables comme tout le reste. Le stock qui est utilisé dans cette ligne:

url="http://finance.yahoo.com/d/quotes.csv?s="+stock+"&f=snl1" 

est la fonction qui le contient. Vous ne devriez pas compter sur les variables Python à travers les demandes; à la place, vous devez transmettre la variable en tant que variable de requête, par ex.

/stock?s=whatever 

puis relis de la nouvelle request.form dans le gestionnaire pour cette URL.


La variable stock que vous créez dans votre fonction home_search est une variable locale qui ne vit que pour la vie de l'appel à home_search, qui se termine dès que vous rediriger le client vers une autre URL (par exemple comme /stock).

+0

Merci pour votre aide - que est ce que je soupçonnais. Quelle est la meilleure façon de créer un lien de référence unique? – zch

+0

Que voulez-vous dire par "lien de référence unique"? – Amber

+0

J'ai compris! Merci, Amber – zch

Questions connexes