Как подключить python-скрипт к html в Django

198
23 ноября 2018, 06:10

Работаю с Django. Имеется главная страница написанная на html, на ней располагается кнопка. По нажатию на кнопку, с помощью ajax-запроса, нужно получить python-script и каким-то образом его запустить.

Вот, к примеру, маленький скрипт:

import random 
print(random.randint(0,1000000))
Answer 1

В файле urls.py

from django.urls import path
from .views import MyAction
urlpatterns = [
    path('myaction/', MyAction.as_view(), name='my-action'),
]

В файле views.py создаём наш класс MyAction. Пишем в нём функцию post, которая будет принимать только POST запросы.

from django.views.generic import View
from django.http import JsonResponse
import random 

class MyAction(View):
    def post(self, *args, **kwargs):
            data = {}
            # Получаем данные из запроса
            action = self.request.POST.get('action')
            # Проверяем что значение соответствует ожидаемому
            # и возвращаем число
            # иначе строку с текстом Error
            if action == 'NeedRandom':
                data['result'] = random.randint(0,1000000)
            else:
                data['result'] = 'Error'
            return JsonResponse(data)

Создаём наш JavaScript, который будет отсылает запрос на сервер по указанному URL при нажатии на кнопку имеющую атрибут class="mybutton" и получать от него ответ в success: function(data){...}, ответ будет виден в консоли браузера.

$(document).ready(function(){
    // Forming csrf_token
    function getCookie(name) {
        let cookieValue = null;
        if (document.cookie && document.cookie != '') {
            let cookies = document.cookie.split(';');
            for (let i = 0; i < cookies.length; i++) {
                let cookie = jQuery.trim(cookies[i]);
                // Does this cookie string begin with the name we want?
                if (cookie.substring(0, name.length + 1) == (name + '=')) {
                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                    break;
                }
            }
        }
        return cookieValue;
    };

    let data = {}
    $('.mybutton').on('click', function(e){
        data['action'] = 'NeedRandom';
        data['csrfmiddlewaretoken'] = getCookie('csrftoken');
        SendAjax();
    });

    function SendAjax(){
        $.ajax({
            url: 'http://127.0.0.1:8000/myaction/',
            method: 'POST',
            data: data,
            cached: true,
            success: function(data){
                console.log(data);
            },
            error: function(e){
                console.log(e);
            }
        })
    }
})

И, соответственно, сама кнопка на странице.

<input type="submit" class="mybutton" value="Случайное число">

Не забудьте подключить на странице JQuery библиотеку и JS-файл с Ajax скриптом

READ ALSO
Нужно ли добавлять пагинацию в данной ситуации?

Нужно ли добавлять пагинацию в данной ситуации?

Есть файл indexhtml в него регулярно добавляются посты(статьи) подобного вида(через админку), только текст и ничего больше

184
Laravel кастомизация валидации

Laravel кастомизация валидации

Вопрос в следующем, как мне при выводе ошибки валидации указать свое название поля

178
Как сделать обводку в 1 px у блоков?

Как сделать обводку в 1 px у блоков?

Есть такой каталог, в котором каждый блок должен иметь обводку 1px

176
Как убрать стрелки слайдера slick?

Как убрать стрелки слайдера slick?

Не получается убрать стрелки слайдера на разрешении до 768pxЧерез breakpoint пробовал

156