Flask教程(二)

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值