Проверка значений поля колбы - PullRequest
0 голосов
/ 11 декабря 2018

Я хочу создать имитатор потери пакетов / задержки по времени / дрожания с помощью Flask, и я хочу реализовать пару проверок для введенных пользователем значений полей.

У меня есть целочисленное поле для потери пакетов, задержки по времени и дрожания, и поле выбора для сетевого интерфейса.

Я хочу сделать сетевой интерфейс обязательным для заполнения, и форма не должна публиковаться, если там ничего не выбрано.Потеря пакета должна быть между 0 и 100 и задержкой, а затем дрожанием.Последняя проверка должна быть для джиттера, который должен быть меньше или равен временной задержке.

Я создал несколько методов в моем файле forms.py для этих проверок:

from flask_wtf import FlaskForm
from wtforms import IntegerField, SubmitField, ValidationError
from wtforms.validators import DataRequired

class NetemuForm(FlaskForm):
    ploss = IntegerField('Packet Loss [0% - 100%]: ')
    tdelay = IntegerField('Time Delay [ms]: ')
    jitter = IntegerField('Jitter [ms]: ')
    interface = IntegerField('Network Interface: ', validators=[DataRequired()])
    submit = SubmitField('Submit')

    def ploss_check(self, ploss):
        if ploss > 100 or ploss < 0:
            raise ValidationError('The packet loss has to be between 0 and 100%!')

    def tdelay_check(self, tdelay):
        if tdelay < 0:
            raise ValidationError('The time delay must be positive!')

    def jitter_check(self, jitter, tdelay):
        if jitter < 0:
            raise ValidationError('The jitter must be positive!')
        if jitter > tdelay:
            raise ValidationError('The jitter must be lower or equal to the configured time delay!')

Мой views.py:

from flask import render_template, url_for, flash, redirect, request, Blueprint
from flask_login import login_required
from webapp.netemulator.forms import NetemuForm
from webapp.netemulator.network_emulator import ListNetIfaces

netemulator = Blueprint('netemulator', __name__)

@netemulator.route('/netemulator', methods = ['GET', 'POST'])
@login_required
def index():
    ifaces = ListNetIfaces.network_interfaces()
    form = NetemuForm()

    if form.validate_on_submit():
        ploss = form.ploss.data
        tdelay = form.tdelay.data
        jitter = form.jitter.data
        interface = request.form.get('interface')

    return render_template('netemulator.html', form = form, ifaces = ifaces)

Мой netemulator.HTML-шаблон:

{% extends "base.html" %}
{% block content %}
  <div class="jumbotron">
    <h1>Network Emulation Script</h1>
    <p>Here, you can define the packet loss in percentage, time delay and the jitter in miliseconds. <br> Please note that the jitter has to be lower or equal to the time delay value.</p>
  </div>
  <div class="container" style="min-height:100% width:80%">
    {% with messages = get_flashed_messages() %}
      {% if messages %}
    {% for message in messages %}
      <div class="alert alert-warning alert-dismissible" role="alert">
          <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
              {{message}}
      </div>
    {% endfor %}
      {% endif %}
    {% endwith %}
  </div>
  <div class="container">
    <form class="form-group" method="POST">
      {{form.hidden_tag()}}
      {{form.ploss.label(class = "form-control-label")}}
      {{form.ploss(class = "form-control form-control-lg", autofocus=true, placeholder="0", type=int, help="Please define the packet loss value in percentage between 0 and 100")}}<br>
      {{form.tdelay.label(class = "form-control-label")}}
      {{form.tdelay(class = "form-control form-control-lg", placeholder="0")}}<br>
      {{form.jitter.label(class = "form-control-label")}}
      {{form.jitter(class = "form-control form-control-lg", placeholder="0")}}<br>
      {{form.interface.label(class="my-1 mr-2", for="inlineFormCustomSelectPref")}}<br>
      <select class="custom-select my-1 mr-sm-2 required" name="interface" id="inlineFormCustomSelectPref">
        <option selected>Choose...</option>
    {% for iface in ifaces %}
        <option>{{ iface }}</option>
        {% endfor %}
      </select><br><br>  
      {{form.submit(class = "btn btn-outline-info")}}
     </form> 
    {% endblock %}

И, наконец, мой netemulator.py, где я получаю список сетевых интерфейсов, выглядит следующим образом:

import os 

class ListNetIfaces:

    def network_interfaces():

        net_ifaces = sorted(os.listdir('/sys/class/net'))
        net_ifaces.remove('lo')
        return net_ifaces

Так что в настоящее время любое значение, которое я помещаю в полязапрос POST обрабатывается без каких-либо предупреждений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...