-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
我希望有人能給我一兩個暗示。
目前還不清楚你在問什麼。你發佈的代碼中有哪部分與你有問題?你在問如何做表單驗證? – davidism
對不起! 我所尋找的是一種讓index.py中的兩段很長(幾乎相同)的代碼小得多和/或放在web_rectangle.py文件中的方法。 主要目標是讓儘可能小巧幹淨的index.py文件,因爲它是 - 這是一個真正的數學網站 - 所有網站的主要文件。 讓我們說,我想用不同的計算器爲不同類型的形狀和代數問題製作完整的網站。在這種情況下,我的index.py文件很快就會變得非常大並且令人困惑。 希望這有助於:) –
哦,我知道有一個更聰明的方法來製作大型網站(藍圖)。但是由於我對Python很陌生,並且因爲這也只是我的一個學習項目,所以Blueprint不是一種選擇。我需要首先獲得Flask的感覺 - 並且更好地重構代碼:) –