Skip to content

Commit a2a2c38

Browse files
committed
Finished developing the app
1 parent 59a0101 commit a2a2c38

26 files changed

+372
-123
lines changed
+18-16
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
from flask import Flask, render_template, request, redirect, url_for
2-
from forms import FormToReverse
2+
from project.forms import FormToReverse
33

4-
# Creating instances
54
app = Flask(__name__)
65
app.config.from_object('project.config')
76

@@ -13,23 +12,26 @@ def reverse(string):
1312
@app.route('/', methods=['GET', 'POST'])
1413
def index():
1514
form = FormToReverse(request.form)
16-
if request.method == 'POST' and form.validate_on_submit():
17-
return redirect(url_for('rev_str'))
18-
return render_template('index.html')
15+
if form.validate_on_submit():
16+
return redirect(url_for('rev_str', user_input=form.reverse.data))
17+
return render_template('index.html', form=form)
18+
19+
20+
@app.route('/reversed_input/<user_input>')
21+
def rev_str(user_input):
22+
reversed_string = reverse(user_input)
23+
return render_template(
24+
'reversed.html',
25+
user_input=user_input,
26+
rev_input=reversed_string
27+
)
1928

20-
@app.route('/reversed/', methods=['POST'])
21-
def rev_str():
22-
rev_string = reverse(request.form['user_input'])
23-
return render_template('reversed.html', output = rev_string, user_input=request.form['user_input'])
2429

2530
@app.errorhandler(404)
2631
def page_not_found(error):
27-
return render_template('404.html'),404
32+
return render_template("404.html"), 404
2833

29-
@app.errorhandler(500)
30-
def server_error(error):
31-
return render_template('500.html'),500
3234

33-
34-
if __name__=='__main__':
35-
app.run(debug=True)
35+
@app.errorhandler(500)
36+
def server_error_page(error):
37+
return render_template("500.html"), 500
+2-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
1+
# config.py
22

33
WTF_CSRF_ENABLED = True
4-
SECRET_KEY = "You know what"
5-
4+
SECRET_KEY = "secret"

part2/reverse_flask_reza/project/forms.py

+2-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
from wtforms import StringField
33
from wtforms.validators import DataRequired, Length
44

5-
class FormToReverse(Form):
6-
string = StringField('reverse', validators=[DataRequired(), Length(min=4)])
7-
85

6+
class FormToReverse(Form):
7+
reverse = StringField('Reverse', validators=[DataRequired(), Length(min=2)])

part2/reverse_flask_reza/project/static/css/bootstrap.min.css

+7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
body {
2+
padding-top: 60px;
3+
padding-bottom: 40px;
4+
background-color: #eee;
5+
}
6+
7+
.container {
8+
width: auto;
9+
max-width: 680px;
10+
padding: 0 15px;
11+
}
12+
13+
.center {
14+
padding: 40px 15px;
15+
text-align: center;
16+
}
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,7 @@
1-
<!DOCTYPE html>
2-
3-
<html>
4-
<head>
5-
<title>Reversing string.</title>
6-
<link href="{{ url_for('static', filename='css/main.css') }}" rel="stylesheet">
7-
<link href="{{ url_for('static', filename='css/bootstrap.min.css') }}" rel="stylesheet">
8-
9-
</head>
10-
<div class="container">
11-
12-
<h1>Error 404</h1>
13-
<p><em>Try<a href="{{url_for('index')}}">again.</a></em></p>
14-
15-
</div>
16-
17-
</html>
1+
{% extends "base_template.html" %}
2+
{% block content %}
3+
<div class="center">
4+
<h1>Error 404</h1>
5+
<p><em>Try <a href="{{url_for('index')}}">again</a>?</em></p>
6+
</div>
7+
{% endblock %}
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,8 @@
1-
<!DOCTYPE html>
1+
{% extends "base_template.html" %}
2+
{% block content %}
3+
<div class="center">
24

3-
<html>
4-
<head>
5-
<title>Reversing string.</title>
6-
<link href="{{ url_for('static', filename='css/main.css') }}" rel="stylesheet">
7-
<link href="{{ url_for('static', filename='css/bootstrap.min.css') }}" rel="stylesheet">
8-
9-
</head>
10-
<div class="container">
11-
<h1>500</h1>
12-
<p>Something is wrong! We are working on it!</p>
13-
<p><em>Return<a href="{{url_for('home')}}">Home.</a></em></p>
14-
</div>
15-
16-
</html>
5+
<h1>Error 500</h1>
6+
<p><em>Try <a href="{{url_for('home')}}">again</a>?</em></p>
7+
</div>
8+
{% endblock %}

part2/reverse_flask_reza/project/templates/base.html

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
2+
<!DOCTYPE html>
3+
<html lang="en">
4+
<head>
5+
<meta charset="utf-8">
6+
<meta http-equiv="X-UA-Compatible" content="IE=edge">
7+
<meta name="viewport" content="width=device-width, initial-scale=1">
8+
<meta name="description" content="">
9+
<meta name="author" content="">
10+
<link rel="icon" href="../../favicon.ico">
11+
12+
<title>Reverse your string!</title>
13+
14+
<link href="{{ url_for('static', filename='css/bootstrap.min.css') }}" rel="stylesheet">
15+
<link href="{{ url_for('static', filename='css/main.css') }}" rel="stylesheet">
16+
17+
</head>
18+
19+
<body>
20+
21+
<div class="navbar navbar-inverse navbar-fixed-top">
22+
<div class="navbar-header">
23+
<a class="navbar-brand" href="#">Just a simple string reverser! </a>
24+
</div>
25+
</div>
26+
27+
28+
{% block content %}
29+
30+
31+
{% endblock %}
32+
33+
34+
</body>
35+
</html>
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,20 @@
1-
<!DOCTYPE html>
1+
{% extends('base_template.html') %}
22

3-
<html>
4-
<head>
5-
<title>Reversing string.</title>
6-
<link href="{{ url_for('static', filename='css/main.css') }}" rel="stylesheet">
7-
<link href="{{ url_for('static', filename='css/bootstrap.min.css') }}" rel="stylesheet">
8-
9-
</head>
10-
<body>
11-
<div class="container">
12-
<h2>Reverse your string!</h2>
13-
<form action ="{{ url_for('rev_str') }}" method="post">
14-
<input type="text" name="user_input">
15-
<input type="submit" value="Reverse!">
16-
</form>
17-
</div>
18-
19-
20-
</body>
21-
</html>
22-
3+
{% block content %}
4+
<div class="container">
5+
<div class="center">
6+
<form class="" method="POST" action="">
7+
{{ form.csrf_token }}
8+
<div class="form-group">
9+
{{form.reverse(class="form-control input-lg", placeholder="Reverse this text")}}
10+
{% if form.reverse.errors %}
11+
{% for error in form.reverse.errors %}
12+
{{ error }}
13+
{% endfor %}
14+
{% endif %}
15+
</div>
16+
<button class="btn btn-lg btn-primary btn-block" type="submit">Submit</button>
17+
</form>
18+
</div>
19+
</div> <!-- /container -->
20+
{% endblock %}
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,15 @@
1-
<! DOCTYPE html>
1+
{% extends('base_template.html') %}
22

3-
<html>
4-
5-
<head>
6-
<title>Reversing string.</title>
7-
<link href="{{ url_for('static', filename='css/main.css') }}" rel="stylesheet">
8-
<link href="{{ url_for('static', filename='css/bootstrap.min.css') }}" rel="stylesheet">
9-
10-
</head>
11-
12-
<div class="container">
13-
<h2>Original String:</h2>
14-
<div class="output">{{ user_input }}</div>
15-
16-
<h2>Reversed String:</h2>
17-
<div class="output">{{ output }}</div>
18-
<br>
19-
<br>
20-
21-
<form action="{{ url_for('index') }}" method="post">
22-
<input type="submit" value="Back!">
23-
</form>
24-
</div>
25-
26-
</html>
3+
{% block content %}
4+
<div class="container">
5+
<div class="center">
6+
<h2>Original String</h2>
7+
<div class="well">{{ user_input }}</div>
8+
<h2>Reversed String</h2>
9+
<div class="well">{{ rev_input }}</div>
10+
<form action="{{ url_for('index') }}" method="post">
11+
<button class="btn btn-lg btn-primary btn-block" type="submit">Back!</button>
12+
</form>
13+
</div>
14+
</div>
15+
{% endblock %}

part2/reverse_flask_reza/run.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
from project import app
22

3-
if __name__=="__main__":
3+
4+
5+
if __name__ == "__main__":
46
app.run(debug=True)
7+

part2/reverse_flask_reza/test.py

+31-22
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,46 @@
1-
import unittest
1+
# tests
2+
23
from project import app
4+
import unittest
35

4-
class TestReverse(unittest.TestCase):
56

6-
def setup(self):
7+
class ReverseCase(unittest.TestCase):
8+
9+
def setUp(self):
710
app.config['WTF_CSRF_ENABLED'] = False
8-
app.config['DEBUG'] = False
911
self.app = app.test_client()
1012

11-
def test_if_user_can_access_the_first_page(self):
13+
def tearDown(self):
14+
app.config['WTF_CSRF_ENABLED'] = True
15+
16+
def test_homepage_exists(self):
1217
response = self.app.get('/')
1318
self.assertEqual(response.status_code, 200)
14-
15-
16-
def test_if_page_redirects_and_string_is_reversed(self):
17-
test_string = 'Hello'
18-
response = self.app.post('/', data=dict(reverse=test_string, follow_redirects=True))
19-
self.assertIn(b'olleH',response.data)
19+
self.assertIn(b'Reverse this text', response.data)
2020

21+
def test_text_is_reversed(self):
22+
response = self.app.get('/reversed_input/HelloWorld')
23+
self.assertIn(b'dlroWolleH', response.data)
2124

22-
def test_prompt_the_user_to_input_string(self):
23-
response = self.app.post('/', data=dict(reverse='', follow_redirects=True))
25+
def test_users_must_enter_string(self):
26+
response = self.app.post(
27+
'/',
28+
data=dict(reverse='', follow_redirects=True)
29+
)
2430
self.assertIn(b'This field is required', response.data)
2531

26-
def test_prompt_the_user_to_input_atleast_two_lettered_string(self):
27-
response = self.app.post('/', data=dict(reverse='h', follow_redirects=True))
28-
self.assertIn(b'This field is required', response.data)
32+
def test_users_must_enter_atleast_two_charactered_string(self):
33+
response = self.app.post(
34+
'/',
35+
data=dict(reverse='h', follow_redirects=True)
36+
)
37+
self.assertIn(b'Field must be at least 2 characters long.', response.data)
2938

30-
def teardown(self):
31-
app.config['WTF_CSRF_ENABLED'] = True
32-
39+
def test_redirects_to_output(self):
40+
response = self.app.post(
41+
'/',
42+
data=dict(reverse="Hello",), follow_redirects=True)
43+
self.assertIn(b'olleH', response.data)
3344

34-
if __name__=="__main__":
45+
if __name__ == '__main__':
3546
unittest.main()
36-
37-

part2/reverse_flask_reza1/Procfile

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
web: python run.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
from flask import Flask, render_template, request, redirect, url_for
2+
from project.forms import FormToReverse
3+
4+
app = Flask(__name__)
5+
app.config.from_object('project.config')
6+
7+
8+
def reverse(string):
9+
return string[::-1]
10+
11+
12+
@app.route('/', methods=['GET', 'POST'])
13+
def index():
14+
form = FormToReverse(request.form)
15+
if form.validate_on_submit():
16+
return redirect(url_for('rev_str', user_input=form.reverse.data))
17+
return render_template('index.html', form=form)
18+
19+
20+
@app.route('/reversed_input/<user_input>')
21+
def rev_str(user_input):
22+
reversed_string = reverse(user_input)
23+
return render_template(
24+
'reversed.html',
25+
user_input=user_input,
26+
rev_input=reversed_string
27+
)
28+
29+
30+
@app.errorhandler(404)
31+
def page_not_found(error):
32+
return render_template("404.html"), 404
33+
34+
35+
@app.errorhandler(500)
36+
def server_error_page(error):
37+
return render_template("500.html"), 500
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# config.py
2+
3+
WTF_CSRF_ENABLED = True
4+
SECRET_KEY = "secret"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from flask_wtf import Form
2+
from wtforms import StringField
3+
from wtforms.validators import DataRequired, Length
4+
5+
6+
class FormToReverse(Form):
7+
reverse = StringField('Reverse', validators=[DataRequired(), Length(min=2)])

part2/reverse_flask_reza1/project/static/css/bootstrap.min.css

+7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)