作者简介:大家好,我是爱敲代码的小王,CSDN博客博主,Python小白
系列专栏:python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发
如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步
如果感觉博主的文章还不错的话,请三连支持一下博主哦
博主正在努力完成2023计划中:以梦为马,扬帆起航,2023追梦人
python入门到实战专栏:从入门到实战
Python爬虫开发专栏:从入门到实战
Python办公自动化专栏:从入门到实战
Python数据分析专栏:从入门到实战
Python前后端开发专栏:从入门到实战
文章目录
Flask安全上传文件_访问文件
利用flask-wtf验证上传的文件
Restful介绍
Restful的基本使用
Flask_RESTful参数验证
上传文件步骤:
1. 在模版html中,表单需要指定 enctype='multipart/form-data' 才能上传文件。
2. 在后台如果想要获取上传的文件,那么应该使用 request.files.get('文件名') 来获取。
3. 保存文件之前,先要使用 werkzeug.utils.secure_filename 来对上传上来的文件名进行一个过滤。能保证不会有安全问题。
4. 获取到上传上来的文件后,使用 文件对象.save(路径) 方法来保存文件。路径=完整路径=路径名+文件名
upload.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//')
def get_image(filename):
return send_from_directory(UPLOAD_PATH,filename)
if __name__ == '__main__':
app.run(debug=True)
关键点:
1、 定义验证表单类的时候,对文件类型的字段,需要采用 FileField 这个类型,即wtforms.FileField
2、验证器需要从 flask_wtf.file 中导入。 flask_wtf.file.FileRequired 和 flask_wtf.file.FileAllowed
3、flask_wtf.file.FileRequired 是用来验证文件上传不能为空。
4、flask_wtf.file.FileAllowed 用来验证上传的文件的后缀名, 如常见图片后缀 .jpg 和.png以及.gif等。
5、在视图函数中,需要使用 from werkzeug.datastructures import CombinedMultiDict 来把
request.form 与 request.files 来进行合并。
代码如下:
upload.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)
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 |
用户发出的请求有错误,服务器没有进行新建或修改数据的操作 |
401 |
Unauthorized |
用户没有权限访问这个请求 |
403 |
Forbidden |
因为某些原因禁止访问这个请求 |
404 |
NOT FOUND |
用户请求的url不存在 |
406 |
NOT |
用户请求不被服务器接收(比如服务器期望客户端发送某个字段, |
500 |
Internal server |
服务器内部错误,比如遇到bug |
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插件提供了类似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)