2010-06-25 17 views
6

He estado intentándolo durante varias horas y debe haber una manera fácil de recuperar la URL. Pensé que esto era cierto:¿Por qué obtengo TypeError: get() toma exactamente 2 argumentos (1 dado)? 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',{}) 

Cada vez que este código es ejecutado consigo este error en el StackTrace:.

appengine \ ext \ webapp__init __ PY", línea 511, en llamada manejador. Get (* grupos) TypeError:. get() toma exactamente 2 argumentos (1 determinado)

he hecho un poco de depuración, pero este tipo de depuración excede mi nivel de depuración Cuando quito la babosa de def get (auto , babosa) todo funciona bien.

Este es el 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 alguien me podría apuntar en la dirección correcta sería muy bueno! ¡Gracias! Es la primera vez que uso stackoverflow para publicar una pregunta, normalmente solo la leo para solucionar los problemas que tengo.

+2

Tu BaseHandler's __init__ también está mal - debería ser 'super (BaseHandler, self) .__ init __ (** kw)' - pero dado que en realidad no hace nada, no hay necesidad de anularlo en primer lugar . –

Respuesta

9

Obtiene este error porque se llama al ProgramViewHandler.get() sin el parámetro slug.

Es muy probable que necesite corregir las asignaciones de URL en su archivo main.py. Su asignación de URL probablemente debería verse más o menos así:

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

Los paréntesis indican un agrupamiento de expresiones regulares. Estos grupos coincidentes se pasan a su controlador como argumentos. Por lo tanto, en el ejemplo anterior, todo en la URL que sigue al "/" inicial se pasará al parámetro ProgramViewHandler.get() de slug.

Más información sobre las asignaciones de URL en la aplicación web here.

+0

Sí, creo que tuve eso, pero no estoy seguro de si puse el r antes. ¿Qué significa el r? Lo vi antes. ¿Significa que esto se debe analizar con expresiones regulares? –

+0

El prefijo 'r' indica que el siguiente literal de cadena es un [raw string literal] (http://docs.python.org/reference/lexical_analysis.html#string-literals).Las cadenas sin formato básicamente tratan las barras diagonales inversas como cualquier otro carácter en lugar de las secuencias de escape (a excepción de que aún se puede escapar de una comilla que, de lo contrario, indicaría el final del literal de la cadena). Estos se utilizan a menudo al especificar expresiones regulares porque la sintaxis de estos hace un uso intensivo de las barras diagonales inversas. En el ejemplo que proporcioné, la 'r' no hace ninguna diferencia ya que no hay barras diagonales inversas en el literal de la cadena. –

+0

Ah Gracias por la explicación. Fui estúpido al olvidar cambiar mi principal. Supongo que los días de trabajo demasiado largos no son buenos. –

1

Si hace esto:

obj = MyClass() 
obj.foo(3) 

El método foo en MiClase se llama con dos argumentos:

def foo(self, number) 

El objeto sobre el que se llama se pasa como primer parámetro.

Tal vez está llamando a get() estáticamente (es decir, haciendo ProgramViewHandler.get() en lugar de myViewHandlerVariable.get()), o le falta un parámetro.

+1

Ah, entiendo el problema ahora. Leí en algún lado sobre eso. Tu explicación es genial, espero poder solucionarlo ahora. Te mantendremos al tanto. –