2012-08-07 11 views
12

tengo un controlador para una URL,frasco no obtener ningún dato de datos de solicitud de jQuery

@app.route("/", methods=['POST']) 
@crossdomain(origin='*') 
def hello(): 
    ss=str(request.data) 
    print ss 
    return ss 

El controlador no puede retrive la parte de datos de la solicitud. Cuando se utiliza jQuery:

jQuery.ajax(
    { 
     type: "POST", 
     dataType: "json", 
     data:"adasdasd", 
     url: 'http://127.0.0.1:5000/', 
     complete: function(xhr, statusText) 
     { alert(xhr.responseText) }}) 

no se devuelve nada

+0

umm Tal vez se devuelve algo, pero no están haciendo nada con ella –

+0

Trate de usar 'función del éxito de ajax' y manipule los datos como lo necesite también 'success (data, textStatus, jqXHR) Function, Array Una función a ser llamada si la solicitud tiene éxito. La función recibe tres argumentos: los datos devueltos por el servidor, formateados según el parámetro dataType; una cadena que describe el estado; y el objeto jqXHR (en jQuery 1.4.x, XMLHttpRequest). A partir de jQuery 1.5, la configuración de éxito puede aceptar una serie de funciones. Cada función se llamará a su vez. Este es un Evento de Ajax. –

+0

pero lo estoy probando con alerta (xhr.responseText), no hay nada en la respuestaTexto – Noor

Respuesta

18

interesante, ya que resulta que sólo se puede utilizar request.data si los datos se publicó, con un tipo MIME ese frasco no puede manejar, por lo demás es una cadena vacía "" Creo que los documentos no fueron muy claros, hice algunas pruebas y ese parece ser el caso, puedes echar un vistazo a la salida de la consola que genera el matraz cuando ejecutas mis pruebas.

solicitud entrante de datos

datos
  contiene los datos de la solicitud entrantes como cadena en caso de que venía con un tipo MIME frasco no maneja.

tomado de http://flask.pocoo.org/docs/api/

pero ya que estamos haciendo un estándar POST usando JSON flask puede manejar esto muy bien, como tal, se puede acceder a los datos de la norma request.form este ss=str(request.form) debe hacer el truco como he probado.

Como nota al margen @crossdomain(origin='*') esto parece peligroso, hay una razón por la cual no permitimos las solicitudes a través de sitios cruzados, aunque estoy seguro de que tiene sus razones.

este es el código completo que he usado para las pruebas:

from flask import Flask 
app = Flask(__name__) 

from datetime import timedelta 
from flask import make_response, request, current_app 
from functools import update_wrapper 


def crossdomain(origin=None, methods=None, headers=None, 
       max_age=21600, attach_to_all=True, 
       automatic_options=True): 
    if methods is not None: 
     methods = ', '.join(sorted(x.upper() for x in methods)) 
    if headers is not None and not isinstance(headers, basestring): 
     headers = ', '.join(x.upper() for x in headers) 
    if not isinstance(origin, basestring): 
     origin = ', '.join(origin) 
    if isinstance(max_age, timedelta): 
     max_age = max_age.total_seconds() 

    def get_methods(): 
     if methods is not None: 
      return methods 

     options_resp = current_app.make_default_options_response() 
     return options_resp.headers['allow'] 

    def decorator(f): 
     def wrapped_function(*args, **kwargs): 
      if automatic_options and request.method == 'OPTIONS': 
       resp = current_app.make_default_options_response() 
      else: 
       resp = make_response(f(*args, **kwargs)) 
      if not attach_to_all and request.method != 'OPTIONS': 
       return resp 

      h = resp.headers 

      h['Access-Control-Allow-Origin'] = origin 
      h['Access-Control-Allow-Methods'] = get_methods() 
      h['Access-Control-Max-Age'] = str(max_age) 
      if headers is not None: 
       h['Access-Control-Allow-Headers'] = headers 
      return resp 

     f.provide_automatic_options = False 
     return update_wrapper(wrapped_function, f) 
    return decorator 



@app.route("/", methods=['POST']) 
@crossdomain(origin='*') 
def hello(): 
    ss=str(request.form) 

    print 'ss: ' + ss + ' request.data: ' + str(request.data) 
    return ss 


@app.route("/test/") 
def t(): 
    return """ 
<html><head></head><body> 
<script src="http://code.jquery.com/jquery.min.js" type="text/javascript"></script> 
<script type='text/javascript'> 
jQuery.ajax(
    { 
     type: "POST", 
     dataType: "json", 
     data: "adasdasd", 
    url: 'http://127.0.0.1:5000/', 
complete: function(xhr, statusText) 
     { alert(xhr.responseText) }}) 

var oReq = new XMLHttpRequest(); 
oReq.open("POST", "/", false); 
oReq.setRequestHeader("Content-Type", "unknown"); 
oReq.send('sync call'); 
alert(oReq.responseXML); 
</script></body></html> 
""" 

if __name__ == '__main__': 
    app.run() 

de salida:

$ python test.py 
* Running on http://127.0.0.1:5000/ 
127.0.0.1 - - [07/Aug/2012 02:45:28] "GET /test/ HTTP/1.1" 200 - 
ss: ImmutableMultiDict([('adasdasd', u'')]) request.data: 
127.0.0.1 - - [07/Aug/2012 02:45:28] "POST/HTTP/1.1" 200 - 
ss: ImmutableMultiDict([]) request.data: sync call 
127.0.0.1 - - [07/Aug/2012 02:45:28] "POST/HTTP/1.1" 200 - 
127.0.0.1 - - [07/Aug/2012 02:45:29] "GET /favicon.ico HTTP/1.1" 404 - 

y mi sistema:

$ python --version 
Python 2.6.1 

$ python -c 'import flask; print flask.__version__;' 
0.8 

$ uname -a 
Darwin 10.8.0 Darwin Kernel Version 10.8.0: Tue Jun 7 16:33:36 PDT 2011; root:xnu-1504.15.3~1/RELEASE_I386 i386 

usando Google Chrome Version 20.0.1132.57

4

He estado trabajando con una funcionalidad similar y después de un poco de jugar un poco con el Ajax y el pitón, esto es lo que ocurrió con la de pitón lectura de los datos ajax

JavaScript:

var data = { 
     data: JSON.stringify({ 
         "value":'asdf' 
        }) 
    } 
}; 

$.ajax({ 
    url:"/", 
    type: 'POST', 
    data: data, 
    success: function(msg){ 
       alert(msg); 
      } 
}) 

Python:

from flask import json 
@app.route("/", methods=['POST']) 
def get_data(): 
    data = json.loads(request.form.get('data')) 
    ss = data['value'] 
    return str(ss) 
0

Hmm, recibo solicitudes de AJAX a través de request.form.Estoy usando DataTables y especificar así: función

<script type="text/javascript"> 
$(document).ready(function() { 
     $('#mgmtdata').dataTable({ 
       "bServerSide": true, 
       "sAjaxSource": "{{url_for('.xhr')|safe}}", 
       "sServerMethod": "POST", 
       "bDeferRender": true, 
       "bFilter": {{ info.filter if info.filter else "false" }}, 
       "aoColumnDefs": [ {{ info.columndefs|safe if info.columndefs }} ], 
     }); 
}); 

El xhr() es simple:

@usersview.route('/xhr', methods=["POST"]) 
def xhr(): 
    if not 'usersview' in g: 
     g.usersview = UsersDatatableView() 
    return g.usersview.render() 

usersview es una instancia del objeto de mi cuadrícula(). En este caso, sólo es interesante sobre cómo llegar de a los datos ajax que DataTables enviar en:

def render(self): 
    q = self.getQuery() 

    # add filtering 
    if 'sSearch' in request.form and request.form['sSearch']: 
     q = self.applyFilter(q, request.form['sSearch']) 

    # add sorting 
    if 'iSortingCols' in request.form: 
     # and so on 
Cuestiones relacionadas