diff --git a/README.rst b/README.rst index 4f83f20b4f532bfe4012618558cc95ba3b9d5ef8..5174f923a994c0632c64a28e626d3588fc5dc7ad 100644 --- a/README.rst +++ b/README.rst @@ -14,6 +14,7 @@ Features - Procfile for deploying to a PaaS (e.g. Heroku) - nose for testing - A simple ``manage.py`` script. +- CSS and JS minification using Flask-Assets - Easily switch between development and production environments through the MYFLASKAPP_ENV system variable. Screenshots diff --git a/{{cookiecutter.repo_name}}/.gitignore b/{{cookiecutter.repo_name}}/.gitignore index 2a88a2413c96898a122ee20fd73bd5d5d51cf80f..19a1119b8f840c12aab9ce4e2564b0d02f5b76e8 100644 --- a/{{cookiecutter.repo_name}}/.gitignore +++ b/{{cookiecutter.repo_name}}/.gitignore @@ -40,3 +40,9 @@ output/*/index.html # Sphinx docs/_build + +.webassets-cache + +# Virtualenvs +env +env* diff --git a/{{cookiecutter.repo_name}}/requirements/prod.txt b/{{cookiecutter.repo_name}}/requirements/prod.txt index 149deabe5ffc9b76b93e5916db2441d84fd97ee7..b8f4800ed241d18a9eb18fcbbfc7d0a2b8926ede 100644 --- a/{{cookiecutter.repo_name}}/requirements/prod.txt +++ b/{{cookiecutter.repo_name}}/requirements/prod.txt @@ -1,12 +1,25 @@ # Everything that needed in production + +# Flask Flask==0.10.1 -Flask-SQLAlchemy==1.0 -Flask-WTF==0.9.2 -Jinja2==2.7 MarkupSafe==0.18 +Werkzeug==0.9.4 +Jinja2==2.7 +itsdangerous==0.23 + +# Database +Flask-SQLAlchemy==1.0 SQLAlchemy==0.8.2 + +# Forms +Flask-WTF==0.9.2 WTForms==1.0.4 -Werkzeug==0.9.4 + +# Deployment gunicorn==17.5 -itsdangerous==0.23 wsgiref==0.1.2 + +# Assets +Flask-Assets==0.8 +cssmin>=0.1.4 +jsmin>=2.0.4 diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/app.py b/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/app.py index a2e833a6aabfcd15c89a4fd2fbd4015f46a59482..88947a0892e77c8af69b2caa051ae3b684be3d19 100644 --- a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/app.py +++ b/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/app.py @@ -2,6 +2,10 @@ import os from flask import Flask from flask.ext.sqlalchemy import SQLAlchemy +from flask.ext.assets import Environment +from webassets.loaders import PythonLoader + +from {{cookiecutter.repo_name}} import assets app = Flask(__name__) # The environment variable, either 'prod' or 'dev' @@ -11,3 +15,10 @@ app.config.from_object('{{cookiecutter.repo_name}}.settings.{env}Config' .format(env=env.capitalize())) app.config['ENV'] = env db = SQLAlchemy(app) + +# Register asset bundles +assets_env = Environment() +assets_env.init_app(app) +assets_loader = PythonLoader(assets) +for name, bundle in assets_loader.load_bundles().iteritems(): + assets_env.register(name, bundle) diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/assets.py b/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/assets.py new file mode 100644 index 0000000000000000000000000000000000000000..f751629e9e2d4f1144a3706f2b2a4f5a0f9e4ba7 --- /dev/null +++ b/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/assets.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +from flask.ext.assets import Bundle + +common_css = Bundle( + "libs/bootstrap3/css/bootstrap.min.css", + "css/style.css", + filters="cssmin", + output="public/css/common.css" +) + +common_js = Bundle( + "libs/jquery2/jquery-2.0.3.min.js", + "libs/bootstrap3/js/bootstrap.min.js", + "js/plugins.js", + Bundle( + "js/script.js", + filters="jsmin" + ), + output="public/js/common.js" +) diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/main.py b/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/main.py index 6e6f8cdb699310c1456b3e0ccbe04d7c7a0d448f..153bad06908f85b4eb8bd5a1369c12d71e08da00 100644 --- a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/main.py +++ b/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/main.py @@ -4,7 +4,7 @@ Entry point for all things, to avoid circular imports. """ import os -from .app import app, db +from .app import app, db, assets_env from .models import * from .views import * diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/templates/_layouts/base.html b/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/templates/_layouts/base.html index de74c56853a46f46af0069a512a49b66002399b1..99cdbda449dc032b22ce2d8d1928a34450262754 100644 --- a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/templates/_layouts/base.html +++ b/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/templates/_layouts/base.html @@ -20,9 +20,10 @@ <!-- Mobile viewport optimized: h5bp.com/viewport --> <meta name="viewport" content="width=device-width"> - <link rel="stylesheet" href="{{ url_for('static', filename='libs/bootstrap3/css/bootstrap.min.css') }}"> + {% assets "common_css" %} + <link rel="stylesheet" href="{{ ASSET_URL }}"> + {% endassets %} - <link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}"> {% block css %}{% endblock %} </head> @@ -58,17 +59,13 @@ {% include "_layouts/footer.html" %} - <!-- JavaScript at the bottom for fast page loading --> -<script src="{{ url_for('static', filename='libs/jquery2/jquery-2.0.3.min.js') }}"></script> -<script src="{{ url_for('static', filename='libs/bootstrap3/js/bootstrap.min.js') }}"></script> - - -<script src="{{ url_for('static', filename='js/plugins.js') }}"></script> -<script src="{{ url_for('static', filename='js/script.js') }}"></script> - +{% assets "common_js" %} + <script type="text/javascript" src="{{ ASSET_URL }}"></script> +{% endassets %} +{% block js %}{% endblock %} <!-- end scripts --> {% endblock %} </body> </html> -{% endraw %} \ No newline at end of file +{% endraw %}