Flask 请求与响应
request:请求
response:响应
# http一次前后端交互:先请求,后响应
Request:客户端向服务器发送的请求
服务器在接收到客户端的请求后,会自动创建Request对象
由Flask框架创建,Request对象不可修改
url | 完整请求地址 | |
base_url | 去掉GET参数的URL | |
host_url | 只有主机和端口号的URL | |
path | 路由中的路径 | |
method * | 请求方法 | |
remote_addr | 请求的客户端地址 | |
args * | GET请求参数 | |
form * | POST请求参数 | |
files | 文件上传,接受二进制文件 | |
headers | 请求头 | |
cookies | 请求中的cookie | |
# 重要属性
print(request.method) # 请求方式, 'GET'或'POST'
# GET 请求的参数
# ImmutableMultDict:类字典对象,打印出来是列表套元组的形式
print(request.args) # ImmutableMultDict[('name', 'lisi'),('name','wangwu'),('age', '33')] 跟字典用法一样,可以用中括号取他的Key对应的值,也可以用。get方式,区别是它可以允许有重复的Key
print(request.args.get('name') # lisi 33 中括号的方式取值,如果key不存在就会报错
print(request.args['name'], request.args['age']) # lisi 33
print(request.args.get('name')) # lisi 在有多个name的情况下使用。get只会获取到第一个,在django中是获取到最后一个
print(request.args.getlist('name')) # ['lisi', 'wangwu'] 在有多个name的情况下要用getlist
# POST 请求的参数
print(request.form) # ImmtableMultDict([('name','lucy'),('age','33')])
print(request.form.get('name')) # lucy
# cookie
print(request.cookies) # ImmtableMultDict(['name','hello'])
# 路径
res = request.get('http://127.0.0.1:5000/request/?name=lisi&name=wangwu&age=33',cookies={'name':'hello'})
print(res.text)
print(request.path) # /request/ 路由
print(request.url) # http://127.0.0.1:5000/request/?name=lisi&name=wangwu&age=33 完整的路径
print(request.base_url) # http://127.0.0.1:5000/request/ 去掉参数的路径
print(request.host_url) # http://127.0.0.1:5000/ 去掉参数、路径,只剩下ip和端口
print(request.remote_addr) # 127.0.0.1 ,客户端的ip
print(request.files) # 文件内容, ImmtableMultDict([])
print(request.headers) # 请求头
print(request.user_agent) # 用户代理,包括浏览器和操作系统的信息
app/views.py
from flask import Blueprint, request
from .models import *
# 蓝图
blue = Blueprint('user', __name__)
@blue.route('/request/', methods=['GET','POST'])
def get_request():
pass
print(request) # <Request 'http://127.0.0.1:5000/request/' [GET]> 包括:大写的Request对象、网址、请求方式
# 重要属性
# Response: 服务器端向客户端发送的响应
@blue.route('/response/')
def get_response():
pass
# 响应的几种方式
# 1.返回字符串(不常用)
return 'response OK'
# 2.模版渲染(前后端不分离)
return render_tamplate('index.html', name='张三', age=33)
# 3.返回json数据(前后端分离)
data = {'name': '李四','age': 44}
return data
# jsonify(): 序列化, 字典=》字符串
return jsonify(data)
# 4.自定义Response对象
html = render_template('index_html', name='张三',age=33)
print(html,type(html)) # <class 'str'>
## 第一种写法
res = make_response(html,200) # 需要导入make_response的包
## 另外一种写法
res = Response(html) # 需要导入Response包
return res
# Redirect:重定向
@blue.route('/redirect/')
def make_redirect():
pass
# 重定向的几种方式
# 第一种:
return redirect('http://www.qq.com')
# 第二种:
return redirect('/response/') # 在项目内使用,它通过重新找路由,进到对应的视图函数中
# 第三种:
# 反向解析,通过视图函数名反过来找到路由器
# url_for('蓝图名称.视图函数名')
ret = url_for('user.get_response')
print('ret', ret) # /response/
return redirect(ret)
# url_for传参
ret2 = url_for('user.get_request', name = '李四', age=66)
return redirect(ret2)