Flask Blueprint: как запустить каждое приложение в другой порт? - PullRequest
0 голосов
/ 15 мая 2018

Я получил колбу с различными приложениями внутри, используя BluePrint.Чтобы упростить, я получил API, который управляет веб-аутентификацией токена (и многими другими функциями данных), и веб-сайт, который должен вызывать API для получения действительного токена, используя базовую аутентификацию для начала с

. Проблемав том, что когда веб-сайт запрашивает API, он никогда не получает никакой обратной связи от API.

Запрос API через POSTMAN работает как чудо, но этот вызов ниже, сделанный из маршрута веб-сайтаждет, ждет, ждет и никогда не кончается.

Итак, я предполагаю, что проблема заключается в использовании одного и того же порта для веб-сайта и API.

Конечно, я могу разделить флягу на 2 приложения фляги с 2 серверами, но есть много объектов иИнструменты и API, и веб-сайта делятся, поэтому я не хочу удваивать работу

Спасибо.

звонок с сайта

from requests.auth import HTTPBasicAuth
import requests

mod = Blueprint('site', __name__, template_folder='templates/login')

def load_user(username, password):
     data = requests.get('http://127.0.0.1:5000/api/login', 
                 auth=HTTPBasicAuth('username', 'password'))
     return data

@mod.route('/')
def index():
     username = 'jeje'
     password = 'jeje'
     data = load_user(username, password)
     return '<h1>load user<h1>'

функция API

@mod.route('/login')
def login():
    resu = True
    auth = request.authorization
    if not auth or not auth.username or not auth.password:
        resu = False
    user = USER.query.filter_by(username = auth.username).first()
    if not user:
        resu = False

    if validehash(user.password, auth.password):
        period_in_mn = 120
        payload = {
            'public_id':user.public_id,
            'exp' : datetime.datetime.utcnow() + datetime.timedelta(minutes = period_in_mn)
        }
        token = createtoken(payload, current_app.config['SECRET_KEY'])
    if resu:
        return jsonify({'token' : token })
    else:
        return jsonify({'token' : 'unknown'})

1 Ответ

0 голосов
/ 15 мая 2018

Полагаю, вы используете колбу 0,12 вместо 1,0. Итак, здесь происходит то, что вы запрашиваете маршрут из другого маршрута.

Ваш браузер запрашивает /, а в функции индекса вы запрашиваете /login. Но процесс колбы все еще работает над запросом / из браузера и не может принимать другие запросы, потому что колба 0.12 работает только с одним ядром.

Подобные запросы - плохой дизайн. Вы можете создать вспомогательную функцию, которая возвращает одни и те же данные в разных запросах (api или основной сайт), или вы можете заставить браузер отправлять другой запрос, используя AJAX.

Flask 1.0 имеет многоядерную поддержку, поэтому я думаю, что это может сработать, но я действительно думаю, что вы должны изменить свой дизайн. Кстати, это не имеет ничего общего с чертежами.

from flask import Flask, redirect
import requests

app = Flask(__name__)

@app.route('/')
def index():
    result = requests.get('http://127.0.0.1:5000/api/login')
    return 'this is the index<br>' + result.text

@app.route('/api/login')
def login():
    return 'you are logged in'

Использование колбы 0,12, время ожидания при посещении http://127.0.0.1:5000/.

При использовании колбы 1.0 возвращает this is the index you are logged in при посещении http://127.0.0.1:5000/.

...