Bootstrap

Flask框架【add_argument方法参数详解、Flask_RESTful规范返回值、Flask_RESTful规范返回值-参数设置 、Flask_RESTFul规范返回值-类型设置】(十)

  

👏作者简介:大家好,我是爱敲代码的小王,CSDN博客博主,Python小白
📕系列专栏:python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发
📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦
🍂博主正在努力完成2023计划中:以梦为马,扬帆起航,2023追梦人

🔥🔥🔥 python入门到实战专栏:从入门到实战 

🔥🔥🔥 Python爬虫开发专栏:从入门到实战

🔥🔥🔥 Python办公自动化专栏:从入门到实战

🔥🔥🔥 Python数据分析专栏:从入门到实战

🔥🔥🔥 Python前后端开发专栏:从入门到实战

文章目录

add_argument方法参数详解

Flask_RESTful规范返回值

 Flask_RESTful规范返回值-参数设置

 Flask_RESTFul规范返回值-类型设置

 Flask_RESTful结合蓝图使用


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)

;