在烧瓶中轻松验证和处理文件上传
flask-transfer的Python项目详细描述
通过一个 反对而不是把所有的东西塞进你的路线。
厌倦了这个?
@app.route('/upload',methods=['GET','POST'])defhandle_upload():form=FileUploadForm()ifform.validate_on_submit():filehandle=form.uploaded.dataallowed_exts=('md','txt','rst')ifnotos.path.splitext(filehandle.filename)[1]inallowed_exts:raiseSomeError('Unallowed extension!')iffilehandle.read()!=b'Hello World!':raiseSomeError('File contents not allowed!')filehandle.seek(0)username=g.current_user.nameupload_dir=current_app.config['UPLOAD_DIR']full_path=os.path.join(upload_dir,username,secure_filename(filehandle.filename))filehandle.save(full_path)flash("Uploaded {}!".format(filehandle.filename),'success')returnredirect(url_for('handle_upload'))else:returnrender_template('upload.html',form=form)
真是一团糟。你的测试者真的在逃避你。 这单曲大概有四五种不同的情节 路线!啊。
有更好的方法
fromflask_transferimportTransfer,UploadErrorfromflask_transfer.validatorsimportAllowedExtsTextFileTransfer=Transfer(validators=[AllowedExts('md','rst','txt')])@TextFileTransfer.destinationdefsave_to_user_dir(filehandle,metadata):username=g.current_user.nameupload_path=current_app.config['UPLOAD_DIR']full_path=os.path.join(upload_dir,username,secure_filename(filehandle.filename))filehandle.save(full_path)@TextFileTransfer.validatordefcheck_file_contents(filehandle,metadata):iffilehandle.read()!=metadata['allowed_contents']:raiseUploadError('File contents not allowed!')filehandle.seek(0)returnTrue@app.route('/upload',methods=['GET','POST'])defhandle_upload():form=FileUploadForm()ifform.validate_on_submit():filehandle=form.uploaded.dataTextFileTransfer.save(filehandle,metadata={'allowed_contents':b'Hello World!'})flash('Uploaded {}!'.format(filehandle.filename),'success')returnredirect(url_for('handle_upload'))else:returnrender_template('upload.html',form=form)
啊啊。当然,还有点代码。但它被分成了 零碎的。很容易测试路线中的每一点和意图 很清楚。
功率更大
用于验证、预处理和 通过decorators上传后处理文件。如果你需要一直创造 上传图片的缩略图,可以提供一个 MyTransfer.preprocessor或MyTransfer.postprocessor就行了 那是给你的。
除了简单的扩展检查之外,您还可以在 指尖也是。也许,您已经将用户限制在 磁盘空间量,应该告诉他们在 上传更多。编写一个简单的函数来检查当前的磁盘使用情况和 如果上传超过上限。然后把它挂到你的转移物体上 使用MyTransfer.validator。
最后,持久化文件很容易!也许你在运行Heroku和 不能依赖本地文件系统。只要写一个可以通过的 把文件放到你的S3桶里!用MyTransfer.destination连接它。 使用字符串路径和可写对象作为 目的地也是。
查看quickstart了解更多信息, 也!
待办事项
还有很多事情要做。例如,更好的错误处理。 可能与烧瓶紧密结合,或相反 把对Werkzeug已经很少的依赖 独立于框架。
贡献
考虑到这个项目还处于初级阶段,pull请求和问题比 欢迎。只需将自己添加到authors文件中,为 添加或更改功能并提交!