Flask框架【Flask安全上传文件_访问文件、利用flask-wtf验证上传的文件、Restful介绍、Restful的基本使用、Flask_RESTful参数验证】(九)

👏作者简介:大家好,我是爱敲代码的小王,CSDN博客博主,Python小白
📕系列专栏:python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发
📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦
🍂博主正在努力完成2023计划中:以梦为马,扬帆起航,2023追梦人

🔥🔥🔥 python入门到实战专栏:从入门到实战 

🔥🔥🔥 Python爬虫开发专栏:从入门到实战

🔥🔥🔥 Python办公自动化专栏:从入门到实战

🔥🔥🔥 Python数据分析专栏:从入门到实战

🔥🔥🔥 Python前后端开发专栏:从入门到实战

文章目录

Flask安全上传文件_访问文件

利用flask-wtf验证上传的文件

Restful介绍

Restful的基本使用

Flask_RESTful参数验证


Flask安全上传文件_访问文件

上传文件步骤:

1. 在模版html中,表单需要指定 enctype='multipart/form-data' 才能上传文件。

2. 在后台如果想要获取上传的文件,那么应该使用 request.files.get('文件名') 来获取。

3. 保存文件之前,先要使用 werkzeug.utils.secure_filename 来对上传上来的文件名进行一个过滤。能保证不会有安全问题。

4. 获取到上传上来的文件后,使用 文件对象.save(路径) 方法来保存文件。路径=完整路径=路径名+文件名

upload.html页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>上传文件</title>
</head>
<body>
   <form action="" method="post" enctype="multipart/form-data">
    <table>
            <tr>
                <td>头像:</td>
                <td><input type="file" name="pichead"></td>
            </tr>
            <tr>
                <td>描述:</td>
                <td><input type="text" name="desc"></td>
            </tr>
            <tr>
                <td></td>
                <td><input type="submit" value="提交"></td>
            </tr>
    </table>
  </form>
 </body>
</html>


app.py文件

from flask import Flask,request,render_template
import os from werkzeug.utils import secure_filename

app = Flask(__name__)
UPLOAD_PATH = os.path.join(os.path.dirname(__file__),'images')

@app.route('/upload/',methods= ['GET','POST'])
def upload():
    if request.method == 'GET':
        return  render_template('upload.html')
    else:
        desc = request.form.get("desc")
        pichead = request.files.get("pichead")
        filename = secure_filename(pichead.filename) #包装一下 保证文件安全

        #pichead.save(os.path.join(UPLOAD_PATH,pichead.filename)) #可优化
        pichead.save(os.path.join(UPLOAD_PATH,filename)) #已优化
        print(desc)
        return '文件上传成功'

if __name__ == '__main__':
    app.run(debug=True)

访问文件

从服务器上读取文件,应该定义一个url与视图函数,来获取指定的文件。
在这个视图函数中,使用 send_from_directory(文件的目录,文件名) 来获取。

from flask import Flask
import os from flask import send_from_directory

app = Flask(__name__)
UPLOAD_PATH = os.path.join(os.path.dirname(__file__),'images')

@app.route('/images/<filename>/')
def get_image(filename):
    return  send_from_directory(UPLOAD_PATH,filename)

if __name__ == '__main__':
    app.run(debug=True)

利用flask-wtf验证上传的文件

关键点:

1、 定义验证表单类的时候,对文件类型的字段,需要采用 FileField 这个类型,即wtforms.FileField

2、验证器需要从 flask_wtf.file 中导入。 flask_wtf.file.FileRequiredflask_wtf.file.FileAllowed

3、flask_wtf.file.FileRequired 是用来验证文件上传不能为空。

4、flask_wtf.file.FileAllowed 用来验证上传的文件的后缀名, 如常见图片后缀 .jpg 和.png以及.gif等。

5、在视图函数中,需要使用 from werkzeug.datastructures import CombinedMultiDict 来把
request.formrequest.files 来进行合并。

代码如下:

upload.html页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>上传文件</title>
</head>
<body>
   <form action="" method="post" enctype="multipart/form-data">
    <table>
            <tr>
                <td>头像:</td>
                <td><input type="file" name="pichead"></td>
            </tr>
            <tr>
                <td>描述:</td>
                <td><input type="text" name="desc"></td>
            </tr>
            <tr>
                <td></td>
                <td><input type="submit" value="提交"></td>
            </tr>
      </table>
    </form>
  </body>
</html>

formscheck.py文件

from wtforms import Form,FileField,StringField
from wtforms.validators import InputRequired
# flask_wtf
from flask_wtf.file import FileRequired,FileAllowed

class UploadForm(Form):
    pichead = FileField(validators= [FileRequired(),FileAllowed(['jpg','png','gif'])])
    desc = StringField(validators= [InputRequired()])

app.py文件

from flask import Flask,request,render_template
import os from werkzeug.utils import secure_filename
from formscheck import UploadForm
from werkzeug.datastructures import CombinedMultiDict
app = Flask(__name__)
UPLOAD_PATH = os.path.join(os.path.dirname(__file__),'images')

#利用flask-wtf验证上传的文件
@app.route('/upload/',methods= ['GET','POST'])
def upload():
    if request.method == 'GET':
        return render_template('upload.html')
    else:
        form = UploadForm(CombinedMultiDict([request.form,request.files]))
        if form.validate():
            # desc = request.form.get("desc")
            # pichead = request.files.get("pichead")
            desc = form.desc.data
            pichead = form.pichead.data
            filename = secure_filename(pichead.filename)

            pichead.save(os.path.join(UPLOAD_PATH,filename))
            print(desc)
            return '文件上传成功'
        else:
            print(form.errors)
            return "文件上传失败"

if __name__ == '__main__':
    app.run(debug=True)


Restful介绍

1.Restful接口规范

REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是RESTful。
RESTful是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。
它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次。
RESTful接口规范是用于在前端与后台进行通信的一套规范。使用这个规范可以让前后端开发变得更加轻松。

2.适用场景:一个系统的数据库数据,展现的平台有PC端、移动端、app端、ios端。
前端工程师:都遵循RESTful编程规范
后端工程师:都遵循RESTful编程规范
最终结果:开发效率高,便于管理

3.协议:用http或者https协议。

4.数据传输格式:
数据传输的格式应该都用json格式。

5.url链接规则:

url链接中,不能有动词,只能有名词。并且对于一些名词,如果出现复数,那么应该在后面加s。
比如:获取新闻列表,应该使用 /news/ ,而不应该使用/get_news/

6.HTTP请求方式:

GET:从服务器上获取资源。
POST:在服务器上新增或者修改一个资源。
PUT:在服务器上更新资源。(客户端提供所有改变后的数据)
PATCH:在服务器上更新资源。(客户端只提供需要改变的属性)
DELETE:从服务器上删除资源。

7.状态码:

状态码

原因描述

描述

200

OK

服务器成功响应客户端的请求。

400

INVALID
REQUEST

用户发出的请求有错误,服务器没有进行新建或修改数据的操作

401

Unauthorized

用户没有权限访问这个请求

403

Forbidden

因为某些原因禁止访问这个请求

404

NOT FOUND

用户请求的url不存在

406

NOT
Acceptable

用户请求不被服务器接收(比如服务器期望客户端发送某个字段,
但是没有发送)。

500

Internal server
error

服务器内部错误,比如遇到bug

Restful的基本使用

1.介绍:

优势: Flask-Restful是一个专门用来写restful api的一个插件。使用它可以快速的集成restful api接口功能。在系统的纯api的后台中,这个插件可以帮助我们节省很多时间。

缺点:如果在普通的网站中,这个插件就没有优势了,因为在普通的网站开发中,是需要去渲染HTML代码的,而Flask-Restful在每个请求中都是返回json格式的数据。

2.安装:

pip install flask-restful

3.基本使用:

定义Restful的类视图:
 1. 从 flask_restful 中导入 Api ,来创建一个 api 对象。
 2. 写一个类视图,让他继承自 Resource 类,然后在这个里面,使用你想要的请求方式来定义相应的方法,比如你想要将这个类视图只能采用 post 请求,那么就定义一个 post 方法。
 3. 使用 api.add_resource 来添加类视图与 url 。

from flask import Flask,url_for
# pip install flask-restful

from flask_restful import Resource,Api
app = Flask(__name__)
# 建立Api对象,并绑定应用APP
api = Api(app)

class LoginView(Resource):
    def get(self):
        return {"flag":True}
    def post(self):
        return {"flag":False}

# 建立路由映射
# api.add_resource(LoginView,'/login/')
api.add_resource(LoginView,'/login/','/login2/',endpoint='login')

with app.test_request_context():
    # werkzeug.routing.BuildError: Could notbuild url for endpoint 'LoginView'.
    # Did you mean 'loginview' instead?
    # 默认没有写endpoint反向url_for函数通过小写函数名
    # 如果有多个url,会返回第1个URL
    # print(url_for('loginview'))
    print(url_for('login'))

if __name__ == '__main__':
    app.run(debug=True)

注意:

1、如果你想返回json数据,那么就使用flask_restful,如果你是想渲染模版,那么还是采用之前的方式,就是 app.route 的方式。
2、 url还是跟之前的一样,可以传递参数。也跟之前的不一样,可以指定多个url。

3、endpoint是用来给url_for反转url的时候指定的。如果不写endpoint,那么将会使用视图的
名字的小写来作为endpoint。

4、add_resource的第二个参数是访问这个视图函数的url,这个url可以跟之前的route一样,可以传递参数,并且还有一点不同的是,这个方法可以传递多个url来指定这个视图函数

Flask_RESTful参数验证

参数验证
参数验证也叫参数解析
Flask-Restful插件提供了类似WTForms来验证提交的数据是否合法的包,叫做reqparse。

基本用法

1 通过 flask_restful.reqparse 中 RequestParser 建立解析器
2 通过 RequestParser 中的 add_argument 方法定义字段与解析规则
3 通过 RequestParser 中的 parse_args 来解析参数

         1 解析正确,返回正确参数
        2 解析错误,返回错误信息给前端

from flask import Flask
from flask_restful import Api,Resource
from flask_restful.reqparse import RequestParser
app = Flask(__name__)
api = Api(app)

class RegisterView(Resource):
    def post(self):
        # 建立解析器
        parser = RequestParser()
        # 定义数据的解析规则
        parser.add_argument('uname',type=str,required=True,help='用户名验证错误',trim=True)
        # 解析数据
        args = parser.parse_args()
            # 正确,直接获取参数
        print(args)
            # 错误,回馈到前端
        
        # 响应数据
        return {'msg':'注册成功!!'}

# 建立映射关系
api.add_resource(RegisterView,'/register/')


if __name__ == '__main__':
    app.run(debug=True)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值