2015-05-20 219 views
-1

我想在燒瓶中做一個web項目。簡而言之,它是一個HTML/CSS網站,您可以在其中輸入一些數據,並顯示矩形的面積或周長。燒瓶重構

我的問題是,我幾乎重複相同的代碼都爲圓周和麪積部分。我設法在另一個.py文件(web_rectangle.py)中進行輸入驗證和計算,但現在我被卡住了。

下面是兩個輸入HTML文件之一(他們幾乎相同):

<!doctype html> 

<head> 
    <meta charset="UTF-8"> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
    <link rel="stylesheet" type="text/css" href="/static/grids.css"> 
    <link rel="stylesheet" type="text/css" href="/static/styles.css"> 
    <script src="http://use.edgefonts.net/expletus-sans:n4,n7,n5,i7,i4,n6,i6,i5:all;nova-square:n4:all;trykker:n4:all.js"></script> 
    <title>Omkredsen af et rektangel</title> 
</head> 

<body> 

    <header> 
     <table> 
      <tr> 
       <td class="hdfo_td_side" background="static/header_left.png"> 
       </td> 
       <td class="td_center" background="static/header_center.png"> 
        <h1>Rektangel - areal</h1> 
       </td> 
       <td class="hdfo_td_side" background="static/header_right.png"> 
       </td> 
      </tr> 
     </table> 
    </header> 

    <div class="line"></div> 
    <nav> 
     <div class="nav_bg"></div> 
     <div class="nav_text"> 
      <a href="/">Forside</a> 
     </div> 
    </nav> 
    <div class="line"></div> 

    <div class="grid"> 
     <div class="section group"> 
      <div class="main_left col grid_3"> 
       <p>Formel for arealet af et rektangel:</p> 
       <p class="formula">A = l * b</p> 
       <p>(A) står for areal, (l) for rektanglets længde og (b) for rektanglets bredde.</p> 
       <p>Husk at i geometri skal det man finder (her arealet) skrives med stort bogstav, mens de variabler man bruger (for eksempel 'længde'), skal skrives med små bogstaver.</p> 
      </div> 
      <div class="main_right col grid_5"> 
       <h3>Indtast data</h3> 

       <form action="/rect_area" method="GET"> 
        Længde 
        <br> 
        <input {% if error_l %} class="error_l" {% endif %} type="text" name="length" value="{{ length }}"> 
        <br> 
        <br>Bredde 
        <br> 
        <input {% if error_w %} class="error_w" {% endif %} type="text" name="width" value="{{ width }}"> 
        <br> 
        <input type="submit" value="Se svar"> 
        <br> 
        <br> 
       </form> 
       <div> 
        {% if input_text %} 
        <p>{{ input_text }}</p> 
        {% endif %} 
        {% if input_error %} 
        <p>{{ input_error }}</p> 
        {% endif %} 
       </div> 
       <div> 
        {% if result %} 
        <p>Omkredsen er: {{ result }}</p> 
        {% endif %} 
       </div> 
      </div> 
     </div> 
    </div> 
    </div> 

    <footer> 
     <table> 
      <tr> 
       <td class="hdfo_td_side" background="static/footer_left.png"> 
       </td> 
       <td class="td_center" background="static/footer_center.png"> 
        <p class="footer_text">(C) Copyright 2015, Daniel Holm Hansen</p> 
       </td> 
       <td class="hdfo_td_side" background="static/footer_right.png"> 
       </td> 
      </tr> 
     </table> 
    </footer> 

    <img class="footer_logo" src="../static/logo_dhh_white_xs.png" width="120" alt="Made by DHH"> 
</body> 

index.py:

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) 

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 

我希望有人能給我一兩個暗示。

+1

目前還不清楚你在問什麼。你發佈的代碼中有哪部分與你有問題?你在問如何做表單驗證? – davidism

+0

對不起! 我所尋找的是一種讓index.py中的兩段很長(幾乎相同)的代碼小得多和/或放在web_rectangle.py文件中的方法。 主要目標是讓儘可能小巧幹淨的index.py文件,因爲它是 - 這是一個真正的數學網站 - 所有網站的主要文件。 讓我們說,我想用不同的計算器爲不同類型的形狀和代數問題製作完整的網站。在這種情況下,我的index.py文件很快就會變得非常大並且令人困惑。 希望這有助於:) –

+0

哦,我知道有一個更聰明的方法來製作大型網站(藍圖)。但是由於我對Python很陌生,並且因爲這也只是我的一個學習項目,所以Blueprint不是一種選擇。我需要首先獲得Flask的感覺 - 並且更好地重構代碼:) –

回答

0

如果我沒有錯,那麼您正在尋找通過消除重複代碼來使代碼更加模塊化。在這裏,您可以獲得大部分BLUEPRINTS - http://flask.pocoo.org/docs/0.10/blueprints/

您可以編寫一個常見的shape_input.py併爲其定義一個單獨的方法(def)。圓或矩形可以作爲參數傳遞給def。這樣你最終將消除重複的代碼。雖然打電話給不同的HTML模板 - 視圖 - 可能會在你的救援。

希望這會有所幫助。