-
-
Save jiaaro/2657094 to your computer and use it in GitHub Desktop.
#!/bin/bash | |
# | |
# Note: This is the only file you *really* need. I've copied the contents | |
# of the important files that are part of our git repo for easier reading | |
# below :) | |
# | |
# I've prefixed this file with two dots to make it rise to the top of the | |
# gist. you can ignore those | |
# | |
# Create and enter a virtualenv called "myapp" | |
mkvirtualenv myapp --no-site-packages | |
workon myapp | |
mkdir myapp | |
cd myapp | |
# Install the dependencies and throw it in a requirements file (used by heroku) | |
pip install git+git://github.com/j2labs/brubeck.git dictshield ujson gevent gunicorn | |
pip freeze > requirements.txt | |
# This is a basic app | |
cat << EOF > app.py | |
from brubeck.request_handling import Brubeck, WebMessageHandler | |
from brubeck.connections import WSGIConnection | |
class DemoHandler(WebMessageHandler): | |
def get(self): | |
self.set_body("Hello, from Brubeck!") | |
return self.render() | |
config = { | |
'msg_conn': WSGIConnection(), | |
'handler_tuples': [ | |
(r'^/', DemoHandler) | |
] | |
} | |
app = Brubeck(**config) | |
# This is the wsgi handler used by gunicorn | |
def application(environ, callback): | |
return app.msg_conn.process_message(app, environ, callback) | |
EOF | |
# Tell heroku how to run it | |
cat << EOF > Procfile | |
web: gunicorn app --bind "0.0.0.0:\$PORT" --workers 3 | |
EOF | |
cat << EOF > .gitignore | |
*.pyc | |
EOF | |
# create a git repo for the code so we can push it into heroku | |
git init . | |
git add . | |
git commit -a -m "initial commit" | |
# create the heroku app and push our app into it | |
heroku create --stack cedar | |
git push heroku master | |
# open the site we just created | |
heroku open |
*.pyc |
from brubeck.request_handling import Brubeck, WebMessageHandler | |
from brubeck.connections import WSGIConnection | |
class DemoHandler(WebMessageHandler): | |
def get(self): | |
self.set_body("Hello, from Brubeck!") | |
return self.render() | |
config = { | |
'msg_conn': WSGIConnection(), | |
'handler_tuples': [ | |
(r'^/', DemoHandler) | |
] | |
} | |
app = Brubeck(**config) | |
def application(environ, callback): | |
return app.msg_conn.process_message(app, environ, callback) |
web: gunicorn app --bind "0.0.0.0:$PORT" --workers 3 |
brubeck==0.4.0 | |
dictshield==0.4.3 | |
gevent==0.13.7 | |
greenlet==0.3.4 | |
gunicorn==0.14.2 | |
ujson==1.18 | |
wsgiref==0.1.2 |
gunicorn looks for a function called application by default (if you don't call it application you have to specify it in the command line call like so (say it was def ponies(environ, callback): ...
):
gunicorn app:ponies --bind "0.0.0.0:$PORT" --workers 3
The reason I didn't call app.run
is that app.run()
starts up it's own wsgi server, but in this case we want gunicorn to be the wsgi server.
app.msg_conn.process_message()
is the function that the built in brubeck wsgi server uses to process the incoming requests. application()
is just a wrapper function to pass the app
argument that WSGIConnection.process_message
expects. (normally I would have used functools.partial
but I wanted it to keep it simple).
That makes sense. Thank you for the explanation!
Would you be willing to write that section and submit a pull request? I'd be happy to put your comments in the Brubeck docs if you're short on time, but I like trying to maintain an accurate account of where ideas come from.
This all looks great. I am not sure about this piece though.
Is it necessary to have a function called
application
or could you just callapp.run()
?