P7 Day2 ---- 请求与响应

知识点回顾

  • 虚拟环境如何搭建?
  • Flask的几种配置方式? 区别是什么?
  • 什么是设计模式? 工厂模式是什么?
  • 如何封装Flask APP? 意义是什么?
  • Flask路由定义的语法是什么? 参数的含义都是什么?
  • 如何启动Flask 服务器?

今日内容

  • 请求的参数
    • 固定参数与转换器
    • 查询参数
    • 表单数据
    • 文件上传
    • 其他请求参数
  • 响应新手三件套
  • json数据与元组数据
  • make_response()自定义响应

1. 请求数据及后端获取

1.1 请求的参数

客户端请求的参数可以放三个地方:

  • URL参数:
    • 固定参数
    • 查询字符串
  • 请求头
  • 请求体

请求参数如下表:

序号参数或信息解释
1固定参数URL的组成部分, 不可缺失
2查询字符串: args根据需求, 可有可无
3表单数据: form提交form表单时传递的数据
4文件上传: files用户向服务器上传的文件
5请求头: headers请求头中携带的请求信息

1.2 固定参数与转换器

固定参数: 地址中的一部分,必需
如 /article/1,这里1作为文章的id, 则是不可缺少的一部分;
/article/1?title=“装饰器”,title跟在?后面, 是查询字符串,非必需

  1. 固定参数的获取
# 固定参数的获取
@app.route('/users/<user_id>')
def user_info(user_id):
    print(user_id,type(user_id))
    return '获取到的userid为: {}'.format(user_id)

# 使用<user_id>接收固定参数, 将user_id传给视图。

以上为不限定类型,默认为字符串类型。
限定类型使用<int:user_id>,固定参数就必须符合类型要求,否则报404。
 
默认字符串类型:
<name>
<string:name>
 
float类型
<float: number>
int类型
<int: user_id>
<uuid: uuid>

flask中匹配路由基本都是通过转换器实现,默认有6个转换器:
app.url_map.default_converters

   DEFAULT_CONVERTERS = {
        'default': UnicodeConverter, #  字符串
        'string': UnicodeConverter,  #  字符串转换器
        'any':  AnyConverter, # 任意类型转换器 ?
        'path': PathConverter, # 路径转换器 如匹配
        'int': IntegerConverter,
        'float': FloatConverter,
        'uuid': UUIDConverter,
    }

自定义转换器

# 导入BaseConverter
from werkzeug.routing import BaseConverter

# 自定义Converter类
class PhoneConverter(BaseConverter):
    regex = r'1[3-9]\d{9}'

# 添加至converters字典
app.url_map.converters['phone'] = PhoneConverter

# 使用自定义转换器
@app.route('/user/<phone:user_id>')
def user_info(user_id):
    reutnr user_id

1.3 查询参数获取

# 查询参数,以?拼接的key=value组合
# /user/?userid=333
    
# 获取查询参数
request.args.get('key') # 建议
request.args['key']

# 示例:
from flask import Flask
from flask import request

app = Flask(__name__)


@app.route('/')
def user_info():
    # 通过['key']形式获取查询参数的user_id
    user_id_1 = request.args['userid']
    # 通过get方式获取查询参数中的user_id
    user_id_2 = request.args.get('userid')
    return 'user_id_1: {}, user_id_2: {}'.format(user_id_1, user_id_2)

# 访问路由: http://127.0.0.1:5000/?userid=333, 即可在页面上看到结果.

1.4.表单数据获取

form表单数据, 一般用在登录, 注册信息提交。 将表单数据封装在请求体中。

request.form.get('key')

# 示例
from flask import Flask
from flask import request

app = Flask(__name__)

@app.route('/', method=['POST'])
def login():
    # 获取form表单中的用户名
    username = request.form.get('uname')
    # 获取form表单中的密码
    password = request.form.get('pwd')
    # 用户名与密码的判断
    if username == 'admin' and password == 'admin123':
        return '登录成功'
    else:
        return '登录失败'


if __name__ == '__main__':
    app.run()

# apipost访问http://127.0.0.1:5000/, 并指定form-data为{'uname': 'admin', 'pwd': 'admin'}

1.5 文件上传

# 文件对象的获取
file = request.files.get('key')

# 文件对象的属性
file.filename: 上传文件的文件名
file.name: 上传文件指定的key
file.save('path'): 文件对象保存方法
    
# 示例:
from flask import Flask
from flask import request

# 创建Flask实例对象
app = Flask(__name__)

@app.route('/upload', methods=['POST'])
def upload_file():
    # 获取前端传递过来的文件对象
    img = request.files.get('pic')
    # 获取文件对象的文件名
    file_name = img.filename
    # 保存文件对象
    img.save(file_name)
    return '上传成功!'


if __name__ == '__main__':
    app.run()

1.6 其他请求参数

  • headers: 请求头数据
  • method: 请求方法
  • url: 请求的完整URL地址
  • path: 路由地址
# 示例:
from flask import Flask
from flask import request

# 创建Flask实例对象
app = Flask(__name__)


@app.route('/')
def index():
    # 请求头信息
    print(request.headers)
    # 打印请求方法
    print(request.method)
    # 打印请求的URL
    print(request.url)
    return 'other args'


if __name__ == '__main__':
    app.run()

2. 响应数据之新手三件套

2.1 字符串响应

直接使用return关键字返回一个字符串:

# 字符串
return 'hello flask'

2.2 模板响应

  • 建立templates文件夹
  • 创建xxx.html页面,在视图中render_template
# 模板的返回
# 示例:
from flask import Flask
from flask import render_template

app = Flask(__name__)


@app.route('/')
def index():
    # render_template()返回模板
    return render_template('index.html')
	# return render_template("users/index.html")
	# 直接在templates下找模板

if __name__ == '__main__':
    app.run()

2.3 重定向响应

重定向是跳转至一个新的路由, 使用redirect

  • 直接重定向一个外链
  • 重定向一个内部链接
# 重定向外链示例:
from flask import Flask
from flask import redirect

app = Flask(__name__)

@app.route('/')
def index():
    # 访问/根路由, 直接跳转至百度首页
    return redirect('http://www.baidu.com/')


if __name__ == '__main__':
    app.run()
    
# 重定向至内部连接
from flask import url_for

app = Flask(__name__)

@app.route('/')
def start():
    # 使用url_for跳转至内部链接, url_for()中指定某个路由的endpoint值
    return redirect(url_for('idx'))
	# redirect直接跳转, 内部传入指定的路由
    # return redirect('/index')


@app.route('/index', endpoint='idx')
def index():
    return 'index页面'


if __name__ == '__main__':
    app.run(debug=True)

3. 响应json数据与元组数据

3.1 json数据响应

返回json数据需要借助flask提供的jsonify来实现


# 实例如下:
from flask import Flask
from flask import jsonify

app = Flask(__name__)

@app.route('/index', endpoint='idx')
def index():
    # 字典形式数据
    data = {
            'name': 'jeremy',
            'age': 18
        }
    # 返回json数据
    return jsonify(data)

if __name__ == '__main__':
    app.run(debug=True)

3.2 元组数据响应

返回一个元组,必须是 (response, status, headers) 的形式,且至少包含2个元素。 status 值会覆盖状态代码, headers 可以是一个列表或字典,作为额外的消息标头值。


# 示例如下:
from flask import Flask
from flask import jsonify

app = Flask(__name__)


@app.route('/index', endpoint='idx')
def index():
	# return ('要返回的字符串', 6969是状态码, {'author': 'jeremy'}字典是设置在响应头中的键值对信息)
    return ('要返回的字符串', 6969, {'author': 'jeremy'})


if __name__ == '__main__':
    app.run(debug=True)

4. make_response()自定义响应

flask可以返回make_response自定义的响应, make_response()内部需要传递返回的字符串, 其创建的对象还有headers属性用于设置响应头, status属性用于设置状态码

# 示例如下:
from flask import Flask
from flask import make_response


app = Flask(__name__)


@app.route('/index', endpoint='idx')
def index():
    # 响应字符串
    resp = make_response('自定义的响应字符串')
    # 响应头键值对
    resp.headers['author'] = 'jeremy'
    # 状态码与状态码提示信息
    resp.status = '6969 post'
    # 注意: 响应头键值对与状态码提示信息均为英文, 否则抛异常
    return resp


if __name__ == '__main__':
    app.run(debug=True)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

laufing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值