Попытка выучить django, и я чувствовал, что лучший способ сделать это - создать простой проект.
Моя цель - выполнить команду bash с помощью подпроцесса, используя ввод формы, который имеет несколько полей выбора, основанных насписок, полученный из файла.
Я выполнил любую команду, необходимую для получения списка, проанализировал файл журнала, чтобы получить список, а затем использовал список в поле выбора в качестве параметров.
Затем используйте вход для запуска другого вызова подпроцесса для выполнения требуемой команды bash.
У меня есть следующий код,
My form.py
from django import forms
from . import script
from django.core.exceptions import ValidationError
class PostForm(forms.Form):
p1 = forms.ChoiceField(choices=enumerate(script.choices),label='Player 1')
p2 = forms.ChoiceField(choices=enumerate(script.choices2),label='Player 2',required=False)
x = forms.IntegerField(required=False)
y = forms.IntegerField(help_text='Set to 70 if unknown',required=False)
z = forms.IntegerField(required=False)
def clean(self):
cleaned_data = super(PostForm, self).clean()
p2 = cleaned_data.get("p2")
cordsx = cleaned_data.get("x")
cordsy = cleaned_data.get("y")
cordsz = cleaned_data.get("z")
if p2 and (cordsx or cordsy or cordsz): # both were entered
raise forms.ValidationError("Enter either co-ords or player 2 name")
elif not p2 and not (cordsx or cordsy or cordsz): # neither were entered
raise forms.ValidationError("You must enter either co-ords or player 2 name")
return cleaned_data
Мой скрипт:
import subprocess
def script():
try:
subprocess.call(f'screen -S mcpe -X stuff \'list\\n\'',shell=True)
finally:
f=open('/mcpe/screenlog.0','r+')
lis=f.readlines()
out=[]
buff=''
if len(lis) < 2:
return out
else:
n=len(lis)-1
for i in reversed(lis):
if i == 'list':
break
n-=1
try:
for i in lis[n+3]:
if i == ',':
out.append(buff.strip())
buff=''
elif i=='[':
break
else:
buff+=i
else:
out.append(buff.strip())
return out
except IndexError:
return out
_=f.truncate(0)
f.close()
players = script()
choices = dict(zip(players,players))
choices2={'':''}
for i in choices:
choices2[i]=i
Мой шаблон формы:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Teleportation Machine</title>
</head>
<body>
players online are:-
<ol>
{% for i in players %}
<li>{{ i }}</li>
{%endfor%}
</ol>
<form method="post">
{% csrf_token %}
{{ form }}
</form>
<button type='submit'>Teleport!</button>
</body>
</html>
и, наконец, views.py
from django.shortcuts import render
from .form import PostForm
from django.http import HttpResponse
import subprocess
from .script import players
def index(request):
if request.method == 'POST':
form = PostForm(request.POST)
if form.is_valid:
p1 = form.cleaned_data["p1"]
p2 = form.cleaned_data["p2"]
x = form.cleaned_data["x"]
y = form.cleaned_data["y"]
z = form.cleaned_data["z"]
if p2:
command = f'screen -S mcpe -X stuff \'tp {p1} {p2}\\n\''
else:
command = f'screen -S mcpe -X stuff \'tp {p1} {x} {y} {z}\\n\''
subprocess.call(command,shell = True)
form = PostForm()
return render(request,'form.html',{'form':form,'players':players})
С чем я сталкиваюсь, так это с тем, что скриптне работает правильно и последовательно каждый раз, когда файл не усекается должным образом или иногда файлы не читаются должным образом