Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 28, 2018 22:17:37

r0x
От:
Зарегистрирован: 2009-10-26
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Передача поля команде Subprocess.Popen

Доброго времени суток,

Недавно начал изучать джангу. Подскажите в следующем примере, как передать значение 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 ?





Отредактировано r0x (Окт. 28, 2018 22:29:36)

Прикреплённый файлы:
attachment input.png (19,9 KБ)

Офлайн

#2 Окт. 29, 2018 04:57:55

Papa_Svin
Зарегистрирован: 2018-09-17
Сообщения: 138
Репутация: +  1  -
Профиль   Отправить e-mail  

Передача поля команде Subprocess.Popen

r0x
Вообще все не так. Если вы хотите запустить некую отвязанную от wsgi-скрипта задачу в отдельном процессе, то вам в любом случае придется костылить некое межпроцессное взаимодействие. Только на самом деле все гораздо хуже, потому что в продакшене ваш сайт сам по себе будет запущен в нескольких (в десятках) процессах, и вам понадобится некая шина для передачи данных из задачи в “сайт” и назад, а постольку поскольку задач может работать несколько одновременно, то понадобится очередь таких сообщений и вообще, проблем и подводных камней здесь слишком много для начинающего. Так что же делать? А как это обычно бывает в мире питона - все уже давно решено за нас. Вам нужна http://www.celeryproject.org или подобная система диспетчеризации задач и было бы хорошо, чтобы она из коробки работала с джангой.

Офлайн

#3 Окт. 29, 2018 07:06:06

r0x
От:
Зарегистрирован: 2009-10-26
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Передача поля команде Subprocess.Popen

подводные камни везде. есть с чем разбираться это понятно. мне это не в продакшн нужно. а для себя. и все таки, в данном случае как взять значение input и подставить как переменную в команду dig ?



Офлайн

#4 Окт. 29, 2018 09:10:34

Papa_Svin
Зарегистрирован: 2018-09-17
Сообщения: 138
Репутация: +  1  -
Профиль   Отправить e-mail  

Передача поля команде Subprocess.Popen

r0x
значение input и подставить как переменную в команду dig
Что имеется в виду под командой dig? Ваша функция что ли? Ну так дорогой, у вас функция уже принимает request, а вот где искать значение инпута как не в реквесте?

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version