Skip to content

Commit bc8805b

Browse files
committed
add more views
1 parent 484da5e commit bc8805b

17 files changed

+345
-81
lines changed

about.py

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import flask, flask.views
2+
import os
3+
import utils
4+
5+
class About(flask.views.MethodView):
6+
@utils.login_required
7+
def get(self):
8+
return flask.render_template('about.html')
9+
10+
@utils.login_required
11+
def post(self):
12+
result = eval(flask.request.form['expression'])
13+
flask.flash(result)
14+
return flask.redirect(flask.url_for('about'))

app.py

+40-16
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,17 @@
22
from flask import Flask, render_template, send_from_directory, Response, url_for, request
33
import json
44

5+
# Views
6+
from main import Main
7+
from login import Login
8+
from about import About
9+
from plans import Plans
510
#----------------------------------------
611
# initialization
712
#----------------------------------------
813

914
app = Flask(__name__)
10-
15+
app.config.from_object('config')
1116
app.config.update(
1217
DEBUG = True,
1318
)
@@ -24,21 +29,38 @@
2429
# def favicon():
2530
# return send_from_directory(os.path.join(app.root_path, 'static'), 'ico/favicon.ico')
2631

27-
@app.errorhandler(404)
28-
def page_not_found(e):
29-
return render_template('404.html'), 404
30-
31-
@app.route("/")
32-
def index():
33-
return render_template('index.html')
34-
35-
@app.route("/about")
36-
def about():
37-
return render_template('about.html')
38-
39-
@app.route("/plans")
40-
def plans():
41-
return render_template('plans.html')
32+
# Routes
33+
# Static main view
34+
# Static main view
35+
app.add_url_rule('/',
36+
view_func=Main.as_view('main'),
37+
methods=["GET"])
38+
# Dynamic URL rule
39+
app.add_url_rule('/login/',
40+
view_func=Login.as_view('login'),
41+
methods=["GET", "POST"])
42+
app.add_url_rule('/plans/',
43+
view_func=Plans.as_view('plans'),
44+
methods=["GET", "POST"])
45+
app.add_url_rule('/about/',
46+
view_func=About.as_view('about'),
47+
methods=["GET", "POST"])
48+
49+
# @app.errorhandler(404)
50+
# def page_not_found(e):
51+
# return render_template('404.html'), 404
52+
53+
# @app.route("/")
54+
# def index():
55+
# return render_template('index.html')
56+
57+
# @app.route("/about")
58+
# def about():
59+
# return render_template('about.html')
60+
61+
# @app.route("/plans")
62+
# def plans():
63+
# return render_template('plans.html')
4264
#----------------------------------------
4365
# handlers
4466
#----------------------------------------
@@ -67,6 +89,8 @@ def page_not_found(e):
6789
connect(DB_NAME, host='mongodb://' + DB_USERNAME + ':' + DB_PASSWORD + '@' + DB_HOST_ADDRESS)
6890
db = MongoEngine(app)
6991

92+
# MongoHQ Database connection
93+
7094
#----------------------------------------
7195
# launch
7296
#----------------------------------------

config.py

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
CSRF_ENABLED = True
2+
SECRET_KEY = 'you-will-never-guess'
3+
4+
OPENID_PROVIDERS = [
5+
{ 'name': 'Google', 'url': 'https://www.google.com/accounts/o8/id' },
6+
{ 'name': 'Yahoo', 'url': 'https://me.yahoo.com' },
7+
{ 'name': 'AOL', 'url': 'http://openid.aol.com/<username>' },
8+
{ 'name': 'Flickr', 'url': 'http://www.flickr.com/<username>' },
9+
{ 'name': 'MyOpenID', 'url': 'https://www.myopenid.com' }]

forms.py

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from flask.ext.wtf import Form, TextField, BooleanField, Required
2+
3+
class LoginForm(Form):
4+
openid = TextField('openid', validators = [Required()])
5+
remember_me = BooleanField('remember_me', default=False)

login.py

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import flask, flask.views
2+
3+
# Dictionary of username and password
4+
users = {'jrimchala':'bacon',
5+
'jrimchala2':'lovebacon',
6+
'jrim':'bacony'}
7+
8+
class Login(flask.views.MethodView):
9+
def get(self):
10+
return flask.render_template('login.html')
11+
12+
def post(self):
13+
# Check if user need to log out
14+
if 'logout' in flask.request.form:
15+
# Pop user out of session
16+
flask.session.pop('usr', None)
17+
return flask.redirect(flask.url_for('login'))
18+
19+
required = ['usr','pswd']
20+
for r in required:
21+
if r not in flask.request.form:
22+
flask.flash("Error: {0} is required.".format(r))
23+
return flask.redirect(flask.url_for('login'))
24+
# Receive usr, pwd input
25+
usr = flask.request.form['usr']
26+
pswd = flask.request.form['pswd']
27+
# Check that usr and pwd exist in dictionary
28+
if usr in users and users[usr] == pswd:
29+
# Accept user
30+
flask.session['usr'] = usr
31+
else:
32+
flask.flash("Username does not exist or incorrect password")
33+
# Return to login page
34+
return flask.redirect(flask.url_for('login'))

main.py

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import flask, flask.views
2+
import os
3+
4+
class Main(flask.views.MethodView):
5+
def get(self, page="index"):
6+
page += ".html"
7+
if os.path.isfile('templates/' + page):
8+
return flask.render_template(page)
9+
flask.abort(404)

models.py

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
from app import db
2+
from flask.ext.mongoengine.wtf import model_form
3+
4+
class User(db.Document):
5+
email = db.StringField(required=True)
6+
first_name = db.StringField(max_length=50)
7+
last_name = db.StringField(max_length=50)
8+
9+
def __repr__(self):
10+
return '<User %r>' % (self.nickname)
11+
12+
class Content(db.EmbeddedDocument):
13+
text = db.StringField()
14+
lang = db.StringField(max_length=3)
15+
16+
class Entry(db.Document):
17+
title = db.StringField(max_length=120, required=True)
18+
author = db.ReferenceField(User)
19+
tags = db.ListField(db.StringField(max_length=30))
20+
content = db.EmbeddedDocumentField(Content)
21+
22+
InsertEntry = model_form(Entry)
23+
24+
def add_entry(request):
25+
form = InsertEntry(request.POST)
26+
if request.method == 'POST' and form.validate():
27+
redirect('done')
28+
return render_response('about.html', form=form)

plans.py

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import flask, flask.views
2+
import os
3+
import utils
4+
5+
class Plans(flask.views.MethodView):
6+
@utils.login_required
7+
def get(self):
8+
return flask.render_template('plans.html')
9+
10+
@utils.login_required
11+
def post(self):
12+
result = eval(flask.request.form['expression'])
13+
flask.flash(result)
14+
return flask.redirect(flask.url_for('plans'))

templates/404.html

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,6 @@
22
{% block title %} - Page Not Found{% endblock %}
33
{% block content %}
44
<h1>Page Not Found</h1>
5-
<p><a href="{{ url_for('index') }}">home</a></p>
5+
<p>The page you're looking for does not exist</p>
6+
<p>Please return to the <a href="{{ url_for('main') }}">Main</a> page</p>
67
{% endblock %}

templates/about.html

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
{% extends "base.html" %}
22
{% block title %} - About{% endblock %}
33
{% block content %}
4-
<p>About [OptMe]!</p>
5-
{% if not session.logged_in %}
6-
<p>You are not logged in.</p>
7-
{% else %}
8-
<p>You are logged in.</p>
4+
<h3> About Optimized Me </h3>
5+
{% if 'usr' in session %}
6+
<p>Thank you for logging in.</p>
7+
{% else %}
8+
<p>Please log in for more information.</p>
99
{% endif %}
1010
{% endblock %}

templates/base.html

+43-52
Original file line numberDiff line numberDiff line change
@@ -1,75 +1,66 @@
11
<!DOCTYPE html>
2-
<html lang="en">
3-
<head>
2+
<html>
3+
<head>
44
{% block head %}
5-
<title>Welcome to Optimize Me Dashboard{% block title %}{% endblock %}</title>
6-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
7-
<meta name="description" content="">
8-
<meta name="keywords" content="">
9-
<meta name="author" content="">
10-
<meta charset="utf-8">
11-
12-
<meta property="og:title" content=""/>
13-
<meta property="og:type" content="website"/>
14-
<meta property="og:url" content=""/>
15-
<meta property="og:image" content="" />
16-
<meta property="og:site_name" content='myflask'/>
17-
<meta property="og:description" content=""/>
18-
19-
<link href="{{ url_for('static', filename='css/bootstrap.css') }}" rel="stylesheet">
20-
<style> body { padding-top: 60px; } </style>
21-
22-
<!-- SUPPORT FOR IE6-8 OF HTML5 ELEMENTS -->
23-
<!--[if lt IE 9]>
24-
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
25-
<![endif]-->
26-
27-
<script src="{{ url_for('static', filename='js/jquery.min.js') }}"></script>
28-
<script src="{{ url_for('static', filename='js/bootstrap.min.js') }}"></script>
5+
<title>Welcome to Optimize Me Dashboard</title>
6+
<link href="{{ url_for('static', filename='css/bootstrap.css') }}" rel="stylesheet">
7+
<style> body { padding-top: 80px; } </style>
8+
<script src="{{ url_for('static', filename='js/jquery.min.js') }}"></script>
9+
<script src="{{ url_for('static', filename='js/bootstrap.min.js') }}"></script>
2910
{% endblock %}
30-
</head>
31-
32-
<body>
11+
</head>
3312

13+
<body>
3414
{% block navbar %}
3515
<div class="navbar navbar-fixed-top">
3616
<div class="navbar-inner">
3717
<div class="container">
38-
<a class="brand" href="/">[Optimize Me]</a>
39-
<div class="nav-collapse">
40-
<ul class="nav">
41-
</ul>
42-
{% block navbar_right %}
43-
<ul class="nav pull-right">
44-
<li><a href="/">Welcome</a></li>
45-
<li><a href="/about">What we do</a></li>
46-
<li><a href="/plans">Plans</a></li>
47-
{% if not session.logged_in %}
48-
<li><a href="#">Login or Signup</a></li>
49-
{% else %}
50-
<li><a href="#">Logout</a></li>
51-
{% endif %}
52-
</ul>
53-
{% endblock %}
54-
</div><!--/.nav-collapse -->
18+
<a class="brand" href="/">[Optimize Me]</a>
19+
<div class="nav-collapse">
20+
<ul class="nav">
21+
</ul>
22+
{% block navbar_right %}
23+
<ul class="nav pull-right">
24+
<li><a href="/">Welcome</a></li>
25+
<li><a href="{{url_for('main')}}">Main</a></li>
26+
{% if 'usr' in session %}
27+
<li><a href="{{url_for('login')}}">logout</a></li>
28+
{% else %}
29+
<li><a href="{{url_for('login')}}">login</a></li>
30+
{% endif %}
31+
<li><a href="{{url_for('about')}}">About</a></li>
32+
</ul>
33+
{% endblock %}
34+
</div>
5535
</div>
56-
</div>
36+
</div>
5737
</div>
5838
{% endblock %}
5939

6040
<div class="container page">
6141
<div class="content">
6242
{% block content %}
43+
Content place holder
6344
{% endblock %}
6445
</div>
46+
</div>
6547

66-
<hr>
67-
48+
<!-- Flashing message -->
49+
<div id="flashed">
50+
{% with messages = get_flashed_messages() %}
51+
{% for message in messages %}
52+
{{message}}
53+
{% endfor %}
54+
{% endwith %}
55+
6856
{% block footer %}
6957
<footer class="footer">
70-
<p>&copy; [OptMe]</p>
58+
<p>&copy; [Optimize Me]: Contact Us</p>
7159
</footer>
7260
{% endblock %}
73-
</div>
74-
</body>
61+
</div>
62+
<script src="http://code.jquery.com/jquery-latest.js"></script>
63+
<script src="js/bootstrap.min.js"></script>
64+
65+
</body>
7566
</html>

0 commit comments

Comments
 (0)