flask 不同应用间 session 共享,统一认证

环境准备:

python 2.7.11

redis==2.10.6
Flask==0.10.1
Flask-Session==0.3.1

redis-server 192.168.1.107 : 6379

IDE

pycharm

文件树

这里写图片描述
这里写图片描述


说明:
1。在第一个应用中做用户名密码认证,从数据库中校验(网上很多例子,代码不贴了)
2。两个应用用同样的 SECRET_KEY 配置

操作步骤

1.创建两个应用

a) settings.py

a) settings.py

# coding: utf-8
import platform
import redis
import os

class baseconfig(object):
   CSRF_ENABLED = True

   alarms_dbname = "alarms"
   db_username = "falcon"
   db_password = "123456"
   db_ip = "192.168.1.107"
   # db_ip = "192.168.43.11"


   # server_ip = "192.168.43.11" # api ip
   server_ip = "192.168.1.107"

   system_type = 'Windows' if platform.system().find("Win") != -1 else 'Linux'
   redis_ip = "192.168.1.107"
   redis_port = 6379
   session_config = {'SESSION_TYPE': "redis",
                 'SESSION_REDIS': redis.Redis(host=redis_ip, port=redis_port),
                 'SESSION_USE_SIGNER': True,
                 'SECRET_KEY' : os.environ.get("SECRET_KEY", "secret-key")}
# session_config 两个应用都加载此配置

   SQLALCHEMY_DATABASE_URI = 'mysql://%s:%s@%s/%s' % (db_username, db_password, db_ip, alarms_dbname)
   @staticmethod
   def init_app(app):
      pass


class developconfig(baseconfig):
   DEBUG = True
   import os
   basedir = os.path.abspath(os.path.dirname(__file__))

   SQLALCHEMY_MAX_OVERFLOW = 50
   SQLALCHEMY_ECHO = False
   SQLALCHEMY_POOL_SIZE = 20
   SQLALCHEMY_TRACK_MODIFICATIONS = False
   SQLALCHEMY_COMMIT_ON_TEARDOWN = True
   SQLALCHEMY_POOL_TIMEOUT = 3
   SQLALCHEMY_POOL_RECYCLE = 1


class portal(baseconfig):
   # db
   SQLALCHEMY_DATABASE_URI = ''
   SQLALCHEMY_POOL_TIMEOUT = 10
   SQLALCHEMY_TRACK_MODIFICATIONS = False
   SQLALCHEMY_COMMIT_ON_TEARDOWN = True

config = {'default': developconfig, 'portal': portal, 'develop': developconfig}
b) 创建第一个应用

rrd__init__.py

from flask import Flask, request
from rrd import config
from flask_session import Session
from settings import baseconfig
#-- create app --
app = Flask(__name__)
app.config.from_object("rrd.config")  # 此配置文件没有关于session共享的配置,不贴出来了
app.config.update(baseconfig.session_config)
Session(app) 

rrd\view__init__.py

@app.before_request
def app_before():
# 从session中提取用户签名
    g.user_token = get_usertoken_from_session(session)
    g.user = get_current_user_profile(g.user_token)
    g.locale = request.accept_languages.best_match(config.LANGUAGES.keys())
C )创建第二个应用

wsgi.py

from bk_site import create_app
custom_app = create_app(os.environ.get("FLASK_CONFIG") or "default")

from werkzeug.wsgi import DispatcherMiddleware
from werkzeug.serving import run_simple
# 将两个应用合并在一起
app = DispatcherMiddleware(falcon_app, {'/ext': custom_app}) 

\bk_site__init__.py

from flask import Flask
from werkzeug.utils import import_string
from settings import config
from flask_sqlalchemy import SQLAlchemy
from flask_session import Session
import settings

db = SQLAlchemy()
sess = Session()
# celery app
from celery import Celery
import celeryconfig
celery_app = Celery()
celery_app.config_from_object(celeryconfig)

def create_app(config_name):
   app = Flask(__name__)
   app.config.from_object(config[config_name])
   config[config_name].init_app(app)
   db = SQLAlchemy(app)
   db.init_app(app)

   app.config.update(settings.baseconfig.session_config)
      # init_app 一定要在 app.config  配置后面,否则配置不能生效
   sess.init_app(app)

   # from monitor_bk_site.monitor import monitor_bp
   blueprints = [
      'bk_site.monitor:monitor_bp',
      'bk_site.other:other_bp',
   ]
   from middle_ware import app_before

   app_before(app)
   for bp_name in blueprints:
      bp = import_string(bp_name)
      app.register_blueprint(bp)

   return app

middle_ware.py

from flask import g, request, redirect, session
from rrd.view.utils import get_usertoken_from_session, get_current_user_profile
from monitor import monitor_bp
from rrd import config

@monitor_bp.before_request
def request_before():
   if session:
# 从session中提取用户签名
      g.user_token = get_usertoken_from_session(session)
      g.user = get_current_user_profile(g.user_token)
      g.locale = request.accept_languages.best_match(config.LANGUAGES.keys())
      if not g.user:
         return redirect("/auth/login")
   #  # print ut
   #  current_app.login_type = 1
   #  current_app.user = g.user_token.name
   #  current_app.sig = g.user_token.sig
   #  g.user = get_current_user_profile(g.user_token)
   #  g.locale = request.accept_languages.best_match(config.LANGUAGES.keys())
   else:
      return redirect("/auth/login")

flask 配置文件参考
http://www.pythondoc.com/flask/config.html

flask-session 配置文件参考
https://www.cnblogs.com/52forjie/p/8282453.html
https://pythonhosted.org/Flask-Session/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值