我使用BluePrint获得了包含不同应用程序的烧瓶应用程序。 为了简化,我得到了一个管理令牌网络身份验证(以及许多其他数据功能)的API和一个应该调用API来获取有效令牌的网站,使用基本身份验证开始
问题在于,当网站请求API时,它永远不会从API获得任何反馈。
通过 POSTMAN 请求API就像魅力一样,但是下面这个从网站路线完成的调用正在等待,等待,等待,永远不会结束。
所以我的假设是对网站和api使用相同的端口是问题
我当然可以将烧瓶分成两个带有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'})
答案 0 :(得分:0)
我猜你使用烧瓶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/
时超时。
使用flask 1.0,在访问this is the index
you are logged in
时返回http://127.0.0.1:5000/
。