Flask(3)
一、请求(request)
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 请求消息头的信息
1 from flask import Flask, render_template, url_for, request 2 3 app = Flask(__name__) 4 5 # 访问路径 http://localhost:5000/01-request 6 @app.route('/01-request') 7 def request_views(): 8 # print(dir(request)) 9 # 获取请求方案(协议) 10 scheme = request.scheme 11 # 获取请求方式 12 method = request.method 13 # 获取get请求方式的请求数据 14 args = request.args 15 # 获取post请求方式的请求数据 16 form = request.form 17 # 获取cookies中的信息 18 cookies = request.cookies 19 # 获取请求路径(具体资源,不带参数) 20 path = request.path 21 # 获取请求路径(具体资源,带参数) 22 full_path = request.full_path 23 # 获取请求路径(完整路径) 24 url = request.url 25 # 获取所有的请求消息头 26 headers = request.headers 27 print(headers) 28 # 获取 User-Agent 请求消息头信息 29 ua = request.headers['User-Agent'] 30 # 获取 Referer 请求消息头的信息 31 referer = request.headers.get('Referer','') 32 return render_template('01-request.html',params= locals()) 33 34 35 if __name__ == '__main__': 36 app.run(debug=True)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h3>scheme:{{ params.scheme }}</h3> <h3>method:{{ params.method }}</h3> <h3>args : {{ params.args }}</h3> <h3>form : {{ params.form }}</h3> <h3>cookies : {{ params.cookies }}</h3> <h3>path : {{ params.path }}</h3> <h3>full_path : {{ params.full_path }}</h3> <h3>url : {{ params.url }}</h3> <h3>headers : {{ params.headers }}</h3> <h3>User-Agent : {{ params.ua }}</h3> <h3>Referer : {{ params.referer }}</h3> </body> </html>
2、获取请求提交的数据
1、get 请求方式
1、表单允许实现的get请求
<form action="" method="get">
姓名:<input name="uname">
</form>
2、所有地址栏访问请求都是get请求的数据
3、在请求地址后拼请求提交的参数
http://localhost:5000/02-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 列表数据
1 from flask import Flask, render_template, url_for, request 2 3 app = Flask(__name__) 4 5 # 访问地址 http://localhost:5000/05-form-get 6 @app.route('/02-form-get') 7 def form_get(): 8 return render_template('05-form-get.html') 9 10 #访问地址 http://localhost:5000/06-get 11 @app.route('/03-get') 12 def get_views(): 13 #print(request.args) 14 15 uname = request.args['uname'] 16 upwd = request.args['upwd'] 17 18 print('uname:%s,upwd:%s' % (uname,upwd)) 19 20 return "Get Success" 21 22 23 if __name__ == '__main__': 24 app.run(debug=True)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1> <a href="/02-get?uname=laowei&upwd=wangwc">去往02-get</a> </h1> <form action="/02-get" method="get"> <p> 姓名: <input type="text" name="uname"> </p> <p> 密码: <input type="password" name="upwd"> </p> <p> <input type="submit" value="提交"> </p> </form> </body> </html>
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 中,想提交数据给服务器要判断。
1 from flask import Flask, render_template, url_for, request 2 3 app = Flask(__name__) 4 5 #访问地址 http://localhost:5000/03-form-post 6 @app.route('/03-form-post',methods=['GET','POST']) 7 def form_post(): 8 if request.method == 'GET': 9 return render_template('03-post.html') 10 else: 11 uname = request.form['uname'] 12 upwd = request.form['upwd'] 13 uemail = request.form['uemail'] 14 tname = request.form['tname'] 15 print("用户名:%s,密码:%s,邮箱:%s,真实姓名:%s" % (uname, upwd, uemail, tname)) 16 return "Post OK" 17 18 19 if __name__ == '__main__': 20 app.run(debug=True)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/03-form-post" method="post"> <p> 用户名称:<input type="text" name="uname"> </p> <p> 用户密码:<input type="password" name="upwd"> </p> <p> 用户邮箱:<input type="email" name="uemail"> </p> <p> 真实姓名:<input type="text" name="tname"> </p> <p> <input type="submit"> </p> </form> </body> </html>
3、自定义错误页面
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 需要自定义
二、响应(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
1 import os 2 import datetime 3 from flask import Flask, render_template, request, make_response, redirect 4 5 app = Flask(__name__) 6 7 @app.route('/04-js') 8 def js_views(): 9 return render_template('04-js.html') 10 11 @app.route('/05-get') 12 def get_views(): 13 name = request.args['name'] 14 age = request.args['age'] 15 return "姓名:%s,年龄:%s" % (name,age) 16 17 18 if __name__ == '__main__': 19 app.run(debug=True)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <button onclick="btnClick()">跳转</button> <script> function btnClick(){ window.location.href='/05-get?name=wangwc&age=35' } </script> </body> </html>
3、重定向
1、什么是重定向
由服务器端通知客户端重新向一个新的地址发送请求

2、语法
from flask import redirect
... ...
return redirect('重定向地址')
=================================
resp = redirect('重定向地址')
# 借助resp实现其他的响应行为
return resp
1 import os 2 import datetime 3 from flask import Flask, render_template, request, make_response, redirect 4 5 app = Flask(__name__) 6 7 @app.route('/06-response') 8 def response_views(): 9 # resp = make_response('这是使用响应对象创建出来的响应内容') 10 resp = make_response(render_template('04-js.html')) 11 return resp 12 13 @app.route('/07-redirect') 14 def redirect_views(): 15 #直接通过重定向的方式,将请求发送给03-response 16 return redirect('/06-response') 17 18 if __name__ == '__main__': 19 app.run(debug=True)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <button onclick="btnClick()">跳转</button> <script> function btnClick(){ window.location.href='/05-get?name=wangwc&age=35' } </script> </body> </html>
三、文件上传
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)
示例:
将上传的文件名称更改为 当前的时间(年月日时分秒微秒).扩展名 再保存到服务器上
1 import os 2 import datetime 3 from flask import Flask, render_template, request, make_response, redirect 4 5 app = Flask(__name__) 6 7 @app.route('/07-file',methods=['GET','POST']) 8 def file_views(): 9 if request.method == 'GET': 10 return render_template('07-file.html') 11 else: 12 # 获取上传的文件 13 f = request.files['uimg'] 14 # 将上传的文件保存至指定的目录处 15 # 获取上传的文件的文件名 16 # 将文件名修改为当前时间作为名称,再上传 17 ftime=datetime.datetime.now().strftime('%Y%m%d%H%M%S%f') 18 # 获取文件的扩展名 19 ext=f.filename.split('.')[1] 20 filename = ftime + '.' + ext 21 22 23 # 将上传的文件保存至指定目录处[绝对路径] 24 basedir = os.path.dirname(__file__) 25 upload_path=os.path.join(basedir,'static/upload',filename) 26 print('upload_path:'+upload_path) 27 f.save(upload_path) 28 29 return "Upload OK" 30 31 if __name__ == '__main__': 32 app.run(debug=True)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/07-file" method="post" enctype="multipart/form-data"> <p> 用户名称: <input type="text" name="uname"> </p> <p> 用户头像: <input type="file" name="uimg"> </p> <p> <input type="submit"> </p> </form> </body> </html>
posted on 2018-11-07 21:20 破天荒的谎言、谈敷衍 阅读(264) 评论(0) 收藏 举报
浙公网安备 33010602011771号