Flask蓝图:如何在不同的端口运行每个应用程序?

时间:2018-05-15 10:12:28

标签: flask blueprint

我使用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'})

1 个答案:

答案 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/