美文网首页
Flask Day2

Flask Day2

作者: ququququ | 来源:发表于2019-04-05 22:43 被阅读0次

    Author: 陈伦巨

    Data: 2019-04-05

    Email: 545560793@qq.com

    github: https://github.com/smartisantt

    一、响应

    响应是后端响应给前端的内容。

    1、导包:

    from flask import make_response

    2、响应

    make_response('响应内容', 状态码)

    成功响应的状态码是200,也可以手动修改状态码(不建议手动修改)。

    响应的内容可以是页面的源码。

    也可以响应页面。(在工程目录下新建两个文件夹,分别是static和templates,在templates中新建index.html)

    例如:

    @app.route('/make_res/')
    def make_res():
        # 响应状态码
        # return make_response('Hello', 200)
        # 响应网页源码
        # return make_response('<div style="color:red; font-size:34px;">hello flask day02</div>')
        # 响应页面
        index = render_template('index.html')
        return make_response(index, 200)    # 200为状态码,不写默认200
    

    二、模拟注册页面

    在templates文件下准备两个html文件

    register.html文件,内容如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>注册页面</title>
    </head>
    <body>
        <!--action是请求提交的地址,不写默认是当前的地址-->
        <form action="" method="post">
            <p>姓名:<input type="text" name="username"></p>
            <p>密码:<input type="password" name="password"></p>
            <p>确认密码:<input type="password" name="password2"></p>
            <p><input type="submit" value="提交"></p>
        </form>
    </body>
    </html>
    

    login.html文件,内容如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>登录页面</title>
    </head>
    <body>
        <!--action是请求提交的地址,不写时当前的地址-->
        <form action="/login/" method="post">
            <p>姓名:<input type="text" name="username"></p>
            <p>密码:<input type="password" name="password"></p>
            <p><input type="submit" value="提交"></p>
        </form>
    </body>
    </html>
    

    后端文件:

    注册:

    @app.route('/register/', methods=['GET', 'POST'])
    def register():
        print(request.method)
        if request.method == 'GET':
            return render_template('register.html')
        if request.method == 'POST':
            # 模拟注册功能
            # 获取前端传来的值
            username= request.form.get('username')
            password= request.form.get('password')
            password2= request.form.get('password2')
            # 校验前端前传来的值
            if username == 'ququ' and password == password2 == '123456':
                return render_template('login.html')
            else:
                return render_template('regist.html')
    

    注意:if request.methos == 'GET' 是判断请求方式。

    登录:

    @app.route('/login/', methods=['GET', 'POST'])
    def login():
        if request.method == 'GET':
            return render_template('login.html')
        if request.method == 'POST':
            # 获取前端传来的值
            username = request.form.get('username')
            password = request.form.get('password')
            if username == 'ququ' and password  == '123456':
                return render_template('index.html')
            else:
                return render_template('login.html')
    

    二、cookie

    1、什么是cookie

    登录网址,登录网址的时候是一直登录的,打开该网站其他页面怎么知道我是登录的?

    由于HTTP无状态协议,无法记录当前用户是否登录。为了解决登录状态的保持我们要使用cookie,cookie 用来识别用户。cookie保存一个令牌(标识符)用于识别用户的登录状态。cookie是不能跨浏览器的。比如:你用IE浏览器登录你的淘宝账号,你同时打开火狐浏览器的淘宝,是未登录状态。

    2、设置

    cookie是在用户登录成功的时候设置的。这个cookie好比一个同行证。

    # 获取响应对象
    res = make_response(render_template('index.html'))
    # 设置cookie
    res.set_cookie('token', '12345', max_age=600)
    return res # 响应给页面的时候给cookie添加了一个参数token
    

    设置好cookie之后,用户下次再来访问,我们从request中的cookie去获取token值,校验value是否和设置的相等。校验成功则无需再次输入用户名和密码登录。实际项目中token值设置成随机数。

    3、校验登录
    @app.route('/index/')
    def index():
        # 登录之后才能看到index.html页面,没有登录跳到登录页面
        token = request.cookies.get('token')
        if token == '12345':
            # 判断登录成功
            return render_template('index.html')
        else:
            return render_template('login.html')
    
    4、退出登录

    退出登录就是要删除当前用户的token

     res = make_response()
    res.delete_cookie('token')
    

    注意:cookie中设置的参数有字节限制,一般用来保存token,不能无限的存储参数,cookie不能跨浏览器浏览。

    三、session

    session数据保存在客户端(flask默认存储session的形式)

    导包:from flask import session

    设置:session[key]=value

    用session的方式实现登录:

    @app.route('/session_login/', methods=['GET', 'POST'])
    def session_login():
        if request.method == 'GET':
            return render_template('session_login.html')
    
        if request.method == 'POST':
            username = request.form.get('username')
            password = request.form.get('password')
            if username == 'ququ' and password == '123456':
                # 启动permanent修改为True
                session.permanent = True
                session['login_state'] = 1
                return render_template('index.html')
            else:
                return render_template('session_login.html')
    

    运行上面的代码,输入用户名和密码后会报错:

    RuntimeError: The session is unavailable because no secret key was set.  Set the secret_key on the application to something unique and secret.
    

    这里需要设置app.secret_key加密复杂程度和设置有关。

    # session加密方式
    app.secret_key = '123'
    
    # 设置过期时间,5秒后session失效
    app.permanent_session_lifetime = 5
    

    用session方式验证用户是否登录:

    @app.route('/session_index/')
    def session_index():
        if 'login_status' in session:
            return render_template('index.html')
        else:
            return render_template('session_login.html')
    

    注意:

    1)设置一个持久化会话的存活时间,必须修改session.permanent的属性和flask对象app的permanent_session_lifetime属性,permanent_session_lifetime属性作为datetime.timedelta对象,从Flask0.8开始也可以用一个整数表示多少秒后过期。

    2)加密的强度取决于SECRET_KEY的复杂程度。一般SECRET_KEY可以通过os.urandom(24)随机生成。

    四、应用

    Session和Cookie的结合使用,一般有两种存储方式:

    第一种:session数据存储在客户端:

    Flask采用‘secure cookie’方式保存session,即session数据是使用base64编码后保存在客户端的cookie中。也就是说无需依赖第三方数据库保存session数据。

    第二种:session数据存储在服务端:

    步骤1:客户端发送请求到服务端,服务端会校验cookie中的sessionid值,如果cookie中不存在sessionid则认为客户端访问服务端时,是发起了一个新的会话

    步骤2:如果是新的会话,则服务端传递给客户端一个cookie,并在cookie中存储一个新的sessionid值,并将相关数据保存在session中。

    步骤3:客户端下次再次发送请求的时候,请求上下文对象会携带cookie,通过校验cookie中的sessionid值,即可判断是否是同一会话。

    步骤4:如果校验是同一会话,则可以从session中获取到之前保存的数据。

    安装第三库:pip install flask-session

    还要安装redis :pip install redis

    # 配置session
    from flask_session import Session
    app.config['SESSION_TYPE'] = 'redis'
    app.config['SESSION_REDIS'] = redis.Redis()
    app.secret_key = '1234567890' # 设置加密程度
    Session(app)
    

    相关文章

      网友评论

          本文标题:Flask Day2

          本文链接:https://www.haomeiwen.com/subject/fjqliqtx.html