B站配套视频教程观看
創建一個攔截器:
from application import app from flask import request,redirect from common.models.User import User from common.libs.user.UserService import UserService from common.libs.UrlManager import UrlManager @app.before_request def before_request(): path = request.path user_info =check_login() if not user_info: return redirect(UrlManager.buildUrl("/user/login")) return ''' 判断用户是否登录 ''' def check_login(): cookies = request.cookies auth_cookie = cookies[app.config['AUTH_COOKIE_NAME']] if app.config['AUTH_COOKIE_NAME'] in cookies else None #app.logger.info(auth_cookie) if auth_cookie is None: return False auth_info = auth_cookie.split("#") if len(auth_info) != 2: return False try: user_info = User.query.filter_by(uid=auth_info[1]).first() except Exception: return False if user_info is None: return False if auth_info[0] != UserService.geneAuthCode(user_info): return False return auth_info
运行后发现重定向很多次:
base_setting.py
配置過濾的url:
SERVER_PORT=8999 DEBUG = False SQLALCHEMY_ECHO = False AUTH_COOKIE_NAME = "mooc_food" # 過濾url IGNORE_URLS = [ r"^/user/login" ] IGNORE_CHECK_LOGIN_URLS = [ r"^/static", r"^/favicon.ico" ]
拦截器过滤掉不判断的url
from application import app from flask import request,redirect from common.models.User import User from common.libs.user.UserService import UserService from common.libs.UrlManager import UrlManager import re @app.before_request def before_request(): ignore_urls = app.config['IGNORE_URLS'] ignore_check_login_urls = app.config['IGNORE_CHECK_LOGIN_URLS'] path = request.path patten = re.compile(r'%s' % r"|".join(ignore_check_login_urls)) if patten.match(path): return user_info =check_login() patten = re.compile(r'%s' % r"|".join(ignore_urls)) if patten.match(path): return if not user_info: return redirect(UrlManager.buildUrl("/user/login")) return ''' 判断用户是否登录 ''' def check_login(): cookies = request.cookies auth_cookie = cookies[app.config['AUTH_COOKIE_NAME']] if app.config['AUTH_COOKIE_NAME'] in cookies else None #app.logger.info(auth_cookie) if auth_cookie is None: return False auth_info = auth_cookie.split("#") if len(auth_info) != 2: return False try: user_info = User.query.filter_by(uid=auth_info[1]).first() except Exception: return False if user_info is None: return False if auth_info[0] != UserService.geneAuthCode(user_info): return False return auth_info
此时运行 可以正确的跳转
user.py
from flask import Blueprint,render_template,request,jsonify,make_response,redirect from common.libs.UrlManager import UrlManager @route_user.route( "/logout") def logout(): responce = make_response( redirect( UrlManager.buildUrl("/user/login") ) ) responce.delete_cookie(app.config["AUTH_COOKIE_NAME"]) return responce
运行时 退出账户时 可以看到删除了cookie