Запустите script.py для получения значений при каждой загрузке страницы в django - PullRequest
0 голосов
/ 13 октября 2019

Попытка выучить 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})     

С чем я сталкиваюсь, так это с тем, что скриптне работает правильно и последовательно каждый раз, когда файл не усекается должным образом или иногда файлы не читаются должным образом

...