在烧瓶中轻松验证和处理文件上传

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.preprocessorMyTransfer.postprocessor就行了 那是给你的。

除了简单的扩展检查之外,您还可以在 指尖也是。也许,您已经将用户限制在 磁盘空间量,应该告诉他们在 上传更多。编写一个简单的函数来检查当前的磁盘使用情况和 如果上传超过上限。然后把它挂到你的转移物体上 使用MyTransfer.validator

最后,持久化文件很容易!也许你在运行Heroku和 不能依赖本地文件系统。只要写一个可以通过的 把文件放到你的S3桶里!用MyTransfer.destination连接它。 使用字符串路径和可写对象作为 目的地也是。

查看quickstart了解更多信息, 也!

待办事项

还有很多事情要做。例如,更好的错误处理。 可能与烧瓶紧密结合,或相反 把对Werkzeug已经很少的依赖 独立于框架。

贡献

考虑到这个项目还处于初级阶段,pull请求和问题比 欢迎。只需将自己添加到authors文件中,为 添加或更改功能并提交!

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java我的int值在SharedReferences中不被记住   java如何编辑Spring可分页对象?   java如何在gradle中单独调用任务   jvm以编程方式设置最大java堆大小   java如果满足多个条件,如何使用If语句计算数字?   如何在java中从json文件中获取特定值   如何在Sphinx4中为Java语音识别添加自定义语法?   java int[]copy=data;//当数据是数组时会发生什么?   java豪猪管理器。停下来。destroy()不起作用   安卓在API级别28中找不到画布变量   基于SOLID的java冗余   用于talend作业的java Liferay和portlet   从java到安卓的视频流   java获取在控件的类定义中添加自定义控件的场景大小   awt Java IndexOutOfBoundsException   java如何使用Spring JmsTemplate更改MQ头   java遍历数组并打印每个对象   java Google Map api v2标记在我旋转手机和地图“刷新”之前不会移动