Flask学习笔记(四)

目录

后端验证邮箱密码是否匹配,返回登录界面

前端访问方法

flask中SECRET_KEY的配置

session与cookie关系

钩子函数(hoke)

装饰器

查询用户的所有相关信息,并且在前端返回

参考文献


后端验证邮箱密码是否匹配,返回登录界面

前端访问方法

没有定义POST方法导致问题

修改方法如下:

@bp.route('/login', methods=['GET','POST'])
def login():
    if request.method == 'GET':
        return render_template("login.html")
    else:
        form = LoginForm(request.form)#验证表格是否正确,输入的账号是否正确,如果是正确的,就拿到数值与数据库进行匹配
        if form.validate():
            email = form.email.data
            password = form.password.data
            user = UserModel.query.filter_by(email=email).first()#查找数据库中是否有这个用户
            if not user:
                return redirect(url_for('auth.login'))#如果没有这个用户就返回登陆界面
                #第一个参数是存储的hash密码,第二个是输入的密码
            if check_password_hash(user.password,password):
                session['user_id'] = user.id#将用户登陆的信息存储在session中,然后存储在网站的服务器中
                return redirect("/")
            else:
                print("账号或者密码输入错误")
                return redirect(url_for('auth.login'))

flask中SECRET_KEY的配置

没有配置导致的问题

SECRET_KEY介绍

用于加密和解密数据的保密密钥,在配置文件中完成,越复杂,在解密的时候越慢,配合使用密码匹配的时候

密钥用于以上几种凭证的生成。以SecretKey为参数,配合适当的签名算法,可以得到原始信息的数字签名,防止内容在传递过程中被伪造或篡改。

密钥通常为成对创建和使用,包含一个AccessKey和一个SecretKey。其中AccessKey会在传输中包含,而用户必须保管好SecretKey不在网络上传输以防止被窃取。若SecretKey被恶意第三方窃取,可能导致非常严重的数据泄漏风险。因此,如发现SecretKey被非法使用。

session与cookie关系

session经过加密之后会存储在cookie中,浏览器拿到cookie后存储在本地。下次向其它页面发送请求的时候,浏览器自动将cookie发送给flask框架,解析session里面的账户id。

如何从session中取到user_id???

钩子函数(hoke)

before_request

@app.before_request
def my_before_request():
    user_id = session.get('user_id')
    if user_id:
        user = UserModel.query.get(user_id)#根据id去session里面找
        setattr(g, 'user',user)#如果找到,赋值给全局变量
    else:
        setattr(g, 'user',None)

@app.context_processor
def my_context_processor():
    return {"user": g.user}#返回一个字典类型,相当于是一个全局变量,在所有模板中都可以使用

装饰器

装饰器是给现有的模块增添新的小功能,可以对原函数进行功能扩展,而且还不需要修改原函数的内容,也不需要修改原函数的调用。

装饰器的使用符合了面向对象编程的开放封闭原则。

开放封闭原则主要体现在两个方面:

  1. 对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。
  2. 对修改封闭,意味着类一旦设计完成,就可以独立其工作,而不要对类尽任何修改。

只有登陆后才能够发布问答,所以添加一个修饰器,所以对于前端发布问答页面要进行一个筛选,先通过@login_required判断

@bp.route('qa/public',methods=['GET','POST'])
@login_required
def public_question():
    if request.method == 'GET':
        return render_template('public_question.html')
    else:
        form = QuestionForm(request.form)#将前端页面提交的表格内容存储下来
        if form.validate():
            #表格验证通过
            title = form.title.data
            content = form.content.data
            question = QuestionModel(title=title,content=content, author = g.user)
            db.session.add(question)
            db.session.commit()
            return redirect('/')
        else:
            print(form.errors)
            return redirect(url_for('qa.public_question'))

装饰器的代码如下图所示:

from functools import wraps
from flask import g,redirect,url_for

def login_required(func):
    @wraps(func)
    #func(a,b,c)
    #func(1,2,c=3)
    def inner(*args, **kwargs):
        if g.user:
            # func(*args, **kwargs) 没有返回值导致函数错误
            return func(*args, **kwargs)
        else:
            return redirect(url_for("auth.login"))
    return inner

redirect

使用url_for函数构建指定函数的URL,操作对象是函数,不是route里的路径,即得到函数的路由地址。

查询用户的所有相关信息,并且在前端返回

前端查询得到所有结果,然后传给前端页面

@bp.route('/')
def index():
    questions = QuestionModel.query.order_by(QuestionModel.create_time.desc()).all()#查询该用户的所有问题回答
    return render_template('index.html',questions=questions)

前端页面展示

<ul class="question-ul">
                    {% for question in questions %}
                        <li>
                            <div class="side-question">
                                <img class="side-question-avatar" src="{{ url_for('static',filename = 'images/avatar.jpg') }}" alt="">
                            </div>
                            <div class="question-main">
                                <div class="question-title"><a href="#">{{ question.title }}</a></div>
                                <div class="question-content">{{ question.content }}</div>
                                <div class="question-detail">
                                    <span class="question-author">{{question.author.username}}</span>
                                    <span class="question-time">{{ question.create_time}}</span>
                                </div>
                            </div>
                        </li>
                    {% endfor %}
                </ul>

参考文献

Access Key / Secret key 密钥安全原理架构_accesskey和secretkey区别-CSDN博客

【Python】一文弄懂python装饰器(附源码例子)_python 装饰器-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值