一、响应报文
响应报文主要由协议版本、状态码(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 |
HTML | text/html |
XML | application/xml |
JSON | application/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:上述的代码其实有很多伪码,大家根据情景,深入理解一下其实还是很好写全的,就酱!