我们现在想要创建一个网站,有导航栏(如图)
同时做一个登陆界面、一个注册界面、一个主页。
要求登陆界面与注册界面可以互相转换、只有root用户可以查看并删除用户信息、用户只有登陆后才可以进入主页。
新建flask项目
如图:
其中,static目录中存放的是静态的文件;template目录中存放的是html文件。
app.py
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=password))
# 出现一个闪现信息;
flash("用户%s已经注册成功, 请登录....." % (username), category='info')
return redirect(url_for('login'))
return render_template('register.html')
@app.route('/login/', methods=['GET', 'POST'])
# 创建登陆页面路由, 数据传输方法为GET/POST
def login():
if request.method == 'POST':
username = request.form.get("username", None)
password = request.form.get('password', None)
for user in users:
if user['username'] == username and user['password'] == password:
# 将用户登录的信息存储到session中
session['user'] = username
return redirect(url_for('index'))
else:
# 出现一个闪现信息
flash("用户%s密码错误, 请重新登录....." % (username))
return redirect(url_for('login'))
return render_template('login.html')
@app.route('/logout/')
# 创建用户注销登陆路由
def logout():
# 将用户存储到session中的信息删除
session.pop('user')
flash("注销成功........")
return redirect(url_for('login'))
@app.route('/delete//')
# 创建删除用户路由
def delete(username):
for user in users:
# 用户存在, 则删除
if username == user['username']:
users.remove(user)
flash("删除用户%s成功" % (username))
@app.route('/list/')
# 创建查看用户信息路由
@is_login
@is_admin
def list():
return render_template('list.html', users=users)
if __name__ == '__main__':
app.run()
index.html
{% extends 'base.html' %}
{% block title %} 主页 {% endblock %}
{% block content %}
这是主页
{% endblock %}
register.html
{% extends 'base.html' %}
{% block title %} 注册页面 {% endblock %}
{% block content %}
注册
已有帐号
{# 登录#}
登录
{# action : 将表单填写的数据提交到那个URL里面进行处理 #}
{# url_for('register') : 根据视图函数寻找对应的url地址/register/ #}
{# method =['post', 'get'], 这种是错误的, 提交数据只能选择一种HTTP请求方法 #}
{% if message %}
{{ message }}
{% endif %}
{% endblock %}
login.html
{% extends 'base.html' %}
{% block title %} 登录页面{% endblock %}
{% block content %}
{% endblock %}
list.html
{% extends 'base.html' %}
{% block title %} 用户显示 {% endblock %}
{% block content %}
{% endblock %}
base.html
{% extends 'bootstrap/base.html' %}
{% block styles %}
{# 先继承父类的css样式导入 #}
{{ super() }}
{% endblock %}
{% block navbar %}
{#让每个页面都可以获取闪现信息闪现#}
{% for item in get_flashed_messages() %}
{{ item }}
{% endfor %}
{% endblock %}