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)自定制错误页面:

输入图片说明 

 

posted on 2019-07-11 21:41  江湖乄夜雨  阅读(281)  评论(0编辑  收藏  举报