我正在使用signature-pad JavaScript库让人们对文档进行数字签名(这仅用于测试,没有任何法律约束力等等)但是我很难将签名结果传回Flask /来自JS的Python。
以下代码是我的HTML表单,它完美地提交form.stu_name
字段,甚至触发我的JS“提交”(意味着代码执行并打开一个新窗口显示签名)但我不是确定如何将JS结果提交回Flask - 请参阅第二个代码块示例了解更多信息。
<div class="container">
{% from "_formhelper.html" import render_field %}
<form id="upload-form" method="POST" action="/sixth_form/" enctype="multipart/form-data">
<dl>
{{render_field(form.stu_name)}}
</dl>
<p>Student Signature</p>
<div class="wrapper">
<img src="{{ url_for('static', filename='images/grey.jpeg') }}" width=400 height=200 />
<canvas id="signature-pad" class="signature-pad" width=400 height=200></canvas>
</div>
<div>
<button id="clear" type="Button">Clear</button>
</div>
<br>
<p><input id="finalsub" type="submit" value="Submit"></p>
</form>
</div>
这是脚本本身,在运行时会打开一个新窗口,其签名结果显示为URI编码图像(该部分很好,我可以稍后在Python中解码),我需要帮助 - 而不是打开一个新窗口我想将图像提交回Flask,然后将其存储在一个变量中,这样我就可以将它附加到另一个图像上。我对JS不是很了解,所以非常欢迎任何建议!
<script>
var signaturePad = new SignaturePad(document.getElementById('signature-pad'), {
backgroundColor: 'rgba(255, 255, 255, 0)',
penColor: 'rgb(0, 0, 0)'
});
var saveButton = document.getElementById('finalsub');
var cancelButton = document.getElementById('clear');
saveButton.addEventListener('click', function (event) {
var data = signaturePad.toDataURL('image/png');
// Send data to server instead...
window.open(data);
});
cancelButton.addEventListener('click', function (event) {
signaturePad.clear();
});
</script>
答案 0 :(得分:1)
This answer似乎就是你要找的东西。这是使用jQuery
。要在纯JavaScript中执行此操作,请查看this answer。然后,要访问该文件,您将使用flask.request.files
。
盲人(阅读:未经测试)的例子是:
$(function() {
$('#upload-file-btn').click(function() {
var data = signaturePad.toDataURL('image/png');
$.ajax({
type: 'POST',
url: '/uploadUrl',
data: data,
contentType: false,
cache: false,
processData: false,
async: false,
success: function(data) {
console.log('Success!');
},
});
});
});
现在在您的烧瓶的端点视图功能中,您可以访问该文件 数据通过flask.request.files。
注意:正如我所说,这是未经测试的,我不知道是否ajax
配置(例如使请求同步或将contentType
设置为false)都是必要的。我的直觉就是像这样重写它:
$(function() {
$('#upload-file-btn').click(function() {
var data = signaturePad.toDataURL('image/png');
$.ajax({
type: 'POST',
url: '/uploadUrl',
data: data,
contentType: 'image/png'
}).done(function(data) {
console.log('Success!');
}).fail(function(data) {
console.log('Fail!');
});
});
});