flask web学习之flask与http(二)
在flask程序中,客户端发出的请求触发相应的视图函数,获取返回值会作为响应的主体,最后生成完整的响应,即响应报文。
1. HTTP响应
1.1 响应报文
响应报文主要由协议版本、状态码、原因短语、响应首部和响应主体组成。
- 协议版本:响应报文的开头通常包含协议版本信息,用于标识使用的通信协议的版本。如HTTP/1.1。
- 状态码:状态码是一个三位数字的代码,用于表示请求的处理结果。常见的状态码有200(成功)、404(未找到)、500(服务器内部错误)等。
- 原因短语:原因短语是对状态码的文本解释,用于提供关于请求处理结果的更详细的信息。
- 响应首部:响应首部包含了一些额外的信息,如响应内容的类型、长度等。这些信息对于理解响应内容非常重要。
- 响应主体:响应主体是实际的数据内容,即服务器返回给客户端的具体信息。
1.2 常见HTTP状态码
类型 | 状态码 | 原因短语 | 说明 |
---|---|---|---|
成功 | 200 | OK | 请求被正常处理 |
成功 | 201 | Created | 请求被处理,并创建了一个新资源 |
成功 | 204 | No Content | 请求处理成功,但无内容返回 |
重定向 | 301 | Move Permanently | 永久重定向 |
重定向 | 302 | Found | 临时性重定向 |
重定向 | 304 | Not Modified | 请求的资源未被修改,重定向缓存的资源 |
客户端错误 | 400 | Bad Request | 表示请求无效,即请求报文中存在错误 |
客户端错误 | 401 | Unauthorized | 类似403,表示请求资源未授权 |
客户端错误 | 403 | Forbidden | 表示请求资源被服务器拒绝访问 |
客户端错误 | 404 | Not Found | 表示服务器上找不到请求的资源或URL无效 |
服务器端错误 | 500 | Internal Server Error | 服务器内部发生错误 |
1.3 在flask中如何生成响应
响应大部分内容由服务器处理,大多数情况下,我们只负责返回主体内容。响应在flask中使用Response对象表示。
Flask会先判断是否可以找到与请求url相匹配的路由,如果没有返回404。如果找到,就会调用对应的视图函数,视图函数的返回值构成了响应报文的主题内容,正确返回的状态码为200。
1.3.1重定向
如果你访问http://localhost:5000/hi,你会发现页面加载后地址栏中的URL变成了http://localhost:5000/hellp。这种行为被称为重定向,你可以理解为网页跳转。
代码示例:
from flask import Flask, redirect, url_for
@app.route('/hello')
def hello():
# 直接返回网页
return redirect('/hi')
@app.route('/hi')
def hi():
return redirect(url_for('hello'))
1.3.2错误响应
如果你访问http://localhost:5000/brew/coffee,会获得一个418错误响应(I’m a teapot)
大多数情况下,flask可以自动处理常见的错误响应。Http错误对应的异常类在werkzeug的werkzeug.exceptions模块中被定义,抛出这些异常即可返回对应的错误响应。如果你想手动返回错误响应,你可以使用flask提供的abort()函数。
from flask import Flask, abort
@app.route('/404')
def not_found():
abort(404)
abort 函数不需要使用return返回,但他之后的代码也不会在执行。
1.4响应格式
- 纯文本
MIME类型:text/plain
当MIME类型设置为纯文本时,浏览器会以文本形式显示返回值。 - HTML
MIME类型:text/html
当MIME类型设置为text/html时,浏览器会将返回值渲染成html。 - XML
MIME类型:application/xml
XML是指Extensible Markup Language(可扩展标记语言),他是一种简单灵活的文本格式,被设计用来存储和交换数据。XML和HTML的不同之处在于HTML的标签用于显示内容,而XML的标签只用于定义数据。 - JSON
MIME类型:application/json
JSON是指JavaScript object Notation(Javascript 对象表示法),是一种流行的、轻量的数据交换格式。他的出现是为了弥补xml的各种不足。在Python中,通过引入json模块,调用json.dumps()方法将字典、列表或元组序列化为JSON字符串。Flask提供了包装这些方法的jsonify()函数,使操作更方便。
from flask import jsonify
@app.route('/foo')
def foo():
return jsonify(name="hello", gender="45")
return jsonify({"name": "hello", "gender": "45")
return jsonify(message="error"), 500
flask获取json数据可以使用request.get_json()方法和request.json属性。