2010-10-02 17 views
15

Código:Django: request.GET y KeyError

# it's an ajax request, so parameters are passed via GET method 
def my_view(request): 
    my_param = request.GET['param'] // should I check for KeyError exception? 

en PHP Frameworks que normalmente tienen que comprobar para el parámetro a que existe y redirigir el usuario en algún lugar si no lo hace. Pero en Django los resultados del parámetro no existente en la página de error 500 y parece el comportamiento deseado. Entonces, ¿está bien dejar el código como está o hay una práctica mejor? ¿Debo usar siempre parámetros estándar que pasan como/myaction/paramvalue/en lugar de/myaction? Param_name = param_value (es un poco difícil construir tales URL para solicitudes ajax)?

Respuesta

30

Su servidor nunca debe generar una página con 500 errores.

Puede evitar el error mediante el uso de:

my_param = request.GET.get('param', default_value) 

o:

my_param = request.GET.get('param') 
if my_param is None: 
    return HttpResponseBadRequest() 
+1

btw try ... excepto que el bloque parece ser mejor en caso de que tenga varios parámetros (1 excepto el bloque de varias comprobaciones para None). – glss

+0

Sí, cierto. También es posible que deba realizar comprobaciones más específicas de los parámetros de forma individual para obtener un rango adecuado de valores, compatibilidad entre parámetros, etc. –

+0

Uso formularios django para validar la entrada, incluso para llamadas ajax. Es más fácil de usar si tiene muchos parámetros de entrada y hace la mayor parte del trabajo por usted. – OmerGertel

4

Sí, debería verificar KeyError en ese caso. O puede hacer esto:

if 'param' in request.GET: 
    my_param = request.GET['param'] 
else: 
    my_param = default_value 
0

¿Qué pasa si el valor por defecto parámetro no existe?

my_param = request.GET.get('param', 'defaultvalue') 
+0

defaultvalue no está a menudo disponible. – glss