Javascript - 将签名板结果发送到 Flask

Javascript - Sending Signature-Pad results to Flask

我正在使用 signature-pad JavaScript 库让人们对文档进行数字签名(这只是为了测试,没有任何法律约束力等),但我很难将签名结果传回Flask/Python 来自 JS。

下面的代码是我的 HTML 表单,它完美地提交了 form.stu_name 字段,甚至触发我的 JS 到 "submit"(意味着代码执行和一个新的 window 打开显示签名)但我不确定如何将 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>

这是脚本本身,当 运行 它打开一个新的 window,签名的结果显示为 URI 编码图像(那部分很好,我稍后可以在 Python),我需要什么帮助 - 我不想打开一个新的 window,而是想将图像提交回 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>

This answer seems to be what you're looking for. This is using jQuery however. To do this in pure JavaScript look at 。然后要访问该文件,您将使用 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!');
            },
        });
    });
});

Now in your flask's endpoint view function, you can access the file's data via 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!');
        });
    });
});