一、Json格式
1.豆瓣中的json格式
- 打开豆瓣网页
https://movie.douban.com/tv/#!type=tv&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=0
-
打开控制台(F12)
打开json数据的时候变成这个格式是因为添加了json viewer插件,在我之前的笔记中有教程
- 我们将这里面的json数据复制一下
- 在项目下新建一个test.json,将刚刚复制好的数据粘进去
{
"subjects": [
{
"rate": "7.5",
"cover_x": 4429,
"cover_x": "传闻中的陈芊芊",
"url": "https://movie.douban.com/subject/34463197/",
"playable": true,
"cover": "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2602398693.webp"
},
{
"rate": "7.5",
"cover_x": 4429,
"cover_x": "传闻中的陈芊芊",
"url": "https://movie.douban.com/subject/34463197/",
"playable": true,
"cover": "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2602398693.webp"
},
{
"rate": "7.5",
"cover_x": 4429,
"cover_x": "传闻中的陈芊芊",
"url": "https://movie.douban.com/subject/34463197/",
"playable": true,
"cover": "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2602398693.webp"
}
]
}
(因为数据太多我们进行了一下修剪)
返回Json格式 :通用数据格式
json {}对象 、[]json数组
2.json和字典的相互转换
-
新建一个json_demo.py文件
- 将json字符串转化成字典
tvs = """
{
"subjects": [
{
"rate": "7.5",
"cover_x": 4429,
"cover_x": "传闻中的陈芊芊",
"url": "https://movie.douban.com/subject/34463197/",
"playable": true,
"cover": "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2602398693.webp"
},
{
"rate": "7.5",
"cover_x": 4429,
"cover_x": "传闻中的陈芊芊",
"url": "https://movie.douban.com/subject/34463197/",
"playable": true,
"cover": "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2602398693.webp"
},
{
"rate": "7.5",
"cover_x": 4429,
"cover_x": "传闻中的陈芊芊",
"url": "https://movie.douban.com/subject/34463197/",
"playable": true,
"cover": "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2602398693.webp"
}
]
}
"""
import json
#json.loads()将json字符串转化成字典
print(type(tvs))
test_dict = json.loads(tvs)
print(type(test_dict))
print([x for x in test_dict["subjects"]])
-
如果想要加载前两个数据
- 将字典类型转换成json
#将字典类型转换成json
json_dict = {
"name":"zhangsan",
"age":18
}
#json.dumps将python字典转化成json字符串
res = json.dumps(json_dict)
print((type(res)))
3.返回json数据
方式一:jsonify
- 打开app.py文件
from flask import jsonify
@app.route('/demo3')
def demo3():
json_dict = {
"name" : "zhangsan",
"age" : 18
}
return jsonify(json_dict)
- 刷新网页:http://localhost:5001/demo3
-
查看类型
方式二:json.dumps()【不推荐】
import json
#不推荐使用json.dumps()转换成Json字符串返回
#因为返回的数据要符合http 协议规范
#如果是json需要指定Content-Type:application/json
@app.route('/demo4')
def demo4():
json_dict = {
"name" : "zhangsan",
"age" : 18
}
res = json.dumps(json_dict)
return res
- 刷新网页:http://localhost:5001/demo4
-
查看类型
1.不推荐使用json.dumps()转换成Json字符串返回
2.因为返回的数据要符合http 协议规范
3.如果是json需要指定Content-Type:application/json
二、重定向
from flask import redirect
#重定向
@app.route('/demo5')
def demo5():
return redirect('https://www.baidu.com')
- 重定向到视图函数
from flask import url_for
#重定向到视图函数
@app.route('/demo6')
def demo6():
return redirect(url_for('demo3'))
- 重定向到有参数的视图函数中
#重定向到带有参数的视图函数
@app.route('/demo7')
def demo7():
return redirect(url_for('user_info',user_id=1000))
- 自定义状态码
#自定义状态码
@app.route('/demo8')
def demo8():
#python中的return可以一次返回多个对象
return '自定义状态码',666
三、匹配路由
- 使用正则表达式匹配路由
# 使用正则表达式匹配路由
from flask import Flask
from werkzeug.routing import BaseConverter
app = Flask(__name__)
# 1、 导入转换器基类,在flask中,所有的路由匹配规则都是使用转换器对象进行记录
# 2、 自定义转换器继承BaseConverter
# 3、 添加转换器到默认的字典中
# 4、 使用自定义转换器实现自定义规则匹配
class RegexConverter(BaseConverter):
def __init__(self, url_map,*args):
super(RegexConverter, self).__init__(url_map)
# 将第一个参数当做匹配规则进行保存
print(args[0])
self.regex = args[0]
app.url_map.converters['re'] = RegexConverter
@app.route('/user/')
def user_info(user_id):
# return 'user_id %d'% user_id
return 'user_id %{}'.format(user_id)
if __name__ == '__main__':
app.run(debug=True)
- 输入网址:http://127.0.0.1:5000/user/222
四、异常
主动抛出异常
- 新建一个demo_exp.py文件
from flask import Flask, abort
app = Flask(__name__)
@app.route('/')
def index():
# 主动抛出 http异常状态码
abort(500)
# 只能抛出http协议错误的状态码
abort(666)
return 'haha'
if __name__ == '__main__':
app.run(debug=True)
错误捕获
from flask import Flask, abort
app = Flask(__name__)
@app.route('/')
def index():
# 主动抛出 http异常状态码
# abort(500)
# 中能抛出http协议错误的状态码
# abort(666)
a = 0
b = 1/a
return 'haha'
# 捕获错误
# errorhandler装饰器
@app.errorhandler(500)
def errorhandler_server(e):
return "服务器坏啦"
@app.errorhandler(ZeroDivisionError)
def zeroDivisionError(e):
return '除数不能为0'
if __name__ == '__main__':
app.run(debug=True)
(此文章仅作为个人学习笔记使用,如有错误欢迎指正~)