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

标签 javascript flask signaturepad

我正在使用signature-pad JavaScript库让人们对文档进行数字签名(这只是为了测试,没有法律约束力等),但我很难将签名结果从 JS 传递回 Flask/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>

最佳答案

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!');
            },
        });
    });
});

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!');
        });
    });
});

关于Javascript - 将签名板结果发送到 Flask,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43104075/

相关文章:

javascript - 使用 spring MVC 将动态数据添加到可搜索的多选 jquery

javascript - 为什么 string.length 没有更新?

javascript - 观察父元素上指令的 ngModel 值变化

python - 根据传递的变量更改 HTML 表格中的颜色

javascript - ASP.NET MVC 如何使用 signaturepad 库将签名的 byte[] 转换为保留签名图像的 jpeg?

c# - 使用 MVVM 架构从 SignaturePadView 检索图像

javascript - 如何在 Node 上使用 YUI3?

python-3.x - 让 Flask 使用 Python3 (Apache/mod_wsgi)

python - 如何将字典传递给 Flask 中的 url_for