Quickstart
============
Let's start, create a new project structure for myapp
.. code-block:: bash
mkdir myapp
cd myapp
mkdir static # for static files
mkdir templates # for jinja2 templates
touch app.py # main app
touch handlers.py # handlers classes
touch tests.py # for testing the app
Now, edit the content of app.py file
.. code-block:: python
# -*- coding: utf-8 -*-
from gunstar.app import Application
myapp = Application()
if __name__ == '__main__':
from wsgiref.simple_server import make_server
server = make_server('127.0.0.1', 8080, myapp)
server.serve_forever()
Running a development server
.. code-block:: bash
python app.py
Go to your browser and visit http://127.0.0.1:8080, you see a 404 page.
It's time to create your first request handler class, go to handlers.py and edit
.. code-block:: python
# -*- coding: utf-8 -*-
from gunstar.http import RequestHandler
class IndexHandler(RequestHandler):
def get(self):
self.response.write('Index Handler')
Go back to app.py and create routes tuple
.. code-block:: python
# -*- coding: utf-8 -*-
from gunstar.app import Application
routes = (
('/', 'handlers.IndexHandler', 'index'),
)
myapp = Application(routes=routes)
if __name__ == '__main__':
from wsgiref.simple_server import make_server
server = make_server('127.0.0.1', 8080, myapp)
server.serve_forever()
Restart your development server and visit http://127.0.0.1:8080.
The tuple maps a url('/') to a handler('handlers.IndexHandler') and have a name ('index').
Congratulations, your first app is working now!
======================
Working with templates
======================
We need to set up a TEMPLATE_PATH variable in config
.. code-block:: python
# -*- coding: utf-8 -*-
from gunstar.app import Application
import os
PROJECT_PATH = os.path.dirname(os.path.abspath(__file__))
class ConfigSettings(object):
TEMPLATE_PATH = os.path.join(PROJECT_PATH, 'templates')
routes = (
('/', 'handlers.IndexHandler', 'index'),
)
myapp = Application(routes=routes, config=ConfigSettings)
if __name__ == '__main__':
from wsgiref.simple_server import make_server
server = make_server('127.0.0.1', 8080, myapp)
server.serve_forever()
Create file templates/index.html
.. code-block:: html
MyApp - Index
Hello Stranger!
Edit handlers.py to use render_template
.. code-block:: python
# -*- coding: utf-8 -*-
from gunstar.http import RequestHandler
class IndexHandler(RequestHandler):
def get(self):
self.render_template('index.html')
Restart your development server and visit http://127.0.0.1:8080.
======================
Serving static files
======================
Set STATIC_PATH and STATIC_ROOT in config
.. code-block:: python
class ConfigSettings(object):
TEMPLATE_PATH = os.path.join(PROJECT_PATH, 'templates')
STATIC_ROOT = os.path.join(PROJECT_PATH, 'static')
STATIC_PATH = '/static/'
Create static/index.html
.. code-block:: html
MyApp - Index
Index from static files.
Restart your development server and visit http://127.0.0.1:8080/static/index.html.
======================
Working with session
======================
The session is available in RequestHandler.session if you set SECRET_KEY in config::
class ConfigSettings(object):
TEMPLATE_PATH = os.path.join(PROJECT_PATH, 'templates')
STATIC_ROOT = os.path.join(PROJECT_PATH, 'static')
STATIC_PATH = '/static/'
SECRET_KEY = 'my-secret-key'
Edit handlers.py::
# -*- coding: utf-8 -*-
from gunstar.http import RequestHandler
class IndexHandler(RequestHandler):
def get(self):
view_count = self.session.get('view_count', 0)
view_count += 1
self.session.set('view_count', view_count)
self.session.save()
self.render_template('index.html', view_count=view_count)
Edit templates/index.html
.. code-block:: html
MyApp - Index
Hello Stranger!
It's your {{ view_count }} visit to this page
Restart your development server and reload page to see view_count increment.
======================
Testing
======================
Do a favor to yourself and use nose to run the tests::
pip install nose
Gunstar has a TestCase with a nice test client. You have to override get_app method and return your app, that's it.
Edit tests.py::
# -*- coding: utf-8 -*-
from gunstar.testing import TestCase
from app import myapp
class AppTestCase(TestCase):
def get_app(self):
return myapp
def test_index_handler(self):
resp = self.client.get('/')
self.assertEqual(resp.status_code, 200)
self.assertTrue('
Hello Stranger!
' in resp.text)
self.assertTrue('1 visit to this page' in resp.text)
self.assertEqual(resp.context['view_count'], 1)
resp = self.client.get('/')
self.assertEqual(resp.status_code, 200)
self.assertEqual(resp.context['view_count'], 2)
resp = self.client.get('/')
self.assertEqual(resp.status_code, 200)
self.assertEqual(resp.context['view_count'], 3)
def test_static_file(self):
resp = self.client.get('/static/index.html')
self.assertEqual(resp.status_code, 200)
self.assertTrue('
Index from static files.
' in resp.text)
And run nose to call the tests::
nosetests
..
----------------------------------------------------------------------
Ran 2 tests in 0.166s
OK