2015-12-26 8 views
6

(To prawdopodobnie głupie pytanie, więc proszę o noszenie osłon głupoty!) Byłem programistą PHP i teraz uczę się Pythona + Flask. Ostatnio musiałem dużo walczyć z wysyłaniem danych przez AJAX i zwracaniem odpowiedzi. Wreszcie, kod, który pracował był:Dlaczego json.dumps() jest koniecznością w kolbie?

@app.route('/save', methods=['POST']) 
def save_subscriptions(): 
    if request.method == 'POST': 
     sites = request.form.get('selected') 
     print(sites) 
     sites = sites[0:-1]   
     g.cursor.execute('UPDATE users SET sites = %s WHERE email = %s', [sites, session.get('email')]) 
     g.db.commit() 
     return json.dumps({'status': 'success'}) 

Jeśli zmienię return json.dumps({'status': 'success'}) do return 1 otrzymuję wyjątek, który int is not callable. Po pierwsze, nie rozumiem, kto próbuje nazwać to, int i dlaczego? Po drugie, w PHP często można było uzyskać tylko echo 1; i stała się ona odpowiedzią AJAX. Dlaczego zatem return 1 nie działa w Flask?

+2

Proszę odkaż swoje zapytania SQL! –

+0

@WillSherwood Thanks! Zastanawiam się wczoraj, co jest odpowiednikiem przygotowanych przez PHP oświadczeń, ale nie zastanawiałem się nad tym, ponieważ jest to osobisty projekt. Zmienię to pronto! – dotslash

+0

@WillSherwood Hej, chwileczkę! Patrzę na http://bobby-tables.com/python.html i zastanawiam się, czy moje zapytania nie są już oczyszczone. Do czego jeszcze potrzebuję? – dotslash

Odpowiedz

7

Logika co powinno zostać zwrócone przez Kolba postrzega is described in the docs w szczegółach:

Wartość zwracana z funkcji widoku zostanie automatycznie przekształcony obiekt odpowiedzi dla ciebie. Jeśli zwróconą wartością jest ciąg znaków, jest to przekształcona w obiekt odpowiedzi z łańcuchem jako treścią odpowiedzi, kodem błędu 200 OK OK i mimetem typu text/html. Logika że Kolba zastosowanie do przeliczania wartości zwracanych do obiektów Odpowiedź będzie następująco:

  • Jeśli obiekt odpowiedź właściwego typu jest zwracany jest bezpośrednio wrócił z widzenia.

  • Jeśli jest łańcuchem, obiekt odpowiedzi jest tworzony z tymi danymi i parametrami domyślnymi .

  • Jeśli zwrócona zostanie krotka, elementy w krotce mogą dostarczyć dodatkowych informacji. Takie krotki muszą mieć być w formie (odpowiedź, status, nagłówki), gdzie co najmniej jeden element ma być w krotce. Wartość statusu zastąpi kod statusu, a nagłówki mogą być listą lub słownikiem dodatkowych wartości nagłówka.

  • Jeśli to nie zadziała, Flask przyjmie wartość zwracaną jest prawidłową aplikacją WSGI i przekształci ją w obiekt odpowiedzi.

W twoim przypadku, całkowita 1 jest zwracana - Kolba stosuje ostatnią regułę i stara się przekształcić go w obiekcie odpowiedzi i kończy się niepowodzeniem. Wewnętrznie make_response() method nazywa, które w przypadku całkowitej, nazwałbym force_type() method z klasy werkzeug.Response które mogłyby ulec uszkodzeniu tworzenia instancji klasy BaseResponse podczas próby wystąpienia aplikację WSGI:

app_rv = app(environ, start_response) 

gdzie app w swojej Przypadek jest liczbą całkowitą 1.

+0

Ah, głupiutki! Więc wszystko, co musiałem zrobić, to 'return" 1 ". Dzięki! Przyjmę to jako moją odpowiedź, gdy tylko strona mnie pozwoli. – dotslash

+0

Dziękuję za pełne wyjaśnienie. Sprawia, że ​​widzę ramy sieciowe w zupełnie innym świetle. :-) – dotslash

Powiązane problemy