2015-10-26 2 views
8

Я пытаюсь отправить запрос на отправку в свое приложение Flask из одного из его собственных представлений, но он зависает, пока я не убью сервер. Если я сделаю запрос в JavaScript, он отлично работает. Почему он не работает из кода Python?Флажок зависает при отправке запроса на отправку

from flask import Blueprint, render_template, abort, request, Response, session, url_for 
from jinja2 import TemplateNotFound 

from flask.ext.wtf import Form 
from wtforms import BooleanField, TextField, PasswordField 

import requests 

login = Blueprint('login', __name__, template_folder='templates') 

class LoginForm(Form): 
    email = TextField('Email') 
    password = PasswordField('Password') 

@login.route('/login', methods=['GET', 'POST']) 
    def _login(): 

    form = LoginForm(request.form, csrf_enabled=False) 

    if form.validate_on_submit(): 
     return requests.post(request.url_root + '/api/login', data={"test": True}) 


    return render_template('login.html', form=form) 

ответ

17

Сервер разработки Flask по умолчанию является однопоточным. Он может обрабатывать только один запрос за раз. Блокирование запросов до получения ответа. Ваш код флэшки делает запрос в одном потоке, а затем ждет. Для обработки этого второго запроса нет других потоков. Таким образом, запрос никогда не завершается, и исходный запрос ожидает навсегда.

Включить несколько потоков или процессов на сервере-разработчике, чтобы избежать взаимоблокировки и устранить непосредственную проблему.

app.run(threaded=True) 
# or 
app.run(processes=2) 

Однако, полный HTTP-запрос к приложению из приложения не должен быть необходимым и указывает на более глубокую проблему дизайна. Например, обратите внимание, что внутренний запрос не будет иметь доступа к сеансу в браузере клиента. Извлеките общий код и вызовите его внутренне, вместо того, чтобы делать новый запрос.

+1

Я очень удивлен. Всюду, куда я иду, я всегда слышу, что Flask не поддерживает многопоточность. Всегда используйте gunicorn и/или nginx для обслуживания вашего приложения. Извлеченный урок всегда будет перекрестно проверять вещи, прежде чем принимать их как должное :) –

+1

@AbhirathMahipal советует использовать Gunicorn и Nginx правильно. Сервер Flask, поддерживающий потоки, не предназначен для производства. Он не предназначен для того, чтобы быть эффективным, стабильным или безопасным, его следует использовать только локально во время разработки. – davidism

+0

@ давидизм согласился. Я имею в виду, что, услышав так много, я даже не рассматривал возможность использования Flask с резьбовым вариантом. –

0

Я не знаком с флягой. Однако этот бит код:

if form.validate_on_submit(): 
    return requests.post(request.url_root + '/api/login', data={"test": True}) 

Похоже, ты соглашаешься отправленная форма, проверки, а затем разместить его снова. Вновь и вновь.

+0

URL-адреса выглядят разными: второй имеет префикс '/ api'. Это связано с тупиковой резьбой, а не с бесконечным циклом. – davidism

+0

@davidism, в то время как я уверен, что вы правы ... 'app.register_blueprint (login, prefix ="/api ")' даст бесконечный цикл ... но, как я уже сказал, я уверен, что вы заметили, о чем проблема в том, что OP видит ... –

+0

@ JoranBeasley хорошая точка, op фактически не показывал, как был записан проект. Я думаю, что браузер все равно будет предупреждать о бесконечном цикле переадресации в этом случае. – davidism

Смежные вопросы