赞
踩
@基于python的flask框架的request(请求)和response(响应)细节深入
本文将从四个方面详细讲解request和response。
一、request结构
二、获取请求提交数据
三、细节
request的一些常用成员
①.scheme:获取请求方案(协议)http/https
②.method:获取本次请求的请求方式 post\get\delete…
③.request.args:获取使用get请求方式提交的数据
④.request.form:获取使用post请求方式提交的数据
⑤.request.values:获取get和post请求方式提交的数据
⑥.request.cookies:获取cookies中的信息
⑦.request.headers:获取请求头
⑧.request.path:获取请求的url地址
⑨.request.files:获取用户上传的文件
⑩.request.full_path:获取请求的完整路径
完整演示:
首先我们设置一个模板index.html,接下来很多内容都要从index.html继承。
index.html
<html> <head> <meta charset="utf-8"> {% block container1 %} <title>首页</title> {% endblock %} </head> <body> <p>Welcome to Pythoy world!</p> {% block container %} <p>这是模板</p> {% endblock %} <h1> <a href="/request">去往request</a><br/> <a href="/form_do?uname=baoqiang&password=baihe">去往form_do </h1> </body> </html>
run.py文件
from flask import Flask,render_template,request,make_response,redirect app=Flask(__name__) @app.route('/request') def request_views(): #for i in dir(request): scheme=request.scheme#获得协议 method=request.method#获得请求方式 args=request.args#获取get请求方式提交的数据,类型为dict form=request.form#获取POST请求方式提交的数据 values=request.values#获取任意一种请求方式提交的数据 headers=request.headers#获得请求消息头的信息 cookies=request.cookies#获得cookies中的信息 path=request.path#获得请求的url地址 #path_full=request.path_full ua=request.headers['User-Agent']#获取请求头的User-Agent files=request.files#获得用户上传的文件 referer=request.headers.get('referer','none')#获得从哪里来登陆此网站 full_path=request.full_path#获取完整路径 url=request.url#获得访问地址 return render_template('index1.html',params=locals())#locals()打包所有局部变量 if __name__ == '__main__': app.run(debug=True,port=5001)
index1.html
<html> <head> <meta charset="utf-8"> <title>首页——index1</title> </head> <body> <p>Welcome to Pythoy world!</p> {% block container %} <p>这是模板</p> <p>scheme:{{params.scheme}}</p> <p>methods:{{params.method}}</p> <p>args.name:{{params.args['name']}}</p> <p>args.age:{{params.args['age']}} <p>values:{{params.values}}</p> <p>form:{{params.form}}</p> <p>cookies:{{params.cookies}}</p> <p>path:{{params.path}}</p> <p>headers:{{params.headers}}</p> <p>headers.User-Agent:{{params.ua}}</p> <p>files:{{params.files}}</p> <p>headers.referer:{{params.referer}}</p> <p>full_path{{params.full_path}}</p> <p>url:{{params.url}}</p> <p>args:{{params.args}}</p> {% endblock %} </body> </html>
运行结果:
设置端口为5001,访问本机地址localhost:5001/request,或者访问http://127.0.0.1:5001/reques都可以获得相应的运行结果,在此不多论述,需要注意的是我们使用了html继承,格式如下:
在模板(index.html)中
{% block container %}
<p>这是模板</p>
{% endblock %}
在子板(index1.html)中
{% block container %}
...
{% endblock %}
此语法是在子板中需要重写的部分,当然,如果既不重写,又要再次基础上加上自定义内容,只需要在子板中添加以下内容即可。
{% block container %}
...
{{ supper() }}
{% endblock %}
还有一个locals()方法,即为将局部变量打包形成一个字典dict类型。
值得一提的是,referer可以获得从何处访问此url的url。有很多网站需要先访问其首页才能进行下一步访问,否则直接输入url会被拦截在首页中,所以,有些简单的爬虫在爬取这类网站时,写请求头headers的时候,会将referer进行重写。
referer=request.headers.get('referer','none')
(1)设置路由及提交数据
run.py
@app.route('/post',methods=['POST','GET'])
def post():
if request.method=='GET':
return render_template('index4.html')
else:
uname=request.form.get('uname')
password=request.form.get('password')
uemail=request.form.get('uemail')
truename=request.form.get('truename')
with open('用户数据.txt','a+') as f:
for key,value in locals().items():
f.write(str(key)+':'+str(value)+'\n')
#return render_template('上传成功.html',params=locals())
return redirect('/')#重定向函数
index4.html
{% extends'index.html' %}
{% block container1 %}
<title>首页——index4</title>
{% endblock %}
{% block container %}
<form action="/post" method="post">
<p>
用户名称<input type="text" name="uname" value="用户名"></p>
<p>用户密码<input type="password" name="password" ></p>
<p>电子邮件<input type="email" name="uemail"></p>
<p> 真实姓名<input type="text" name="truename"></p>
<button type="submit">提交</button>
</form>
{% endblock %}
运行结果:
在文本框中输入以下信息
点击提交后,会得到:
然后我们得到了一个“用户数据.txt”的文档,在此存储着用户信息。点击提交按钮后,页面跳转到localhost:5001/首页,这是因为我们设置了
return redirect('/')#重定向函数
redirect(’/’)为返回根路径,即返回localhost:5001/所在的页面但是前提是在localhost:5001/post中提交了数据(点击了提交按钮),request接收到了一个post请求。
如果这里看不明白的话,我们可以用render_template()方法来显式的将获得的数据显示出来
运行以下代码:
return render_template('上传成功.html',params=locals())
#return redirect('/')#重定向函数
上传成功.html
<html>
<head>
<meta charset="utf-8">
<title>上传成功</title>
</head>
<body>
<p>上传成功</p>
<p>用户姓名:{{params.uname}}</p>
<p>用户密码:{{params.password}}</p>
<p>电子邮件:{{params.uemail}}</p>
<p>真实姓名:{{params.truename}}</p>
</body>
</html>
当input完成后,页面会自动跳转至以下页面。
值得注意的是在index4.html中,我们使用了action属性,将post提交来的数据返回给/post,所以当前的url还是为localhost:5000/post。
<form action="/post" method="post">
(2)上传文件
@app.route('/file',methods=['POST','GET'])#表单提交方式必须为post,enctype属性必须设置为multipart/form-data
def file_views():
if request.method=='GET':
return render_template('index5.html')
else:#接受名称为uimg的图片、获取上传的图片的名称、再将图片保存到static目录中
f=request.files['uimg']
filename=f.filename
f.save('static/'+filename)
return 'upload ok'
index5.html
<html>
<head>
<meta charset="utf-8">
<title>上传文件</title>
</head>
<body>
<form action="/file" method="post" enctype="multipart/form-data"><!--表单中的数据拆成多个部分,多次提交,必须有文件上传-->
<p>uname:<input type="text" name="uname"></p>
<p>uimg:<input type="file" name="uimg"></p>
<p>
<button type="submit">提交查询</button>
</p>
</form>
</body>
</html>
运行结果:
我们试着上传一个文件,点击提交查询后,便在文件夹中找到了所上传的文件。值得注意的是:
<form action="/file" method="post" enctype="multipart/form-data">
在form 标签内,enctype属性必须为"multipart/form-data"才能正确得再服务器端获得上传的文件。运用此方法,我们即可获得从客户端上传给服务器的文件。将上传的文件保存在/static/路径中
f.save('static/'+filename)
①.methods:一般我们在浏览器上访问网站时,大多数请求方式为get,post请求都是用户需要和服务器端进行交互时的请求方式,例如上传文件,链接等等。
②.html继承:
在模板中
{% block container1 %}
...
{% endblock %}
在子板中
{% extends'index.html' %}
...
{% block container1 %}
③.重定向方法
redirect('/')#重定向方法
④.响应对象
@app.route('/response')
def response_views():#响应对象
res=make_response(render_template('index4.html'))
return res
这里的响应对象可以是字符串(html)或者javascript等
⑤.服务器接收到的数据处理问题,如从客户端上传的文件
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。