👏作者简介:大家好,我是爱敲代码的小王,CSDN博客博主,Python小白
📕系列专栏:python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发
📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦
🍂博主正在努力完成2023计划中:以梦为马,扬帆起航,2023追梦人
🔥🔥🔥 python入门到实战专栏:从入门到实战
🔥🔥🔥 Python爬虫开发专栏:从入门到实战
🔥🔥🔥 Python办公自动化专栏:从入门到实战
🔥🔥🔥 Python数据分析专栏:从入门到实战
🔥🔥🔥 Python前后端开发专栏:从入门到实战
文章目录
add_argument方法参数详解
add_argument方法可以指定这个字段的名字,这个字段的数据类型等,验证错误提示信息等,具体如下:
1、default:默认值,如果这个参数没有值,那么将使用这个参数指定的默认值。
2、required:是否必须。默认为False,如果设置为True,那么这个参数就必须提交上来。
3、type:这个参数的数据类型,如果指定,那么将使用指定的数据类型来强制转换提交上来的值。可以使用python自带的一些数据类型(如str或者int),也可以使用flask_restful.inputs下的一些特定的数据类型来强制转换。
3.1、url:会判断这个参数的值是否是一个url,如果不是,那么就会抛出异常。
3.2、regex:正则表达式。
3.3、date:将这个字符串转换为datetime.date数据类型。如果转换不成功,则会抛出一个异常.
4、choices:固定选项。提交上来的值只有满足这个选项中的值才符合验证通过,否则验证不通过。
5、help:错误信息。如果验证失败后,将会使用这个参数指定的值作为错误信息。
6、trim:是否要去掉前后的空格。
代码案例
from flask import Flask
from flask_restful import Api,Resource,inputs
from flask_restful.reqparse import RequestParser
app = Flask(__name__)
api = Api(app)
class RegisterView(Resource):
def post(self):
# 建立解析器
parser = RequestParser()
# 定义解析规则
parser.add_argument('uname',type=str,required=True,trim=True,help='用户名不符合规范')
parser.add_argument('pwd',type=str,help='密码错误',default='123456')
parser.add_argument('age',type=int,help='年龄验证错误!')
parser.add_argument('gender',type=str,choices=['男', '女','保密'],help='性别验证错误')
parser.add_argument('birthday',type=inputs.date,help='生日验证错误')
parser.add_argument('phone',type=inputs.regex('^1[356789]\d{9}$'),help='电话验证错误')
parser.add_argument('homepage',type=inputs.url,help='个人主页验证错误')
# 解析数据
args = parser.parse_args()
print(args)
return {'msg':'注册成功!'}
api.add_resource(RegisterView,'/register/')
if __name__ == '__main__':
app.run(debug=True)
Flask_RESTful规范返回值
对于一个类视图,可以指定好一些字段做标准化用于返回。
以后使用ORM模型或者自定义模型的时候,他会自动的获取模型中相应的字段,
生成json格式数据,然后再返回给客户端。
使用方法
1、导入 flask_restful.marshal_with 装饰器
2、定义一个字典变量来指定需要返回的标准化字段,以及该字段的数据类型
在请求方法中,返回自定义对象的时候,flask_restful会自动的读取对象模型上的所有属性。
组装成一个符合标准化参数的json格式字符串返回给客户端
from flask import Flask
from flask_restful import Api,Resource,fields,marshal_with
app = Flask(__name__)
api = Api(app)
class News:
def __init__(self,code,msg,state,content):
self.code = code
self.msg = msg
self.state1 =state
self.content = content
class NewsView(Resource):
resouce_fields ={
'code':fields.Integer,
'msg':fields.String,
'state':fields.String
}
@marshal_with(resouce_fields)
def get(self):
return {'code':200,'msg':'访问成功!','state':'移动'}
@marshal_with(resouce_fields)
def post(self):
return {'msg':'注册成功!'}
@marshal_with(resouce_fields)
def put(self):
# 在返回对象时,会自动在对象中获取与约定好的字段,并获取封装成json。
news = News(404, 'OK', '电脑端','小童')
return news
api.add_resource(NewsView,'/news/')
if __name__ == '__main__':
app.run(debug=True)
Flask_RESTful规范返回值-参数设置
设置重命名属性和默认值
问题
规范给出的属性名和模型内部的属性名不相同
解决方案
使用 attribute 配置这种映射,比如: fields.String(attribute='username')
问题
某些字段,没有值,但想给一个值做为默认值
解决方案
使用 default 指定默认值,比如: fields.String(default='txc')
from flask import Flask
from flask_restful import
Api,Resource,fields,marshal_with
app = Flask(__name__)
api = Api(app)
class News:
def __init__(self,code,msg,info):
self.code = code
self.msg = msg
self.info = info
self.state = 1000
class NewsView(Resource):
resouce_fields ={
'code':fields.Integer(default=200),#通过参数default来设置默认值
'msg':fields.String,
'content':fields.String(attribute='info'),
# 通过参数attribute来设置提取数据的字段
'state':fields.Integer(default=2000)
# 优先级不如真实数据里面的高
}
@marshal_with(resouce_fields)
def get(self):
news = News(200,'访问成功!','移动')
return news
@marshal_with(resouce_fields)
def post(self):
return {'msg':'增加数据成功!','info':'联通'}
@marshal_with(resouce_fields)
def put(self):
news = News(200,'访问成功!','移动')
return news api.add_resource(NewsView,'/news/')
if __name__ == '__main__':
app.run(debug=True)
Flask_RESTFul规范返回值-类型设置
大型的互联网项目中,返回的数据格式,有时是比较复杂的结构。
如:豆瓣电影
https://movie.douban.com/j/chart/top_list?type=24&interval_id=100%3A90&action=&start=20&limit=20
返回的值里有json或者列表数据,这时可以通过以字段来实现
fields.List 放置一个列表
fields.Nested放置一个字典
from flask import Flask
from flask_restful import
Api,Resource,fields,marshal_with
app = Flask(__name__)
api = Api(app)
class User:
def __init__(self,uname):
self.uname = uname
def __repr__(self):
return f'<User uname:{self.uname}>'
class NewsType:
def __init__(self,_type):
self._type = _type
def __repr__(self):
return f'<User type:{self._type}>'
class News:
def __init__(self,code,msg):
self.code = code
self.msg = msg
self.user = None
self._type = []
def __repr__(self):
return f'<News code:{self.code} msg: {self.msg} user:{self.user} type: {self._type}>'
def create_data():
user = User('尚学堂')
_type1 = NewsType('IT')
_type2 = NewsType('Python')
news = News(200,'Python又双叕更新了!')
news.user = user
news._type.append(_type1)
news._type.append(_type2)
return news
class NewsView(Resource):
resouce_fields ={
'code':fields.Integer,
'msg':fields.String,
'user':fields.Nested({
'uname':fields.String
}),
'_type':fields.List(fields.Nested({
'_type':fields.String
}))
}
@marshal_with(resouce_fields)
def get(self):
news = create_data()
return news api.add_resource(NewsView,'/news/')
if __name__ == '__main__':
app.run(debug=True)
# print(create_data())
Flask_RESTful结合蓝图使用
Flask_RESTful结合蓝图使用
在蓝图中,如果使用Flask_RESTful,
创建Api对象的时候,传入蓝图对象即可,不再是传入 app 对象
# user/views.py
from user import user_bp
from flask_restful import Api,Resource
api = Api(user_bp)
class LoginView(Resource):
def get(self):
return {'msg':'注册成功!!'}
# 建立映射关系
api.add_resource(LoginView,'/login/')
# user/__init__.py
from flask.blueprints import Blueprint
user_bp = Blueprint('user',__name__)
from user import views
# app.py
from flask import Flask
app = Flask(__name__)
from user import user_bp
app.register_blueprint(user_bp)
if __name__ == '__main__':
app.run(debug=True)