当前位置:   article > 正文

flask的request结构、客户端上传数据和服务器处理数据_python flask从request中获取文件流

python flask从request中获取文件流

@基于python的flask框架的request(请求)和response(响应)细节深入

基于python的flask框架的request(请求)和response(响应)细节深入

本文将从四个方面详细讲解request和response。

一、request结构
二、获取请求提交数据
三、细节

一、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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

运行结果:
在这里插入图片描述

设置端口为5001,访问本机地址localhost:5001/request,或者访问http://127.0.0.1:5001/reques都可以获得相应的运行结果,在此不多论述,需要注意的是我们使用了html继承,格式如下:
在模板(index.html)中

{% block container %}
    <p>这是模板</p>
    {% endblock %}
  • 1
  • 2
  • 3

在子板(index1.html)中

{% block container %}
...
{% endblock %}
  • 1
  • 2
  • 3

此语法是在子板中需要重写的部分,当然,如果既不重写,又要再次基础上加上自定义内容,只需要在子板中添加以下内容即可。

{% block container %}
...
{{ supper() }}
{% endblock %}
  • 1
  • 2
  • 3
  • 4

还有一个locals()方法,即为将局部变量打包形成一个字典dict类型。
值得一提的是,referer可以获得从何处访问此url的url。有很多网站需要先访问其首页才能进行下一步访问,否则直接输入url会被拦截在首页中,所以,有些简单的爬虫在爬取这类网站时,写请求头headers的时候,会将referer进行重写。

referer=request.headers.get('referer','none')
  • 1

二、获取请求提交数据

(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('/')#重定向函数
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

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 %}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

运行结果:
在这里插入图片描述
在文本框中输入以下信息
在这里插入图片描述
点击提交后,会得到:
在这里插入图片描述
然后我们得到了一个“用户数据.txt”的文档,在此存储着用户信息。点击提交按钮后,页面跳转到localhost:5001/首页,这是因为我们设置了

return redirect('/')#重定向函数
  • 1

redirect(’/’)为返回根路径,即返回localhost:5001/所在的页面但是前提是在localhost:5001/post中提交了数据(点击了提交按钮),request接收到了一个post请求。
如果这里看不明白的话,我们可以用render_template()方法来显式的将获得的数据显示出来
运行以下代码:

 return render_template('上传成功.html',params=locals())
        #return redirect('/')#重定向函数
  • 1
  • 2

上传成功.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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

当input完成后,页面会自动跳转至以下页面。
在这里插入图片描述
值得注意的是在index4.html中,我们使用了action属性,将post提交来的数据返回给/post,所以当前的url还是为localhost:5000/post。

<form action="/post" method="post">
  • 1

(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'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

运行结果:
在这里插入图片描述
我们试着上传一个文件,点击提交查询后,便在文件夹中找到了所上传的文件。值得注意的是:

<form action="/file" method="post" enctype="multipart/form-data">
  • 1

在form 标签内,enctype属性必须为"multipart/form-data"才能正确得再服务器端获得上传的文件。运用此方法,我们即可获得从客户端上传给服务器的文件。将上传的文件保存在/static/路径中

f.save('static/'+filename)
  • 1

三、细节

①.methods:一般我们在浏览器上访问网站时,大多数请求方式为get,post请求都是用户需要和服务器端进行交互时的请求方式,例如上传文件,链接等等。
②.html继承:
在模板中

{% block container1 %}
...
{% endblock %}
  • 1
  • 2
  • 3

在子板中

{%  extends'index.html' %}
...
{% block container1 %}
  • 1
  • 2
  • 3

③.重定向方法

redirect('/')#重定向方法
  • 1

④.响应对象

@app.route('/response')
def response_views():#响应对象
    res=make_response(render_template('index4.html'))
    return res
  • 1
  • 2
  • 3
  • 4

这里的响应对象可以是字符串(html)或者javascript等
⑤.服务器接收到的数据处理问题,如从客户端上传的文件

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Guff_9hys/article/detail/960484
推荐阅读
相关标签
  

闽ICP备14008679号