Chapter 11: Facelift (v0.11)
This commit is contained in:
		
							parent
							
								
									4b6852b3e8
								
							
						
					
					
						commit
						dfb4b7361b
					
				| 
						 | 
				
			
			@ -6,6 +6,7 @@ from flask_sqlalchemy import SQLAlchemy
 | 
			
		|||
from flask_migrate import Migrate
 | 
			
		||||
from flask_login import LoginManager
 | 
			
		||||
from flask_mail import Mail
 | 
			
		||||
from flask_bootstrap import Bootstrap
 | 
			
		||||
from config import Config
 | 
			
		||||
 | 
			
		||||
app = Flask(__name__)
 | 
			
		||||
| 
						 | 
				
			
			@ -15,6 +16,7 @@ migrate = Migrate(app, db)
 | 
			
		|||
login = LoginManager(app)
 | 
			
		||||
login.login_view = 'login'
 | 
			
		||||
mail = Mail(app)
 | 
			
		||||
bootstrap = Bootstrap(app)
 | 
			
		||||
 | 
			
		||||
if not app.debug:
 | 
			
		||||
    if app.config['MAIL_SERVER']:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,6 @@
 | 
			
		|||
{% extends "base.html" %}
 | 
			
		||||
 | 
			
		||||
{% block content %}
 | 
			
		||||
{% block app_content %}
 | 
			
		||||
    <h1>Not Found</h1>
 | 
			
		||||
    <p><a href="{{ url_for('index') }}">Back</a></p>
 | 
			
		||||
{% endblock %}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,6 @@
 | 
			
		|||
{% extends "base.html" %}
 | 
			
		||||
 | 
			
		||||
{% block content %}
 | 
			
		||||
{% block app_content %}
 | 
			
		||||
    <h1>An unexpected error has occurred</h1>
 | 
			
		||||
    <p>The administrator has been notified. Sorry for the inconvenience!</p>
 | 
			
		||||
    <p><a href="{{ url_for('index') }}">Back</a></p>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,17 @@
 | 
			
		|||
    <table>
 | 
			
		||||
        <tr valign="top">
 | 
			
		||||
            <td><img src="{{ post.author.avatar(36) }}"></td>
 | 
			
		||||
            <td><a href="{{ url_for('user', username=post.author.username) }}">{{ post.author.username }}</a> says:<br>{{ post.body }}</td>
 | 
			
		||||
    <table class="table table-hover">
 | 
			
		||||
        <tr>
 | 
			
		||||
            <td width="70px">
 | 
			
		||||
                <a href="{{ url_for('user', username=post.author.username) }}">
 | 
			
		||||
                    <img src="{{ post.author.avatar(70) }}" />
 | 
			
		||||
                </a>
 | 
			
		||||
            </td>
 | 
			
		||||
            <td>
 | 
			
		||||
                <a href="{{ url_for('user', username=post.author.username) }}">
 | 
			
		||||
                    {{ post.author.username }}
 | 
			
		||||
                </a>
 | 
			
		||||
                says:
 | 
			
		||||
                <br>
 | 
			
		||||
                {{ post.body }}
 | 
			
		||||
            </td>
 | 
			
		||||
        </tr>
 | 
			
		||||
    </table>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,33 +1,50 @@
 | 
			
		|||
<html>
 | 
			
		||||
    <head>
 | 
			
		||||
        {% if title %}
 | 
			
		||||
        <title>{{ title }} - Microblog</title>
 | 
			
		||||
        {% else %}
 | 
			
		||||
        <title>Welcome to Microblog</title>
 | 
			
		||||
        {% endif %}
 | 
			
		||||
    </head>
 | 
			
		||||
    <body>
 | 
			
		||||
        <div>
 | 
			
		||||
            Microblog:
 | 
			
		||||
            <a href="{{ url_for('index') }}">Home</a>
 | 
			
		||||
            <a href="{{ url_for('explore') }}">Explore</a>
 | 
			
		||||
            {% if current_user.is_anonymous %}
 | 
			
		||||
            <a href="{{ url_for('login') }}">Login</a>
 | 
			
		||||
            {% else %}
 | 
			
		||||
            <a href="{{ url_for('user', username=current_user.username) }}">Profile</a>
 | 
			
		||||
            <a href="{{ url_for('logout') }}">Logout</a>
 | 
			
		||||
            {% endif %}
 | 
			
		||||
{% extends 'bootstrap/base.html' %}
 | 
			
		||||
 | 
			
		||||
{% block title %}
 | 
			
		||||
    {% if title %}{{ title }} - Microblog{% else %}Welcome to Microblog{% endif %}
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
{% block navbar %}
 | 
			
		||||
    <nav class="navbar navbar-default">
 | 
			
		||||
        <div class="container">
 | 
			
		||||
            <div class="navbar-header">
 | 
			
		||||
                <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
 | 
			
		||||
                    <span class="sr-only">Toggle navigation</span>
 | 
			
		||||
                    <span class="icon-bar"></span>
 | 
			
		||||
                    <span class="icon-bar"></span>
 | 
			
		||||
                    <span class="icon-bar"></span>
 | 
			
		||||
                </button>
 | 
			
		||||
                <a class="navbar-brand" href="{{ url_for('index') }}">Microblog</a>
 | 
			
		||||
            </div>
 | 
			
		||||
        <hr>
 | 
			
		||||
            <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
 | 
			
		||||
                <ul class="nav navbar-nav">
 | 
			
		||||
                    <li><a href="{{ url_for('index') }}">Home</a></li>
 | 
			
		||||
                    <li><a href="{{ url_for('explore') }}">Explore</a></li>
 | 
			
		||||
                </ul>
 | 
			
		||||
                <ul class="nav navbar-nav navbar-right">
 | 
			
		||||
                    {% if current_user.is_anonymous %}
 | 
			
		||||
                    <li><a href="{{ url_for('login') }}">Login</a></li>
 | 
			
		||||
                    {% else %}
 | 
			
		||||
                    <li><a href="{{ url_for('user', username=current_user.username) }}">Profile</a></li>
 | 
			
		||||
                    <li><a href="{{ url_for('logout') }}">Logout</a></li>
 | 
			
		||||
                    {% endif %}
 | 
			
		||||
                </ul>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
    </nav>
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
{% block content %}
 | 
			
		||||
    <div class="container">
 | 
			
		||||
        {% with messages = get_flashed_messages() %}
 | 
			
		||||
        {% if messages %}
 | 
			
		||||
        <ul>
 | 
			
		||||
            {% for message in messages %}
 | 
			
		||||
            <li>{{ message }}</li>
 | 
			
		||||
            <div class="alert alert-info" role="alert">{{ message }}</div>
 | 
			
		||||
            {% endfor %}
 | 
			
		||||
        </ul>
 | 
			
		||||
        {% endif %}
 | 
			
		||||
        {% endwith %}
 | 
			
		||||
        {% block content %}{% endblock %}
 | 
			
		||||
  </body>
 | 
			
		||||
</html>
 | 
			
		||||
 | 
			
		||||
        {# application content needs to be provided in the app_content block #}
 | 
			
		||||
        {% block app_content %}{% endblock %}
 | 
			
		||||
    </div>
 | 
			
		||||
{% endblock %}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,23 +1,11 @@
 | 
			
		|||
{% extends "base.html" %}
 | 
			
		||||
{% import 'bootstrap/wtf.html' as wtf %}
 | 
			
		||||
 | 
			
		||||
{% block content %}
 | 
			
		||||
{% block app_content %}
 | 
			
		||||
    <h1>Edit Profile</h1>
 | 
			
		||||
    <form action="" method="post">
 | 
			
		||||
        {{ form.hidden_tag() }}
 | 
			
		||||
        <p>
 | 
			
		||||
            {{ form.username.label }}<br>
 | 
			
		||||
            {{ form.username(size=32) }}<br>
 | 
			
		||||
            {% for error in form.username.errors %}
 | 
			
		||||
            <span style="color: red;">[{{ error }}]</span>
 | 
			
		||||
            {% endfor %}
 | 
			
		||||
        </p>
 | 
			
		||||
        <p>
 | 
			
		||||
            {{ form.about_me.label }}<br>
 | 
			
		||||
            {{ form.about_me(cols=50, rows=4) }}<br>
 | 
			
		||||
            {% for error in form.about_me.errors %}
 | 
			
		||||
            <span style="color: red;">[{{ error }}]</span>
 | 
			
		||||
            {% endfor %}
 | 
			
		||||
        </p>
 | 
			
		||||
        <p>{{ form.submit() }}</p>
 | 
			
		||||
    </form>
 | 
			
		||||
    <div class="row">
 | 
			
		||||
        <div class="col-md-4">
 | 
			
		||||
            {{ wtf.quick_form(form) }}
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
{% endblock %}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,27 +1,27 @@
 | 
			
		|||
{% extends "base.html" %}
 | 
			
		||||
{% import 'bootstrap/wtf.html' as wtf %}
 | 
			
		||||
 | 
			
		||||
{% block content %}
 | 
			
		||||
{% block app_content %}
 | 
			
		||||
    <h1>Hi, {{ current_user.username }}!</h1>
 | 
			
		||||
    {% if form %}
 | 
			
		||||
    <form action="" method="post">
 | 
			
		||||
        {{ form.hidden_tag() }}
 | 
			
		||||
        <p>
 | 
			
		||||
            {{ form.post.label }}<br>
 | 
			
		||||
            {{ form.post(cols=32, rows=4) }}<br>
 | 
			
		||||
            {% for error in form.post.errors %}
 | 
			
		||||
            <span style="color: red;">[{{ error }}]</span>
 | 
			
		||||
            {% endfor %}
 | 
			
		||||
        </p>
 | 
			
		||||
        <p>{{ form.submit() }}</p>
 | 
			
		||||
    </form>
 | 
			
		||||
    {{ wtf.quick_form(form) }}
 | 
			
		||||
    <br>
 | 
			
		||||
    {% endif %}
 | 
			
		||||
    {% for post in posts %}
 | 
			
		||||
        {% include '_post.html' %}
 | 
			
		||||
    {% endfor %}
 | 
			
		||||
    {% if prev_url %}
 | 
			
		||||
    <a href="{{ prev_url }}">Newer posts</a>
 | 
			
		||||
    {% endif %}
 | 
			
		||||
    {% if next_url %}
 | 
			
		||||
    <a href="{{ next_url }}">Older posts</a>
 | 
			
		||||
    {% endif %}
 | 
			
		||||
    <nav aria-label="...">
 | 
			
		||||
        <ul class="pager">
 | 
			
		||||
            <li class="previous{% if not prev_url %} disabled{% endif %}">
 | 
			
		||||
                <a href="{{ prev_url or '#' }}">
 | 
			
		||||
                    <span aria-hidden="true">←</span> Newer posts
 | 
			
		||||
                </a>
 | 
			
		||||
            </li>
 | 
			
		||||
            <li class="next{% if not next_url %} disabled{% endif %}">
 | 
			
		||||
                <a href="{{ next_url or '#' }}">
 | 
			
		||||
                    Older posts <span aria-hidden="true">→</span>
 | 
			
		||||
                </a>
 | 
			
		||||
            </li>
 | 
			
		||||
        </ul>
 | 
			
		||||
    </nav>
 | 
			
		||||
{% endblock %}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,26 +1,14 @@
 | 
			
		|||
{% extends "base.html" %}
 | 
			
		||||
{% extends 'base.html' %}
 | 
			
		||||
{% import 'bootstrap/wtf.html' as wtf %}
 | 
			
		||||
 | 
			
		||||
{% block content %}
 | 
			
		||||
{% block app_content %}
 | 
			
		||||
    <h1>Sign In</h1>
 | 
			
		||||
    <form action="" method="post" novalidate>
 | 
			
		||||
        {{ form.hidden_tag() }}
 | 
			
		||||
        <p>
 | 
			
		||||
            {{ form.username.label }}<br>
 | 
			
		||||
            {{ form.username(size=32) }}<br>
 | 
			
		||||
            {% for error in form.username.errors %}
 | 
			
		||||
            <span style="color: red;">[{{ error }}]</span>
 | 
			
		||||
            {% endfor %}
 | 
			
		||||
        </p>
 | 
			
		||||
        <p>
 | 
			
		||||
            {{ form.password.label }}<br>
 | 
			
		||||
            {{ form.password(size=32) }}<br>
 | 
			
		||||
            {% for error in form.password.errors %}
 | 
			
		||||
            <span style="color: red;">[{{ error }}]</span>
 | 
			
		||||
            {% endfor %}
 | 
			
		||||
        </p>
 | 
			
		||||
        <p>{{ form.remember_me() }} {{ form.remember_me.label }}</p>
 | 
			
		||||
        <p>{{ form.submit() }}</p>
 | 
			
		||||
    </form>
 | 
			
		||||
    <div class="row">
 | 
			
		||||
        <div class="col-md-4">
 | 
			
		||||
            {{ wtf.quick_form(form) }}
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <br>
 | 
			
		||||
    <p>New User? <a href="{{ url_for('register') }}">Click to Register!</a></p>
 | 
			
		||||
    <p>
 | 
			
		||||
        Forgot Your Password?
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,37 +1,11 @@
 | 
			
		|||
{% extends "base.html" %}
 | 
			
		||||
{% import 'bootstrap/wtf.html' as wtf %}
 | 
			
		||||
 | 
			
		||||
{% block content %}
 | 
			
		||||
{% block app_content %}
 | 
			
		||||
    <h1>Register</h1>
 | 
			
		||||
    <form action="" method="post">
 | 
			
		||||
        {{ form.hidden_tag() }}
 | 
			
		||||
        <p>
 | 
			
		||||
            {{ form.username.label }}<br>
 | 
			
		||||
            {{ form.username(size=32) }}<br>
 | 
			
		||||
            {% for error in form.username.errors %}
 | 
			
		||||
            <span style="color: red;">[{{ error }}]</span>
 | 
			
		||||
            {% endfor %}
 | 
			
		||||
        </p>
 | 
			
		||||
        <p>
 | 
			
		||||
            {{ form.email.label }}<br>
 | 
			
		||||
            {{ form.email(size=64) }}<br>
 | 
			
		||||
            {% for error in form.email.errors %}
 | 
			
		||||
            <span style="color: red;">[{{ error }}]</span>
 | 
			
		||||
            {% endfor %}
 | 
			
		||||
        </p>
 | 
			
		||||
        <p>
 | 
			
		||||
            {{ form.password.label }}<br>
 | 
			
		||||
            {{ form.password(size=32) }}<br>
 | 
			
		||||
            {% for error in form.password.errors %}
 | 
			
		||||
            <span style="color: red;">[{{ error }}]</span>
 | 
			
		||||
            {% endfor %}
 | 
			
		||||
        </p>
 | 
			
		||||
        <p>
 | 
			
		||||
            {{ form.password2.label }}<br>
 | 
			
		||||
            {{ form.password2(size=32) }}<br>
 | 
			
		||||
            {% for error in form.password2.errors %}
 | 
			
		||||
            <span style="color: red;">[{{ error }}]</span>
 | 
			
		||||
            {% endfor %}
 | 
			
		||||
        </p>
 | 
			
		||||
        <p>{{ form.submit() }}</p>
 | 
			
		||||
    </form>
 | 
			
		||||
    <div class="row">
 | 
			
		||||
        <div class="col-md-4">
 | 
			
		||||
            {{ wtf.quick_form(form) }}
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
{% endblock %}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,23 +1,11 @@
 | 
			
		|||
{% extends "base.html" %}
 | 
			
		||||
{% import 'bootstrap/wtf.html' as wtf %}
 | 
			
		||||
 | 
			
		||||
{% block content %}
 | 
			
		||||
{% block app_content %}
 | 
			
		||||
    <h1>Reset Your Password</h1>
 | 
			
		||||
    <form action="" method="post">
 | 
			
		||||
        {{ form.hidden_tag() }}
 | 
			
		||||
        <p>
 | 
			
		||||
            {{ form.password.label }}<br>
 | 
			
		||||
            {{ form.password(size=32) }}<br>
 | 
			
		||||
            {% for error in form.password.errors %}
 | 
			
		||||
            <span style="color: red;">[{{ error }}]</span>
 | 
			
		||||
            {% endfor %}
 | 
			
		||||
        </p>
 | 
			
		||||
        <p>
 | 
			
		||||
            {{ form.password2.label }}<br>
 | 
			
		||||
            {{ form.password2(size=32) }}<br>
 | 
			
		||||
            {% for error in form.password2.errors %}
 | 
			
		||||
            <span style="color: red;">[{{ error }}]</span>
 | 
			
		||||
            {% endfor %}
 | 
			
		||||
        </p>
 | 
			
		||||
        <p>{{ form.submit() }}</p>
 | 
			
		||||
    </form>
 | 
			
		||||
    <div class="row">
 | 
			
		||||
        <div class="col-md-4">
 | 
			
		||||
            {{ wtf.quick_form(form) }}
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
{% endblock %}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,16 +1,11 @@
 | 
			
		|||
{% extends "base.html" %}
 | 
			
		||||
{% import 'bootstrap/wtf.html' as wtf %}
 | 
			
		||||
 | 
			
		||||
{% block content %}
 | 
			
		||||
{% block app_content %}
 | 
			
		||||
    <h1>Reset Password</h1>
 | 
			
		||||
    <form action="" method="post">
 | 
			
		||||
        {{ form.hidden_tag() }}
 | 
			
		||||
        <p>
 | 
			
		||||
            {{ form.email.label }}<br>
 | 
			
		||||
            {{ form.email(size=64) }}<br>
 | 
			
		||||
            {% for error in form.email.errors %}
 | 
			
		||||
            <span style="color: red;">[{{ error }}]</span>
 | 
			
		||||
            {% endfor %}
 | 
			
		||||
        </p>
 | 
			
		||||
        <p>{{ form.submit() }}</p>
 | 
			
		||||
    </form>
 | 
			
		||||
    <div class="row">
 | 
			
		||||
        <div class="col-md-4">
 | 
			
		||||
            {{ wtf.quick_form(form) }}
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
{% endblock %}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,9 +1,9 @@
 | 
			
		|||
{% extends "base.html" %}
 | 
			
		||||
 | 
			
		||||
{% block content %}
 | 
			
		||||
    <table>
 | 
			
		||||
        <tr valign="top">
 | 
			
		||||
            <td><img src="{{ user.avatar(128) }}"></td>
 | 
			
		||||
{% block app_content %}
 | 
			
		||||
    <table class="table table-hover">
 | 
			
		||||
        <tr>
 | 
			
		||||
            <td width="256px"><img src="{{ user.avatar(256) }}"></td>
 | 
			
		||||
            <td>
 | 
			
		||||
                <h1>User: {{ user.username }}</h1>
 | 
			
		||||
                {% if user.about_me %}<p>{{ user.about_me }}</p>{% endif %}
 | 
			
		||||
| 
						 | 
				
			
			@ -19,14 +19,21 @@
 | 
			
		|||
            </td>
 | 
			
		||||
        </tr>
 | 
			
		||||
    </table>
 | 
			
		||||
    <hr>
 | 
			
		||||
    {% for post in posts %}
 | 
			
		||||
        {% include '_post.html' %}
 | 
			
		||||
    {% endfor %}
 | 
			
		||||
    {% if prev_url %}
 | 
			
		||||
    <a href="{{ prev_url }}">Newer posts</a>
 | 
			
		||||
    {% endif %}
 | 
			
		||||
    {% if next_url %}
 | 
			
		||||
    <a href="{{ next_url }}">Older posts</a>
 | 
			
		||||
    {% endif %}
 | 
			
		||||
    <nav aria-label="...">
 | 
			
		||||
        <ul class="pager">
 | 
			
		||||
            <li class="previous{% if not prev_url %} disabled{% endif %}">
 | 
			
		||||
                <a href="{{ prev_url or '#' }}">
 | 
			
		||||
                    <span aria-hidden="true">←</span> Newer posts
 | 
			
		||||
                </a>
 | 
			
		||||
            </li>
 | 
			
		||||
            <li class="next{% if not next_url %} disabled{% endif %}">
 | 
			
		||||
                <a href="{{ next_url or '#' }}">
 | 
			
		||||
                    Older posts <span aria-hidden="true">→</span>
 | 
			
		||||
                </a>
 | 
			
		||||
            </li>
 | 
			
		||||
        </ul>
 | 
			
		||||
    </nav>
 | 
			
		||||
{% endblock %}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue