Как загрузить изображение с веб-камеры с помощью JavaScript ajax на сайт Django?

Я создаю сайт для трансляций с использованием Django, и мне нужно загрузить изображение с помощью ajax post запроса в форму модели на сайте django. Я работаю со следующим кодом:

Модели:

from django.db import models
from django.contrib.auth.models import User

class Camera(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='camera')
    image = models.ImageField(upload_to='live/', null=True, blank=True)

Просмотров:

from .models import Camera
from .forms import CameraForm

@login_required
@csrf_exempt
def golive(request):
    cameras = Camera.objects.filter(user=request.user)
    camera = None
    if cameras.count() == 0:
        camera = Camera.objects.create(user=request.user)
        camera.save()
    else:
        camera = cameras.first()
    if request.method == 'POST':
        print(request.FILES)
        form = CameraForm(request.POST, request.FILES, instance=camera)
        if form.is_valid():
            form.save()
        print("Working")
        return redirect('live:live')
    return render(request, 'live/golive.html', {'object': request.user.camera, 'form': CameraForm()})

@login_required
def live(request, username):
    profile = get_object_or_404(Profile, user__username=username, identity_verified=True, vendor=True)
    cameras = Camera.objects.filter(user=profile.user)
    return render(request, 'live/live.html', {'profile': profile, 'camera': cameras.first()})

Шаблоны:

{% extends 'base.html' %}
{% block content %}
<h1>Go live</h1>
<div id="container">
<video autoplay="true" id="video">
</video>
<canvas id="canvas" width="1028" height="728">
</canvas>
<button id="capture"></button>
</div>
{% endblock %}
{% block javascript %}
var video = document.getElementById('video');
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
function capture(){
    ctx.drawImage(video, 0, 0, 1024, 728);
    ctx.save();
    canvas.toBlob(function(blob){
        console.log(blob);
    var fileOfBlob = new File([blob], 'camera.png');
        var formData = new FormData();
    formData.append('image', fileOfBlob, 'camera.png');
        $.ajax({
            url: window.location.pathname,
            type: 'POST',
            data: formData,
            success: function (response) {
        console.log("Captured image.")
            },
            cache: false,
            contentType: false,
            processData: false
        });
    },'image/png');
}
setInterval(capture, 10000);
function startup() {
  navigator.mediaDevices.getUserMedia({video: true, audio: false})
  .then(function(stream) {
    video.srcObject = stream;
    video.play();
  })
  .catch(function(err) {
    console.log("An error occurred: " + err);
  });
}
startup();
{% endblock %}

Формы:

from django import forms
from .models import Camera

class CameraForm(forms.ModelForm):
    class Meta:
        model = Camera
        fields = ('image',)

Веб-камера отображается на странице просто отлично, но когда я пытаюсь отобразить {{ camera.image.url }} я вижу, что изображение не было загружено. Как загрузить изображение в виде шара с помощью ajax на сайт django? Может я что-то упускаю?

Это вроде как нестандартно, но вот решение, которое я придумал. Я написал свой собственный базовый кодек, использующий только blobs, который использует setInterval для сбора изображений с коротким интервалом и загружает их на сервер каждые 5 секунд. Затем я загружаю изображения и разделяю их, используя другой setInterval для их отображения. Вот код:

Модели:

from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User


class Camera(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='camera')
    src = models.TextField(default="", null=True, blank=True)
    last_frame = models.DateTimeField(default=timezone.now)

Просмотров:

Шаблоны:

Я знаю, что использую .replace несколько раз, но это потому, что изображение должно быть в формате URL, поэтому мне нужно заменить новые строки на '', пробелы на +, и тогда блоб будет отображаться правильно. Вставка распечатанного блоба в браузер для тестирования тоже работает хорошо! Но для лучшей практики я использую замену в нескольких местах, чтобы правильно отформатировать блоб.

Вернуться на верх