Initial structure of web app
This commit is contained in:
parent
426a63ea23
commit
f86d1df276
7
.gitignore
vendored
Normal file
7
.gitignore
vendored
Normal file
|
@ -0,0 +1,7 @@
|
|||
# Don't check in site specific settings.
|
||||
config.py
|
||||
site/www/*.html
|
||||
site/www/*/*
|
||||
|
||||
# Compiled Python
|
||||
*.pyc
|
30
config-sample.py
Normal file
30
config-sample.py
Normal file
|
@ -0,0 +1,30 @@
|
|||
# Sample config file for Rophako.
|
||||
#
|
||||
# Edit this file and save the copy as "config.py".
|
||||
|
||||
import os
|
||||
_basedir = os.path.abspath(os.path.dirname(__file__))
|
||||
|
||||
DEBUG = True
|
||||
|
||||
# Unique name of your site, e.g. "kirsle.net"
|
||||
SITE_NAME = "example.com"
|
||||
|
||||
# Secret key used for session cookie signing. Make this long and hard to guess.
|
||||
#
|
||||
# Tips for creating a strong secret key:
|
||||
# $ python
|
||||
# >>> import os
|
||||
# >>> os.urandom(24)
|
||||
# '\xfd{H\xe5<\x95\xf9\xe3\x96.5\xd1\x01O<!\xd5\xa2\xa0\x9fR"\xa1\xa8'
|
||||
#
|
||||
# Then take that whole quoted string and paste it right in as the secret key!
|
||||
# Do NOT use that one. It was just an example! Make your own.
|
||||
SECRET_KEY = 'for the love of Arceus, change this key!'
|
||||
|
||||
# Rophako uses a flat file JSON database system, and the Redis caching server
|
||||
# sits between Ropahko and the filesystem.
|
||||
REDIS_HOST = "localhost"
|
||||
REDIS_PORT = 6379
|
||||
REDIS_DB = 0
|
||||
REDIS_PREFIX = "rophako:"
|
2
requirements.txt
Normal file
2
requirements.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
flask
|
||||
redis
|
77
rophako/__init__.py
Normal file
77
rophako/__init__.py
Normal file
|
@ -0,0 +1,77 @@
|
|||
__version__ = '0.01'
|
||||
|
||||
from flask import Flask, g, request, session, render_template, send_file
|
||||
import jinja2
|
||||
import os.path
|
||||
|
||||
import config
|
||||
|
||||
app = Flask(__name__)
|
||||
app.DEBUG = config.DEBUG
|
||||
app.SECRET_KEY = config.SECRET_KEY
|
||||
|
||||
# Load all the blueprints!
|
||||
from rophako.modules.account import mod as AccountModule
|
||||
app.register_blueprint(AccountModule)
|
||||
|
||||
# Custom Jinja handler to support custom- and default-template folders for
|
||||
# rendering templates.
|
||||
app.jinja_loader = jinja2.ChoiceLoader([
|
||||
jinja2.FileSystemLoader("site/www"), # Site specific.
|
||||
jinja2.FileSystemLoader("rophako/www"), # Default
|
||||
])
|
||||
|
||||
|
||||
@app.before_request
|
||||
def before_request():
|
||||
"""Called before all requests. Initialize global template variables."""
|
||||
|
||||
# Default template vars.
|
||||
g.info = {
|
||||
"app": {
|
||||
"name": "Rophako",
|
||||
"version": __version__,
|
||||
"author": "Noah Petherbridge",
|
||||
},
|
||||
"uri": request.path.split("/")[1:],
|
||||
}
|
||||
|
||||
|
||||
@app.context_processor
|
||||
def after_request():
|
||||
"""Called just before render_template. Inject g.info into the template vars."""
|
||||
return g.info
|
||||
|
||||
|
||||
@app.route("/<path:path>")
|
||||
def catchall(path):
|
||||
"""The catch-all path handler. If it exists in the www folders, it's sent,
|
||||
otherwise we give the 404 error page."""
|
||||
|
||||
# Search for this file.
|
||||
for root in ["site/www", "rophako/www"]:
|
||||
abspath = os.path.abspath("{}/{}".format(root, path))
|
||||
print abspath
|
||||
print abspath + ".html"
|
||||
if os.path.isfile(abspath):
|
||||
return send_file(abspath)
|
||||
elif not "." in path and os.path.isfile(abspath + ".html"):
|
||||
return render_template(path + ".html")
|
||||
|
||||
return not_found("404")
|
||||
|
||||
|
||||
@app.route("/")
|
||||
def index():
|
||||
print "INDEX PAGE"
|
||||
return catchall("index")
|
||||
|
||||
|
||||
@app.errorhandler(404)
|
||||
def not_found(error):
|
||||
print "NOT FOUND"
|
||||
return render_template('errors/404.html', **g.info), 404
|
||||
|
||||
# Domain specific endpoints.
|
||||
if config.SITE_NAME == "kirsle.net":
|
||||
import rophako.modules.kirsle_legacy
|
0
rophako/modules/__init__.py
Normal file
0
rophako/modules/__init__.py
Normal file
9
rophako/modules/account.py
Normal file
9
rophako/modules/account.py
Normal file
|
@ -0,0 +1,9 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
from flask import Blueprint
|
||||
|
||||
mod = Blueprint("account", __name__, url_prefix="/account")
|
||||
|
||||
@mod.route("/")
|
||||
def index():
|
||||
return "Test"
|
23
rophako/modules/kirsle_legacy.py
Normal file
23
rophako/modules/kirsle_legacy.py
Normal file
|
@ -0,0 +1,23 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Legacy endpoint compatibility from kirsle.net.
|
||||
|
||||
from flask import request, redirect
|
||||
from rophako import app
|
||||
|
||||
@app.route("/+")
|
||||
def google_plus():
|
||||
return redirect("https://plus.google.com/+NoahPetherbridge/posts")
|
||||
|
||||
@app.route("/blog.html")
|
||||
def legacy_blog():
|
||||
post_id = request.args.get("id", "")
|
||||
|
||||
# All of this is TO-DO.
|
||||
# friendly_id = get friendly ID
|
||||
# return redirect(...)
|
||||
return "TO-DO"
|
||||
|
||||
@app.route("/<page>.html")
|
||||
def legacy_url(page):
|
||||
return "/{}".format(page)
|
88
rophako/www/css/style.css
Normal file
88
rophako/www/css/style.css
Normal file
|
@ -0,0 +1,88 @@
|
|||
/******************************************************************************
|
||||
* "Resets" - styles on HTML tags *
|
||||
******************************************************************************/
|
||||
|
||||
body {
|
||||
background-color: #FFFFFF;
|
||||
font-family: "Trebuchet MS",Verdana,Arial,Helvetica,sans-serif;
|
||||
font-size: small;
|
||||
color: #000000;
|
||||
width: 850px;
|
||||
margin: 20px auto;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4 {
|
||||
font-family: Verdana,Arial,Helvetica,sans-serif;
|
||||
font-weight: bold;
|
||||
margin: 12px 0px;
|
||||
}
|
||||
h1 {
|
||||
font-size: 32pt;
|
||||
margin-top: 0px;
|
||||
}
|
||||
h2 {
|
||||
font-size: 28pt;
|
||||
}
|
||||
h3 {
|
||||
font-size: 24pt;
|
||||
}
|
||||
h4 {
|
||||
font-size: 18pt;
|
||||
}
|
||||
|
||||
a:link, a:visited {
|
||||
color: #006699;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
header {
|
||||
display: block;
|
||||
padding: 12px;
|
||||
border: 1px solid #000000;
|
||||
margin-bottom: 40px;
|
||||
box-shadow: 1px 1px 5px #000000;
|
||||
border-radius: 12px;
|
||||
}
|
||||
header h1 {
|
||||
font-size: 46pt;
|
||||
text-align: center;
|
||||
color: #0099FF;
|
||||
text-shadow: 2px 2px 2px #000099;
|
||||
}
|
||||
|
||||
nav {
|
||||
float: left;
|
||||
width: 200px;
|
||||
border: 1px solid #000000;
|
||||
border-radius: 12px;
|
||||
}
|
||||
nav ul {
|
||||
list-style-type: none;
|
||||
padding: 8px;
|
||||
margin: 0px;
|
||||
}
|
||||
nav ul li {
|
||||
padding: 2px 0px;
|
||||
}
|
||||
nav ul li.header {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
div#content {
|
||||
float: right;
|
||||
width: 620px;
|
||||
}
|
||||
|
||||
div.clear {
|
||||
clear: both;
|
||||
}
|
||||
|
||||
footer {
|
||||
clear: both;
|
||||
margin-top: 40px;
|
||||
padding: 12px;
|
||||
text-align: center;
|
||||
color: #707070;
|
||||
border: 1px solid #000000;
|
||||
border-radius: 12px;
|
||||
}
|
9
rophako/www/errors/404.html
Normal file
9
rophako/www/errors/404.html
Normal file
|
@ -0,0 +1,9 @@
|
|||
{% extends "layout.html" %}
|
||||
{% block title %}Page Not Found{% endblock %}
|
||||
{% block content %}
|
||||
|
||||
<h1>Page Not Found</h1>
|
||||
|
||||
The page you requested could not be found.
|
||||
|
||||
{% endblock %}
|
9
rophako/www/index.html
Normal file
9
rophako/www/index.html
Normal file
|
@ -0,0 +1,9 @@
|
|||
{% extends "layout.html" %}
|
||||
{% block title %}Rophako CMS{% endblock %}
|
||||
{% block content %}
|
||||
|
||||
<h1>Welcome!</h1>
|
||||
|
||||
This is the Rophako CMS!
|
||||
|
||||
{% endblock %}
|
39
rophako/www/layout.html
Normal file
39
rophako/www/layout.html
Normal file
|
@ -0,0 +1,39 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>{% block title %}{% endblock %}</title>
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="/css/style.css">
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<header>
|
||||
<h1>Rophako</h1>
|
||||
</header>
|
||||
|
||||
<nav>
|
||||
<ul>
|
||||
<li class="header">:: Navigation</li>
|
||||
<li><a href="/">Home</a></li>
|
||||
<li><a href="#">About Rophako</a></li>
|
||||
<li><a href="#">Download</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<div id="content">
|
||||
{% block content %}{% endblock %}
|
||||
</div>
|
||||
|
||||
<div class="clear"></div>
|
||||
|
||||
<footer>
|
||||
© 2014 Noah Petherbridge. Web design released along with the Rophako CMS
|
||||
under the GNU General Public License v2.0.<br>
|
||||
|
||||
<a href="https://github.com/kirsle/rophako" target="_blank">
|
||||
{{ app["name"] }} v{{ app["version"] }}
|
||||
</a>
|
||||
</footer>
|
||||
|
||||
</body>
|
||||
</html>
|
4
runserver.py
Normal file
4
runserver.py
Normal file
|
@ -0,0 +1,4 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
from rophako import app
|
||||
app.run(host='0.0.0.0', debug=True, port=2006)
|
0
site/www/.dummy
Normal file
0
site/www/.dummy
Normal file
Loading…
Reference in New Issue
Block a user