4、请求(request) 和 响应(response)
1、HTTP协议
Request Headers - 请求消息头
Response Headers - 响应消息头
2、请求对象 - request
request - 请求对象,封装了所有与请求相关的信息。如:请求数据,请求消息头,请求路径,... ...
在 Flask 中,请求信息被封装到 request 对象中。要使用 request 的话,必须先导入:from flask import request
1、request的常用成员:
1、scheme : 获取请求方案(协议)
2、method : 获取本次请求的请求方式(get/post)——(重点)
3、args : 获取使用get请求方式提交的数据
4、form : 获取使用post请求方式提交的数据
5、cookies: 获取 cookies 的相关信息
6、headers: 获取 请求消息头 的相关信息
7、files : 获取用户上传的文件
8、path : 获取请求的url地址(进入到主机后的请求数据资源地址,不包含请求参数)
9、full_path: 获取请求的url地址(完整路径),(进入到主机后的请求资源地址,包含请求参数)
10、url : 获取完整的请求地址,从协议开始的地址
11、values: 获取GET和POST请求方式提交的数据(GET和POST通用)
12、referer:获取Referer 请求消息头的信息
referer = request.headers.get('Referer','')
Content-Type
2、获取请求提交的数据
1、get 请求方式
1、表单允许实现的get请求
<form action="" method="get">
姓名:<input name="uname">
</form>
2、所有地址栏访问请求都是get请求的数据
3、在请求地址后拼请求提交的参数
http://localhost:5000/06-get?uname=xxx&upwd=xxx
get请求的数据是放在 QueryString 中的
获取 get 请求方式提交的数据 :
request.args 封装的就是 get 请求的数据,类型为字典。
ex:request.args['name'] : 获取 name 对应的值
request.args.get('name') : 同上
request.args.getlist('name_list') : 获取 name_list 列表数据
2、post 请求方式
1、post请求的数据只有在表单中才能够被触发
<form method="post">
post请求的数据是放在 form 中的
2、获取 post 请求提交的数据:
request.form 封装的就是 post 请求的数据,类型为字典。
request.form['name'] : 获取 name 对应的值
request.form.get('name') : 获取 name 对应的值
request.form.getlist('name') : 获取 name 列表数据(如复选框,下拉列表)
3、在 /login 中,想提交数据给服务器要判断。
5、自定义错误页面
1、404 的错误处理
@app.errorhandler(404)
def page_not_found(e):
return render_template('404.html'),404
2、500的错误处理
@app.errorhandler(500)
def internal_server_error(e):
return render_template('500.html'),500
... ...
404.html,500.html 需要自定义
练习:
1.访问地址为 http://localhost:5000/07-form-post 能够去往07-form.html模板
2.在 07-form.html 中
包含一个表单,post 提交方式,提交地址为 /07-post,控件如下
1.文本框 - 用户名
2.密码框 - 用户密码
3.文本框 - 用户邮箱<input type="email">
4.文本框 - 真实姓名
5.提交按钮
3.在 07-post 中
获取所有请求提交的数据,并打印在终端中
1、响应(response)
1、什么是响应
响应就是由服务器端带给客户端的内容,对应着请求。
响应可以是普通的字符串,模板 或 重定向
ex: @app.route('/')
def index():
return "普通字符串"
return render_template('xxx.html')
# 以上两种行为,本质上响应回去的都是字符串
2、响应对象
响应对象:将响应的内容封装到一个对象中,可以完成更多的响应的行为(如:增加cookies,...)
1、构建响应对象,再响应给客户端
注意:不是直接响应字符串,而是响应对象。响应对象可以包含响应的字符串,同时也可以实现其他的响应操作
2、在 flask 中,使用 make_response() 构建响应对象
from flask import make_response
@app.route('/xxx')
def xxx():
resp = make_response('响应内容')
# 允许实现其他的响应行为,如:添加cookies,...
return resp
3、重定向
1、什么是重定向
由服务器端通知客户端重新向一个新的地址发送请求
2、语法
from flask import redirect
... ...
return redirect('重定向地址')
=================================
resp = redirect('重定向地址')
# 借助resp实现其他的响应行为
return resp
2、文件上传
1、注意问题
表单中如果有文件上传的话,必须遵循以下两个要求
1、提交方式 method 必须为 post
2、表单的 enctype 属性必须设置为 multipart/form-data
2、服务器端
1.通过 request.files 获取上传的文件
f = request.files['文件框的name属性值']
2.通过 f.save(保存路径) 将文件保存至指定目录处
通过 f.filename 获取文件的名称
filename = f.filename
f.save('static/'+f.filename)
----------------------------
任务:
将上传的文件名称更改为 当前的时间(年月日时分秒微秒).扩展名 再保存到服务器上
@app.route('/05-file',methods=['GET','POST'])
def file_views():
if request.method == 'GET':
return render_template('05-file.html')
else:
# 获取上传的文件
f = request.files['uimg']
# 获取上传的文件的文件名
# filename = f.filename
# 将上传的文件名称更改为当前的时间(年月日时分秒微秒).扩展名,再上传
ftime = datetime.datetime.now().strftime('%Y%m%d%H%M%S%f')
# 获取文件的扩展名
ext = f.filename.split('.')[1]
filename = ftime + '.' + ext
# 将上传的文件保存至指定的目录处[绝对路径]
basedir = os.path.dirname(__file__)
upload_path = os.path.join(basedir,'static/upload',filename)
print('upload_path:'+upload_path)
f.save(upload_path)
return "Upload OK"
---------------------------------