Flask框架入门(5)request、session、response、cookie

Flask提供的内置对象常用的有request, session, g。这些对象可以在模板或请求函数中直接使用。

目录

request对象

session对象

响应

Cookie使用

全局对象g


request对象

首先需要从flask模块导入request

from flask import request

request.args.get() 获取Get请求URL参数

request.form['username'] 获取表单username内容

from flask import request

@app.route('/login', methods=['POST', 'GET'])
def login():
    if request.method == 'POST':
        if request.form['user'] == 'admin':
            return 'Admin login successfully!'
        else:
            return 'No such user!'
    title = request.args.get('title', 'Default')
    return render_template('login.html', title=title)

session对象

会话可以用来保存请求的一些状态,以便于在请求之间共享信息。

from flask import Flask, session, redirect, url_for, escape, request

app = Flask(__name__)

# 实际使用不能使用简单的值,可以使用os.urandom(24)生成复杂秘钥
app.secret_key = b'_5#y2L"F4Q8z\n\xec]/'

@app.route('/')
def index():
    if 'username' in session:
        return 'Logged in as %s' % escape(session['username'])
    return 'You are not logged in'

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        session['username'] = request.form['username']
        return redirect(url_for('index'))
    return '''
        <form method="post">
            <p><input type=text name=username>
            <p><input type=submit value=Login>
        </form>
    '''

要设置一个密钥app.secret_key,越复杂越好,防止CSRF攻击。

可以用命令行生成一个高强度的秘钥

$ python -c 'import os; print(os.urandom(16))'

在退出的时候清除用户数据

@app.route('/logout')
def logout():
    session.pop('user', None)
    return redirect(url_for('login'))

要注意基于cookie的session使用,Flask会把session里面设置的Object序列化到cookie里,如果发现请求之间的一些值不能保持,就要比较页面响应的cookie大小跟浏览器支持的大小。要使用服务器端session保持可以使用一些第三方的扩展。

响应

参考官方文档:https://flask.palletsprojects.com/en/1.1.x/quickstart/#accessing-request-data

返回的值会自动转换成一个response对象。

(1)如果返回是字符串,会自动转换成一个以字符串为响应体(response body),状态码为200,mime-type为text/html,其它参数默认的响应(response)对象。

(2)如果返回的是字典,调用jsonify()创建响应对象返回。

(3)如果返回的是元组,元组要符合下面的格式:(response, status), (response, headers), 或 (response, status, headers)。

(4)如果返回的数据不是以上的类型,Flask会返回一个符合WSGI应用的响应对象。

下面是返回字典数据例子:

返回的是字典数据,Flask自动转换成Json数据:
@app.route("/me")
def me_api():
    user = get_current_user()
    return {
        "username": user.username,
        "theme": user.theme,
        "image": url_for("user_image", filename=user.image),
    }

可以使用jsonify()创建成Json数据类型返回:
@app.route("/users")
def users_api():
    users = get_all_users()
    return jsonify([user.to_json() for user in users])

下面是返回元组数据的例子:

@app.errorhandler(404)
def not_found(error):
    # 元组格式(response, status)
    return render_template('error.html'), 404


可以使用make_response包装返回的表达式,更加精细控制返回的对象,例如设置响应头等信息。
@app.errorhandler(404)
def not_found(error):
    resp = make_response(render_template('error.html'), 404)
    resp.headers['X-Something'] = 'A value'
    return resp

make_response方法就是用来构建response对象的,第二个参数代表响应状态码,缺省就是”200”。

Cookie使用

request的cookies属性获取cookie,response对象的set_cookie方法设置cookie

读cookies:

from flask import request

@app.route('/')
def index():
    username = request.cookies.get('username')
    # use cookies.get(key) instead of cookies[key] to not get a
    # KeyError if the cookie is missing.

设置cookies:

from flask import make_response

@app.route('/')
def index():
    resp = make_response(render_template(...))
    resp.set_cookie('username', 'the username')
    return resp

全局对象g

flask.g是Flask一个全局对象,作用范围就在一个请求(也就是一个线程)里,它不能在多个请求间共享。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

繁星点点-

请我喝杯咖啡呗

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值