需求:
我们现在想要创建一个网站,有导航栏(如图)
同时做一个登陆界面、一个注册界面、一个主页。
要求登陆界面与注册界面可以互相转换、只有root用户可以查看并删除用户信息、用户只有登陆后才可以进入主页。
新建flask项目
如图:
其中,static目录中存放的是静态的文件;template目录中存放的是html文件。
from flask import Flask, render_template, request, redirect, url_for, flash, session
# render_template(.html)跳转到html页面
# request请求函数
# redirect(路又名)即可跳转到路由
# url_for(函数名)即可跳转到函数所在的路由
# flash是闪现
# 因为flask的session是通过加密之后放到了cookie中, 所以有加密就有密钥用于解密
# 所以只要用到了flask的session模块就一定要配置“SECRET_KEY”这个全局宏, 一般设置为24位的字符
from functools import wraps
from flask_bootstrap import Bootstrap
users = [
{
'username': 'root',
'password': 'root'
},
]
app = Flask(__name__)
app.config['SECRET_KEY'] = 'westos'
# 在接受flash消息时, 需要将消息内容保存在缓存中, 此处是为了进行加密
# 等号后的内容随意, 长度越长加密的越安全
bootstrap = Bootstrap(app)
# 导入bootstrap时, 实例化对象
def is_login(f):
"""装饰器: 用来判断用户是否登录成功"""
@wraps(f)
# 可以保留被装饰函数的函数名和帮助信息文档
def wrapper(*args, **kwargs):
# 判断session对象中是否有seesion['user']
# 如果包含信息, 则登录成功, 可以访问主页
# 如果不包含信息, 则未登录成功, 跳转到登录界面
if session.get('user', None):
return f(*args, **kwargs)
else:
flash("用户必须登录才能访问%s" % (f.__name__))
return redirect(url_for('login'))
return wrapper
def is_admin(f):
"""装饰器: 用来判断用户是否登录成功"""
@wraps(f)
# 可以保留被装饰函数的函数名和帮助信息文档
def wrapper(*args, **kwargs):
# 判断session对象中是否有seesion['user']等于root
# 如果包含信息, 则登录成功, 可以访问主页
# 如果不包含信息, 则未登录成功, 跳转到登录界面
if session.get('user', None) == 'root':
return f(*args, **kwargs)
else:
flash("只有管理员root才能访问%s" % (f.__name__))
return redirect(url_for('login'))
return wrapper
@app.route('/')
# 创建主页路由
@is_login
def index():
return render_template('index.html')
@app.route('/register/', methods=['GET', 'POST'])
# 创建注册页面路由, 数据传输方法为GET/POST
def register():
if request.method == 'POST':
# 用POST方法保密性更强
username = request.form.get("username", None)
password = request.form.get('password', None)
# 当所有的信息遍历结束, 都没有发现注册的用户存在
# 则注册成功将注册的新用户信息添加到服务器, 并跳转到登录界面
for user in users:
if user['username'] == username:
return render_template('register.html',
message="用户%s已经存在" % (username))
else:
users.append(dict(username=username, password=passwo