flask框架实例

需求:

我们现在想要创建一个网站,有导航栏(如图)
在这里插入图片描述
同时做一个登陆界面、一个注册界面、一个主页。
要求登陆界面与注册界面可以互相转换、只有root用户可以查看并删除用户信息、用户只有登陆后才可以进入主页。

新建flask项目
如图:
flask框架实例_第1张图片
其中,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请求方法 #}
{# name="username" ====> 将name里面的值username作为key值, 表单里面填写的内容作为value值, 提交到request.form #} {# type="text" : 要求填写的是一个字符串 #}
{% 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 %}
    

用户信息显示




{% for user in users %} {# user是一个字典, 获取字典的key值, user.keyname #} {# 寻找删除的按钮 #} {% endfor %}
用户名 密码 删除
{{ user.username }} {{ user.password }} {# 删除 #} 删除
{% endblock %}

base.html

{% extends 'bootstrap/base.html' %}

{% block styles %}
    {#  先继承父类的css样式导入   #}
    {{ super() }}
    
{% endblock %}

{% block navbar %}
    


    {#让每个页面都可以获取闪现信息闪现#}
    {% for item in get_flashed_messages() %}

        
    {% endfor %}
{% endblock %}

你可能感兴趣的:(python)