flask蓝图的一个实例
项目目录
项目代码
my_blue.py
# -*- coding:utf-8 -*- import re from flask import (Blueprint,session,request,render_template, url_for,redirect,send_file) my_bp = Blueprint('my_bp',__name__) @my_bp.before_request def check_session(): #print(request.path) # /login 。。。 # 白名单放行 本例只有/login if re.search('^/login$',request.path): return None else: if session.get('user'): return None else: return redirect('/login') # 用于认证的装饰器函数——如果需要认证的路由不多的话可以用它 # 多的话用@my_bp.before_request装饰的那个方法 def check_login(func): def inner(*args,**kwargs): if session.get('user'): ret = func(*args,**kwargs) return ret else: return redirect('/login') return inner @my_bp.route('/login',endpoint='login',methods=['GET','POST']) def login(): if request.method == 'GET': return render_template('login.html') elif request.method == 'POST': user = request.form.get('username') pwd = request.form.get('password') if user == 'whw' and pwd == '123': # 设置session session['user'] = user # 利用别名跳转 # 蓝图中需要加上对象的名字~~~ ########!!! url = url_for('my_bp.index') return redirect(url) else: if not session.get('fail_count'): session['fail_count'] = 1 else: session['fail_count'] += 1 errors = '登陆失败,失败总次数为:%s'% session['fail_count'] # 直接在原来的页面上显示错误信息! return render_template('login.html',errors=errors) @my_bp.route('/index',endpoint='index') # 如果用装饰器认证的话,写在最下面,并且路由要有一个"别名" # @check_login def index(): return render_template('index.html')
f1.py
# -*- coding:utf-8 -*- import re from flask import Flask, request, session, redirect,send_file from service.my_blue import my_bp from settings import Debug,Testing app = Flask(__name__,static_folder='staticfiles',static_url_path='/statics') app.config.from_object(Debug) # app.config.from_object(Testing) ''' # 设置session的密钥以及超期时间还得在主文件中设置! app.secret_key = 'huoyingwhw666' app.permanent_session_lifetime = 10 ''' # 自定制错误信息 @app.errorhandler(404) def error404(er_msg): # print(er_msg) return send_file('staticfiles/404.jpeg') if __name__ == '__main__': app.register_blueprint(my_bp) app.run('127.0.0.1','5678')
settings.py
# -*- coding:utf-8 -*- import os # 项目的根目录 BASE_DIR = os.path.dirname(os.path.abspath(__file__)) # 配置类 class Debug(object): DEBUG = True SECRET_KEY = 'huoyingwhw666' SESSION_COOKIE_NAME = 'I am debug session' PERMANENT_SESSION_LIFETIME = 10 class Testing(object): TESTING = True SECRET_KEY = 'huoyingwhw888' SESSION_COOKIE_NAME = 'I am testing session'
login.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="" method="post"> 用户名 <input type="text" name="username"> 密码 <input type="password" name="password"> <button>登陆</button> {{ errors }} </form> </body> </html>
index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>主页</title> </head> <body> <div style="height: 333px;width: 333px;"> <img width="100%" height="100%" src="/statics/1.jpg" alt=""> </div> </body> </html>
遇到的问题
1、发现的问题:
(1)我把登陆逻辑写在蓝图中,但是设置session的secret_key与超时时间还得在主文件中设置!
(2)在进行url_for的操作的时候,蓝图中的别名前面还要加上对象的名字!
(3)自定制404页面的那个装饰器貌似只能被主文件的Flask类的实例化对象调用,我用蓝图里实例化的对象调用没有反应?
(4)settings文件中写配置类的时候发现session_cookie_name的时候发现一个问题:
~~~加上空格的话,点击登陆按钮页面会不断的在login页面刷新~~cookie中记录错误的次数永远是1次~~但是看一下Apolication中的Cookies中还是不带空格的!!!
~~~修改措施:
2、做了白名单放行/login路由
3、效果如下:
(1)登陆效果如下:
(2)自定制错误页面: