{ "info": { "author": "Ryan Anguiano", "author_email": "ryan.anguiano@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 2 - Pre-Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6" ], "description": "================\nAPI Star Contrib\n================\n\n\n.. image:: https://img.shields.io/pypi/v/apistar-contrib.svg\n :target: https://pypi.python.org/pypi/apistar-contrib\n\n.. image:: https://img.shields.io/travis/ryananguiano/apistar-contrib.svg\n :target: https://travis-ci.org/ryananguiano/apistar-contrib\n\n.. image:: https://readthedocs.org/projects/api-star-contrib/badge/?version=latest\n :target: https://api-star-contrib.readthedocs.io/en/latest/?badge=latest\n :alt: Documentation Status\n\n.. image:: https://pyup.io/repos/github/ryananguiano/apistar-contrib/shield.svg\n :target: https://pyup.io/repos/github/ryananguiano/apistar-contrib/\n :alt: Updates\n\n\nContrib packages to add on to API Star.\n\n\n* Free software: MIT license\n* Documentation: https://api-star-contrib.readthedocs.io.\n\n\nFeatures\n--------\n\n* CSRF Token Hook\n* Local Session Store (For Development)\n* Timezone Support\n* Redis Session Store\n\n\nTODO\n----\n\n* DB Session Store\n\n\nUsage\n-----\n\nLocal Session Store (For Development)\n`````````````````````````````````````\n\n.. code-block:: python\n\n from apistar import App, Route, http\n from apistar_contrib.sessions import Session, SessionComponent, SessionHook, LocalMemorySessionStore\n\n\n def use_session(session: Session, params: http.QueryParams):\n for key, value in params:\n session[key] = value\n return session.data\n\n\n def clear_session(session: Session):\n session.clear()\n return session.data\n\n\n routes = [\n Route('/', 'GET', use_session),\n Route('/clear', 'GET', clear_session),\n ]\n\n app = App(\n routes=routes,\n components=[SessionComponent(LocalMemorySessionStore)],\n event_hooks=[SessionHook]\n )\n\n\nRedis Session Store\n```````````````````\n\n.. code-block:: python\n\n from apistar import App, Route, http\n from apistar_contrib.sessions import Session, SessionComponent, SessionHook, RedisSessionStore\n\n\n def use_session(session: Session, params: http.QueryParams):\n for key, value in params:\n session[key] = value\n return session.data\n\n\n def clear_session(session: Session):\n session.clear()\n return session.data\n\n\n routes = [\n Route('/', 'GET', use_session),\n Route('/clear', 'GET', clear_session),\n ]\n\n app = App(\n routes=routes,\n components=[SessionComponent(RedisSessionStore, 'redis://localhost:6379/0')],\n event_hooks=[SessionHook]\n )\n\n\nCSRF Token\n``````````\n\n.. code-block:: python\n\n import os\n from apistar import App, Route, http\n from apistar_contrib.csrf import EnforceCsrfHook, rotate_token\n\n\n def show_form():\n return app.render_template(\n 'form.html',\n show_csrf=True,\n )\n\n\n def show_no_csrf_form():\n return app.render_template(\n 'form.html',\n show_csrf=False,\n )\n\n\n def handle_form(request: http.Request):\n # You should rotate CSRF tokens after successful login/logout\n rotate_token(request)\n return app.render_template(\n 'form.html',\n show_csrf=True,\n success=True,\n )\n\n\n routes = [\n Route('/', 'GET', show_form),\n Route('/no_csrf', 'GET', show_no_csrf_form),\n Route('/handle', 'POST', handle_form),\n ]\n\n BASE_DIR = os.path.dirname(__file__)\n TEMPLATE_DIR = os.path.join(BASE_DIR, 'templates')\n\n app = App(\n routes=routes,\n event_hooks=[EnforceCsrfHook],\n template_dir=TEMPLATE_DIR,\n )\n\n\n.. code-block:: html\n\n \n \n \n
\n \n