2010-06-25 3 views
6

J'ai essayé et essayé pendant plusieurs heures maintenant et il doit y avoir un moyen facile de récupérer l'URL. Je pensais que c'était la façon suivante:Pourquoi j'obtiens TypeError: get() prend exactement 2 arguments (1 donné)? Google App Engine

#from data.models import Program 

import basehandler 

class ProgramViewHandler(basehandler.BaseHandler): 
    def get(self,slug): 
#  query = Program.all() 
#  query.filter('slug =', fslug) 
     self.render_template('../presentation/program.html',{}) 

Chaque fois que ce code est exécuté, je reçois cette erreur sur le stacktrace.

AppEngine \ ext \ webapp__init __ py », ligne 511, dans appel gestionnaire . get (* groups) TypeError: get() prend exactement 2 arguments (1 donné)

J'ai fait du débogage, mais ce type de débogage dépasse mon niveau de débogage. , limace) tout fonctionne bien

C'est le basehandler:

import os 

from google.appengine.ext import webapp 
from google.appengine.ext.webapp import template 



class BaseHandler(webapp.RequestHandler): 
    def __init__(self,**kw): 
     webapp.RequestHandler.__init__(BaseHandler, **kw) 

    def render_template(self, template_file, data=None, **kw): 
     path = os.path.join(os.path.dirname(__file__), template_file) 
     self.response.out.write(template.render(path, data)) 

Si quelqu'un pouvait me diriger dans la bonne direction ce serait génial! Je vous remercie! C'est la première fois que j'utilise stackoverflow pour poster une question, normalement je la lis seulement pour résoudre les problèmes que j'ai.

+2

Le __init__ de votre BaseHandler est également faux - il devrait être 'super (BaseHandler, self) .__ init __ (** kw)' - mais étant donné qu'il ne fait rien, il n'est pas nécessaire de le remplacer en premier lieu . –

Répondre

9

Vous obtenez cette erreur car ProgramViewHandler.get() est appelée sans le paramètre slug. Il est fort probable que vous devez corriger les mappages d'URL dans votre fichier main.py. Votre mappage d'URL doit probablement ressembler à ceci:

application = webapp.WSGIApplication([(r'/(.*)', ProgramViewHandler)]) 

Les parenthèses indiquent un regroupement d'expressions régulières. Ces groupes correspondants sont transmis à votre gestionnaire en tant qu'arguments. Ainsi, dans l'exemple ci-dessus, tout ce qui se trouve dans l'URL suivant le "/" initial sera passé au paramètre de ProgramViewHandler.get().

En savoir plus sur les mappages d'URL dans la webapp here

+0

Oui, je pense que je l'avais, mais je ne suis pas sûr si j'ai mis le r avant. Que signifie le r? Je l'ai vu avant. Cela signifie-t-il que cela devrait être analysé par regex? –

+0

Le préfixe 'r' indique que le littéral de chaîne suivant est un [littéral de chaîne brute] (http://docs.python.org/reference/lexical_analysis.html#string-literals).Les chaînes brutes traitent essentiellement les antislashs comme tout autre caractère au lieu des séquences d'échappement (sauf que vous pouvez toujours échapper à une marque de guillemets qui signalerait sinon la fin de la chaîne littérale). Ils sont souvent utilisés lors de la spécification d'expressions régulières, car la syntaxe de ceux-ci fait un usage intensif des antislashs. Dans l'exemple que j'ai fourni, le 'r' ne fait aucune différence puisqu'il n'y a pas de barre oblique inverse dans la chaîne littérale. –

+0

Ah Merci pour l'explication. J'étais stupide d'oublier de changer de main. Devinez trop de longues journées de travail ne sont pas bonnes. –

1

Si vous faites ceci:

obj = MyClass() 
obj.foo(3) 

La méthode foo sur MyClass est appelée avec deux arguments:

def foo(self, number) 

L'objet sur lequel il est appelé, est passé comme premier paramètre.

Peut-être appelez-vous get() de manière statique (c'est-à-dire que vous faites ProgramViewHandler.get() au lieu de myViewHandlerVariable.get()), ou il vous manque un paramètre.

+1

Ah je comprends le problème maintenant. J'ai lu quelque part à propos de ça. Ton explication est géniale J'espère que je peux le réparer maintenant. Vous tiendra au courant. –

Questions connexes