Getting Started¶
These instructions will get you up and running with a minimal Pyramid app and a basic webpack configuration.
Set up the Pyramid app¶
Skip this section if you already have a Pyramid server up and running. Set up a virtualenv and create a new Pyramid project:
virtualenv venv
source venv/bin/activate
pip install pyramid
pcreate -s starter hello_world
cd hello_world
pip install -e .
You should be able to run the server with pserve development.ini
and see it
working.
Install and configure pyramid_webpack¶
We’re also going to install pyramid_jinja2 as the templating engine.
pip install pyramid_jinja2 pyramid_webpack
Add the following to your development.ini file:
# If this option already exists, append the values
pyramid.includes =
pyramid_jinja2
pyramid_webpack
jinja2.extensions =
pyramid_webpack.jinja2ext:WebpackExtension
# Reloads file changes and requests wait while webpack is compiling
webpack.debug = True
# Directory containing the webpack bundles. Relative to your package root.
webpack.bundle_dir = webpack/bundles
# File containing the webpack stats. Relative to your package root.
webpack.stats_file = webpack/stats.json
Set up webpack¶
You will need to have Node installed and in your PATH for the following steps.
npm init
npm install --save-dev webpack webpack-bundle-tracker babel babel-loader
Put the following into webpack.config.js
var path = require("path")
var BundleTracker = require('webpack-bundle-tracker')
module.exports = {
context: __dirname,
entry: './assets/js/index',
output: {
path: path.resolve('./hello_world/webpack/bundles/'),
filename: "[name]-[hash].js",
},
plugins: [
new BundleTracker({filename: './hello_world/webpack/stats.json'}),
],
module: {
loaders: [
{
test: /\.js$/,
exclude: /node_modules/,
loader: 'babel-loader'
},
],
},
resolve: {
modulesDirectories: ['node_modules'],
extensions: ['', '.js']
},
}
Create a javascript file to be built by webpack:
mkdir -p assets/js/
echo "var n = document.createElement('h1'); n.innerText = 'Javascript loaded'; document.body.appendChild(n);" > assets/js/index.js
Running everything¶
Run the Pyramid server with:
pserve --reload development.ini
Run webpack with:
./node_modules/.bin/webpack --config webpack.config.js -d --progress --colors --watch
Using in templates¶
To render a bundle inside a Chameleon template, we’re going to call
get_bundle
directly. Create a file called hello_world/templates/index.pt
and add
the following:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Example</title>
</head>
<body>
<script type="text/javascript" tal:repeat="asset request.webpack().get_bundle('main')" src="${asset.url}"></script>
</body>
</html>
Then change the renderer in hello_world/views.py
to be
templates/index.pt
. When you reload the webpage it should now say
“Javascript Loaded”.
To render a bundle in Jinja2, make a template called
hello_world/templates/index.jinja2
and add the following:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Example</title>
</head>
<body>
{% webpack 'main' %}
<script type="text/javascript" src="{{ ASSET.url }}"></script>
{% endwebpack %}
</body>
</html>
Then change the renderer in hello_world/views.py
to be
templates/index.jinja2
. When you reload the webpage it should now say
“Javascript Loaded”.