Flask Blueprint: как запустить каждое приложение в другой порт?
Я получил колбу с различными приложениями внутри, используя 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,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/
,