Найти - Пользователи
Полная версия: Передача поля команде Subprocess.Popen
Начало » Django » Передача поля команде Subprocess.Popen
1
r0x
Доброго времени суток,

Недавно начал изучать джангу. Подскажите в следующем примере, как передать значение input формы команде Subprocess.Popen() для запуска dig и вывода результата в шаблон dig.html
Попробовал сделать через файл forms.py и определение класса DigForm.

forms.py
 from django import forms
class DigForm(forms.Form):
    ip = forms.CharField()

urls.py
 from django.urls import path
from . import views
urlpatterns = [
	path('dig', views.dig, name='dig'),
]

views.py
 from django.shortcuts import render
from .forms import DigForm
def dig(request):
	form = DigForm(request.POST)
	return render(request, 'myblog/dig.html', {'form': form})

dig.html
 {% extends 'myblog/base.html' %}
{% block content_dig %}
	<p>Use this DNS lookup tool to easily view the standard DNS records for a domain.</p>
	{{ form }}
	<br><br><input type="submit" value="GET THE DNS RECORDS" />
{% endblock %}

Следующий код работает, но как вы видите он делает dig на google.com:
 def dig(request):
	cmd = subprocess.Popen(["dig", google.com], shell=True, stdout=subprocess.PIPE)
 	rez_dig = cmd.communicate()[0].decode()
 	return render(request, 'myblog/dig.html', {'rez_dig': rez_dig})

Приложил скрин там единственный input, идея в том чтобы юзер ввел домен/IP и dig отработал по введенному значению в input. После клика по GET THE DNS RECORDS. Т.е. как подставить заместо google.com значение из поля ip ?



Papa_Svin
r0x
Вообще все не так. Если вы хотите запустить некую отвязанную от wsgi-скрипта задачу в отдельном процессе, то вам в любом случае придется костылить некое межпроцессное взаимодействие. Только на самом деле все гораздо хуже, потому что в продакшене ваш сайт сам по себе будет запущен в нескольких (в десятках) процессах, и вам понадобится некая шина для передачи данных из задачи в “сайт” и назад, а постольку поскольку задач может работать несколько одновременно, то понадобится очередь таких сообщений и вообще, проблем и подводных камней здесь слишком много для начинающего. Так что же делать? А как это обычно бывает в мире питона - все уже давно решено за нас. Вам нужна http://www.celeryproject.org или подобная система диспетчеризации задач и было бы хорошо, чтобы она из коробки работала с джангой.
r0x
подводные камни везде. есть с чем разбираться это понятно. мне это не в продакшн нужно. а для себя. и все таки, в данном случае как взять значение input и подставить как переменную в команду dig ?
Papa_Svin
r0x
значение input и подставить как переменную в команду dig
Что имеется в виду под командой dig? Ваша функция что ли? Ну так дорогой, у вас функция уже принимает request, а вот где искать значение инпута как не в реквесте?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB