Python 烧瓶重构

Python 烧瓶重构,python,flask,refactoring,Python,Flask,Refactoring,我正在尝试在Flask中创建一个web项目。简而言之,它是一个HTML/CSS站点,您可以在其中输入一些数据,并显示矩形的面积或周长 我的问题是,对于周长和面积部分,我几乎重复了相同的代码。我已经设法在另一个.py文件(web_rectangle.py)中进行输入验证和计算,但现在我被卡住了 以下是两个输入HTML文件之一(它们几乎完全相同): web_rectangle.py: #This script is for WEB use only. #It is used by another s

我正在尝试在Flask中创建一个web项目。简而言之,它是一个HTML/CSS站点,您可以在其中输入一些数据,并显示矩形的面积或周长

我的问题是,对于周长和面积部分,我几乎重复了相同的代码。我已经设法在另一个.py文件(web_rectangle.py)中进行输入验证和计算,但现在我被卡住了

以下是两个输入HTML文件之一(它们几乎完全相同):

web_rectangle.py:

#This script is for WEB use only.
#It is used by another script calling its funtions.


def rect_area(length, width):
    return length * width

def rect_circ(length, width):
    return 2 * length + 2 * width

def test_val(val):
    try:
        val = float(val)
        if val <= 0:
            error = 'Indtast et tal større end 0'
        else:
            error = ''
    except ValueError:
        error = 'Fejl i indtastning'
    return val, error
#此脚本仅供WEB使用。
#它被另一个调用其函数的脚本使用。
定义矩形区域(长度、宽度):
返回长度*宽度
def rect_circ(长度、宽度):
返回2*长度+2*宽度
def测试值(val):
尝试:
val=浮动(val)

如果val如果我没有错,那么您希望通过消除代码重复来使代码更加模块化。在这里,你可以从蓝图中获得大部分

您可以编写一个公共形状_input.py并为其定义一个方法(def)。圆或矩形可以作为参数传递给def。这样,您将消除重复的代码。而调用不同的HTML模板(视图)可能会有帮助

希望这有帮助

from flask import Flask, render_template, request
from web_rectangle import rect_area, rect_circ, test_val

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html')


@app.route('/rect_circ')
def circ_input():
    #Inputs from web
    length = request.args.get('length')
    width = request.args.get('width')

    #Predefined values
    error_l = ''
    error_w = ''
    input_text = '''Indtast værdierne for længde og bredde. Du må kun bruge tal.
                 Brug punktum i stedet for komma før decimaltal.'''
    input_error = '''Brug kun tal større end nul og punktum i stedet for komma 
                  før decimaltal.'''

    #Test length and width for valid inputs
    if length and width:
        return_val_l = test_val(length)
        length = return_val_l[0]
        error_l = return_val_l[1]

        return_val_w = test_val(width)
        width = return_val_w[0]
        error_w = return_val_w[1]
    #Test length for valid inputs when width == ''
    elif length:
        return_val_l = test_val(length)
        length = return_val_l[0]
        error_l = return_val_l[1]
        error_w = 'Indtast tal'
    #Test width for valid inputs when length == ''
    elif width:
        return_val_w = test_val(width)
        width = return_val_w[0]
        error_w = return_val_w[1]
        error_l = 'Indtast tal'
    #Both length and width == ''
    else:
        return render_template(
            'rectangle_area.html',
            input_text = input_text
        )

    #Final outputs depending on error types from input tests - if any 
    if  error_l == '' and error_w == '':        
        return render_template(
            'rectangle_circ.html',
            result = rect_circ(length, width),
            length = length,
            width = width
        )
    elif error_l == '' and error_w != '':
        return render_template(
            'rectangle_circ.html',
            length = length,
            width = error_w,
            error_w = error_w,
            input_error = input_error
        )
    elif error_l != '' and error_w == '':
        return render_template(
            'rectangle_circ.html',
            length = error_l,
            width = width,
            error_l = error_l,
            input_error = input_error
        )
    elif error_l != '' and error_w != '':
        return render_template(
            'rectangle_circ.html',
            length = error_l,
            width = error_w,
            error_l = error_l,
            error_w = error_w,
            input_error = input_error
        )
    else:
        return render_template(
            'rectangle_circ.html',
            input_text = input_text
        )


@app.route('/rect_area')
def area_input():
    #Inputs from web
    length = request.args.get('length')
    width = request.args.get('width')

    #Predefined values
    error_l = ''
    error_w = ''
    input_text = '''Indtast værdierne for længde og bredde. Du må kun bruge tal.
                 Brug punktum i stedet for komma før decimaltal.'''
    input_error = '''Brug kun tal større end nul og punktum i stedet for komma 
                  før decimaltal.'''

    #Test length and width for valid inputs
    if length and width:
        return_val_l = test_val(length)
        length = return_val_l[0]
        error_l = return_val_l[1]

        return_val_w = test_val(width)
        width = return_val_w[0]
        error_w = return_val_w[1]
    #Test length for valid inputs when width == ''
    elif length:
        return_val_l = test_val(length)
        length = return_val_l[0]
        error_l = return_val_l[1]
        error_w = 'Indtast tal'
    #Test width for valid inputs when length == ''
    elif width:
        return_val_w = test_val(width)
        width = return_val_w[0]
        error_w = return_val_w[1]
        error_l = 'Indtast tal'
    #Both length and width == ''
    else:
        return render_template(
            'rectangle_area.html',
            input_text = input_text
        )

    #Final outputs depending on error types from input tests - if any 
    if  error_l == '' and error_w == '':        
        return render_template(
            'rectangle_area.html',
            result = rect_area(length, width),
            length = length,
            width = width
        )
    elif error_l == '' and error_w != '':
        return render_template(
            'rectangle_area.html',
            length = length,
            width = error_w,
            error_w = error_w,
            input_error = input_error
        )
    elif error_l != '' and error_w == '':
        return render_template(
            'rectangle_area.html',
            length = error_l,
            width = width,
            error_l = error_l,
            input_error = input_error
        )
    elif error_l != '' and error_w != '':
        return render_template(
            'rectangle_area.html',
            length = error_l,
            width = error_w,
            error_l = error_l,
            error_w = error_w,
            input_error = input_error
        )
    else:
        return render_template(
            'rectangle_area.html',
            input_text = input_text
        )

if __name__ == '__main__':
    app.run(debug=True)
#This script is for WEB use only.
#It is used by another script calling its funtions.


def rect_area(length, width):
    return length * width

def rect_circ(length, width):
    return 2 * length + 2 * width

def test_val(val):
    try:
        val = float(val)
        if val <= 0:
            error = 'Indtast et tal større end 0'
        else:
            error = ''
    except ValueError:
        error = 'Fejl i indtastning'
    return val, error