Flask web开发入门笔记(四、Flask与HTTP响应)

6 篇文章 0 订阅

一、响应报文

响应报文主要由协议版本、状态码(status code)、原因短语(reason phrase)、响应首部和响应主体组成。
在这里插入图片描述
常见的HTTP状态码:
在这里插入图片描述

二、在Flask中生成响应

#普通的响应可以只包含主体内容:
@app.route('/hello')
def hello():
    return 'hello csdn!', 201

#如果想修改或附加某个首部字段,需要将首部中的Location字段设置为重向的目标URL:
@app.route('/hello')
def hello():
    return '',302, {'Location','http://www.baidu.com'}#现在访问当前地址会重向到百度的网页。

#在多数情况下,除了响应主体,其他部分我们通常只需要使用默认值即可。

1.重定向
重定向(Redirect)可以理解为网页跳转,首部中将Location字段设置为重定向的目标URL,浏览器接收接收到重定向响应后会向Location字段中的目标URL发起新的GET请求。
在这里插入图片描述

#前面的例子简化:
from flask import Flask, redirect
@app.route('/hello')
def hello():
    return redirect('http://www.baidu.com')
   
#使用redirect()函数时,默认的状态码为302,即临时重定向,若要修改状态码,可以在redirect()函数中作为第二个参数或者使用code关键字传入。


#如果要在程序内重定向到其他视图,可以使用url_for()函数生成目标URL
from flask import Flask,redirect,url_for
@app.route('/hi')
def hi():
    return redirect(url_for('hello')) #重定向到/hello
@app.route('/hello')
def hello():
    return redirect('http://www.baidu.com')

2、错误响应

#abort()函数可以手动返回错误响应
from flask import Flask,abort
@app.route('/404')
def not_found():
    abort(404)
#abort()函数不需要使用return语句,但一旦abort()函数被调用,abort()函数之后的代码将不会被执行。

二、响应格式

不同的响应数据格式需要设置不同的MME类型,一般默认HTML类型。

#如果想使用不同的MME类型,可以用过Flask提高的make_response()方法生成响应对象,传入响应的主题作为参数,然后使用响应对象的mimetype属性设置MME类型
@app.route('/foo')
def foo():
    response = make_response('hello world')
    response.mimetype = 'text/plain'
    return response
#也可以直接设置首部字段比如response.headers [' Content-Type']='text/xml;charset=utf-8'。但是操作mimetype属性更加方便,而且不用设置字符集(charset)选项。
常用数据格式MME类型
纯文本text/plain
HTMLtext/html
XMLapplication/xml
JSONapplication/json
#使用json模块时我们一般不会采用上述形式,而是将其简化
from flask import jsonify

@app.route('/foo')
def foo():
    return jsonify(name = 'zhangsan', gender:'male')
#jsonif()函数默认生成端口200响应

三、Cookie技术

Cookie技术可以通过在请求和响应报文中添加Cookie数据来保存客户端的状态信息。

这里又不得不提到Response的常用属性和方法:
在这里插入图片描述
set_cookie()方法支持多个参数来设置Cookie的选项。
在这里插入图片描述

#设置cookie
from flask import Flask , make_response, redirect, url_for

app = Flask(__name__)

@app.route('/set/<name>')
def set_cookie(name):
    response = make_response(redirect(url_for('hello')))
    response.set_cookie('name',name)
    return response
 

Cookie设置示意图:
在这里插入图片描述

四、session:安全的Cookie

Flsk提供了session对象用来将Cookie数据加密储存。

1.设置程序密钥

#通过Flask.secret_key属性或配置变量SECRET_KEY设置,例如:
app.secret_key = 'secret string'

#更安全的做法是把密钥写进系统环境变量(在命令行中使用export或set命令),或是保存在.env文件中:
SECRET_KEY = secret string

#然后在程序脚本中使用os模块提供的getenv()方法获取:
import os

app.secret_key = os.getenv('SECRET_KEY','secret string')

2.模拟用户认证

from flask import redirect, session, url_for

@app.route('/login')
def login():
    session['logged_in'] = True #写入session
    return redirect(url_for('hello'))
    #这个登录视图只是简化的实例
#当支持用户登录后,我们就可以根据用户的认证状态分别显示不同的内容。在login视图的最后,我们将程序重定向到hello视图,下 面是修改后的hello视图:
from flask import request, session
@app.route('/')
@app.route('/he1lo')
def hello() :
    name = request.args.get('name')
if name is None:
    name = request.cookies.get('name', 'Human')
    response = '<h1>He11o,%s!</h1>' #各name根据用户认证状态返回不同的内容.
    if 'logged_ in' in session:
        response += ' [Authenticated] '
    else:
        response += ' [Not Authentica ted] '
    return response

模拟管理后台

from flask import session, abort

@app.route('/admin')
def admin():
    if 'logged_in' not in session:
        abort(403)
    return 'welcome to admin page.'

登出用户

from flask import session

@app.route('/logout')
def logout():
    if 'logged_in' in session:
        session.pop('logged_in')
    return redirect(url_for('hello'))

ps:上述的代码其实有很多伪码,大家根据情景,深入理解一下其实还是很好写全的,就酱!

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值