Muffin-Session
##############
.. _description:
**Muffin-Session** -- Cookie-Based HTTP sessions for Muffin_ framework
.. _badges:
.. image:: https://github.com/klen/muffin-session/workflows/tests/badge.svg
:target: https://github.com/klen/muffin-session/actions
:alt: Tests Status
.. image:: https://img.shields.io/pypi/v/muffin-session
:target: https://pypi.org/project/muffin-session/
:alt: PYPI Version
.. image:: https://img.shields.io/pypi/pyversions/muffin-session
:target: https://pypi.org/project/muffin-session/
:alt: Python Versions
.. _contents:
.. contents::
Features
========
* Supports base64 sessions
* Supports ``JWT`` signed sessions
* Supports ``Fernet`` encrypted sessions
.. _requirements:
Requirements
=============
- python >= 3.9
.. _installation:
Installation
=============
**Muffin-Session** should be installed using pip: ::
pip install muffin-session
# Optional extras
pip install muffin-session[fernet]
.. _usage:
Usage
=====
1. Use it manually
.. code-block:: python
from muffin import Application, ResponseHTML
from muffin_session import Plugin as Session
# Create Muffin Application
app = Application('example')
# Initialize the plugin
# As alternative: session = Session(app, **options)
session = Session()
session.setup(app, secret_key='REALLY_SECRET_KEY_FOR_SIGN_YOUR_SESSIONS')
# Use it inside your handlers
@app.route('/update')
async def update_session(request):
ses = session.load_from_request(request)
ses['var'] = 'value'
response = ResponseHTML('Session has been updated')
session.save_to_response(ses, response)
return res
@app.route('/load')
async def load_session(request):
ses = session.load_from_request(request)
return ses.get('var')
2. Auto manage sessions (with middleware)
.. code-block:: python
from muffin import Application, ResponseHTML
from muffin_session import Plugin as Session
# Create Muffin Application
app = Application('example')
# Initialize the plugin
# As alternative: session = Session(app, **options)
session = Session()
session.setup(app, secret_key='REALLY_SECRET_KEY_FOR_SIGN_YOUR_SESSIONS', auto_manage=True)
# Use it inside your handlers
@app.route('/update')
async def update_session(request):
request.session['var'] = 'value'
return 'Session has been updated'
@app.route('/load')
async def load_session(request):
return request.session.get('var')
Options
-------
=========================== =========================== ===========================
Name Default value Description
--------------------------- --------------------------- ---------------------------
**session_type** ``"jwt"`` Session type (``base64|jwt|fernet``)
**secret_key** ``"InsecureSecret"`` A secret code to sign sessions
**auto_manage** ``False`` Load/Save sessions automatically. Session will be loaded into ``request.session``
**cookie_name** ``"session"`` Sessions's cookie name (``session``)
**cookie_params** Sessions's cookie params (``{'path': '/', 'max-age': None, 'samesite': 'lax', 'secure': False}``)
**default_user_checker** ``lambda x: True`` A function to check a logged user
**login_url** ``"/login"`` An URL to redirect anonymous users (it may be a function which accept ``Request`` and returns a string)
=========================== =========================== ===========================
You are able to provide the options when you are initiliazing the plugin:
.. code-block:: python
session.setup(app, secret_key='123455', cookie_name='info')
Or setup it inside ``Muffin.Application`` config using the ``SESSION_`` prefix:
.. code-block:: python
SESSION_SECRET_KEY = '123455'
SESSION_COOKIE_NAME = 'info'
``Muffin.Application`` configuration options are case insensitive
Examples
--------
.. code-block:: python
from muffin import Application, ResponseHTML
from muffin_session import Plugin as Session
# Create Muffin Application
app = Application('example')
# Initialize the plugin
# As alternative: session = Session(app, **options)
session = Session()
session.setup(app, secret_key='REALLY_SECRET_KEY_FOR_SIGN_YOUR_SESSIONS', auto_manage=True)
@session.user_loader
async def load_user(ident):
"""Define your own user loader. """
return await my_database_load_user_by_id(ident)
@app.register('/session')
async def get_session(request):
""" Load session and return it as JSON. """
return dict(request.session)
@app.register('/admin')
@session.user_pass(lambda user: user.is_admin)
async def admin(request):
"""Awailable for admins only. """
return 'TOP SECRET'
@app.register('/login')
async def login(request):
"""Save user id into the current session. """
# ...
session.login(request, current_user.pk)
return 'OK'
@app.register('/logout')
async def logout(request):
""" Logout user. """
# ...
session.logout(request)
return 'OK'
@app.register('/somewhere')
async def somewhere(request):
""" Do something and leave a flash message """
# ...
request.session.clear()
return 'OK'
.. _bugtracker:
Bug tracker
===========
If you have any suggestions, bug reports or
annoyances please report them to the issue tracker
at https://github.com/klen/muffin-session/issues
.. _contributing:
Contributing
============
Development of Muffin-Session happens at: https://github.com/klen/muffin-session
Contributors
=============
* klen_ (Kirill Klenov)
.. _license:
License
========
Licensed under a `MIT license`_.
.. _links:
.. _klen: https://github.com/klen
.. _Muffin: https://github.com/klen/muffin
.. _MIT license: http://opensource.org/licenses/MIT
Raw data
{
"_id": null,
"home_page": "https://github.com/klen/muffin-session",
"name": "muffin-session",
"maintainer": null,
"docs_url": null,
"requires_python": "<4.0,>=3.9",
"maintainer_email": null,
"keywords": "asyncio, trio, asgi, muffin, web, cookie, sessions, session",
"author": "Kirill Klenov",
"author_email": "horneds@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/fe/a3/2a88de319e48f815e36e89d4a7cf49e926333a238685588e318f644b23e8/muffin_session-2.5.0.tar.gz",
"platform": null,
"description": "Muffin-Session\n##############\n\n.. _description:\n\n**Muffin-Session** -- Cookie-Based HTTP sessions for Muffin_ framework\n\n.. _badges:\n\n.. image:: https://github.com/klen/muffin-session/workflows/tests/badge.svg\n :target: https://github.com/klen/muffin-session/actions\n :alt: Tests Status\n\n.. image:: https://img.shields.io/pypi/v/muffin-session\n :target: https://pypi.org/project/muffin-session/\n :alt: PYPI Version\n\n.. image:: https://img.shields.io/pypi/pyversions/muffin-session\n :target: https://pypi.org/project/muffin-session/\n :alt: Python Versions\n\n.. _contents:\n\n.. contents::\n\nFeatures\n========\n\n* Supports base64 sessions\n* Supports ``JWT`` signed sessions\n* Supports ``Fernet`` encrypted sessions\n\n.. _requirements:\n\nRequirements\n=============\n\n- python >= 3.9\n\n.. _installation:\n\nInstallation\n=============\n\n**Muffin-Session** should be installed using pip: ::\n\n pip install muffin-session\n\n # Optional extras\n pip install muffin-session[fernet]\n\n.. _usage:\n\nUsage\n=====\n\n1. Use it manually\n\n.. code-block:: python\n\n from muffin import Application, ResponseHTML\n from muffin_session import Plugin as Session\n\n # Create Muffin Application\n app = Application('example')\n\n # Initialize the plugin\n # As alternative: session = Session(app, **options)\n session = Session()\n session.setup(app, secret_key='REALLY_SECRET_KEY_FOR_SIGN_YOUR_SESSIONS')\n\n # Use it inside your handlers\n @app.route('/update')\n async def update_session(request):\n ses = session.load_from_request(request)\n ses['var'] = 'value'\n response = ResponseHTML('Session has been updated')\n session.save_to_response(ses, response)\n return res\n\n @app.route('/load')\n async def load_session(request):\n ses = session.load_from_request(request)\n return ses.get('var')\n\n2. Auto manage sessions (with middleware)\n\n.. code-block:: python\n\n from muffin import Application, ResponseHTML\n from muffin_session import Plugin as Session\n\n # Create Muffin Application\n app = Application('example')\n\n # Initialize the plugin\n # As alternative: session = Session(app, **options)\n session = Session()\n session.setup(app, secret_key='REALLY_SECRET_KEY_FOR_SIGN_YOUR_SESSIONS', auto_manage=True)\n\n # Use it inside your handlers\n @app.route('/update')\n async def update_session(request):\n request.session['var'] = 'value'\n return 'Session has been updated'\n\n @app.route('/load')\n async def load_session(request):\n return request.session.get('var')\n\n\nOptions\n-------\n\n=========================== =========================== ===========================\nName Default value Description\n--------------------------- --------------------------- ---------------------------\n**session_type** ``\"jwt\"`` Session type (``base64|jwt|fernet``)\n**secret_key** ``\"InsecureSecret\"`` A secret code to sign sessions\n**auto_manage** ``False`` Load/Save sessions automatically. Session will be loaded into ``request.session``\n**cookie_name** ``\"session\"`` Sessions's cookie name (``session``)\n**cookie_params** Sessions's cookie params (``{'path': '/', 'max-age': None, 'samesite': 'lax', 'secure': False}``)\n**default_user_checker** ``lambda x: True`` A function to check a logged user\n**login_url** ``\"/login\"`` An URL to redirect anonymous users (it may be a function which accept ``Request`` and returns a string)\n=========================== =========================== ===========================\n\n\nYou are able to provide the options when you are initiliazing the plugin:\n\n.. code-block:: python\n\n session.setup(app, secret_key='123455', cookie_name='info')\n\n\nOr setup it inside ``Muffin.Application`` config using the ``SESSION_`` prefix:\n\n.. code-block:: python\n\n SESSION_SECRET_KEY = '123455'\n\n SESSION_COOKIE_NAME = 'info'\n\n``Muffin.Application`` configuration options are case insensitive\n\n\nExamples\n--------\n\n.. code-block:: python\n\n from muffin import Application, ResponseHTML\n from muffin_session import Plugin as Session\n\n # Create Muffin Application\n app = Application('example')\n\n # Initialize the plugin\n # As alternative: session = Session(app, **options)\n session = Session()\n session.setup(app, secret_key='REALLY_SECRET_KEY_FOR_SIGN_YOUR_SESSIONS', auto_manage=True)\n\n @session.user_loader\n async def load_user(ident):\n \"\"\"Define your own user loader. \"\"\"\n return await my_database_load_user_by_id(ident)\n\n @app.register('/session')\n async def get_session(request):\n \"\"\" Load session and return it as JSON. \"\"\"\n return dict(request.session)\n\n @app.register('/admin')\n @session.user_pass(lambda user: user.is_admin)\n async def admin(request):\n \"\"\"Awailable for admins only. \"\"\"\n return 'TOP SECRET'\n\n @app.register('/login')\n async def login(request):\n \"\"\"Save user id into the current session. \"\"\"\n # ...\n session.login(request, current_user.pk)\n return 'OK'\n\n @app.register('/logout')\n async def logout(request):\n \"\"\" Logout user. \"\"\"\n # ...\n session.logout(request)\n return 'OK'\n\n @app.register('/somewhere')\n async def somewhere(request):\n \"\"\" Do something and leave a flash message \"\"\"\n # ...\n request.session.clear()\n return 'OK'\n\n\n.. _bugtracker:\n\nBug tracker\n===========\n\nIf you have any suggestions, bug reports or\nannoyances please report them to the issue tracker\nat https://github.com/klen/muffin-session/issues\n\n.. _contributing:\n\nContributing\n============\n\nDevelopment of Muffin-Session happens at: https://github.com/klen/muffin-session\n\n\nContributors\n=============\n\n* klen_ (Kirill Klenov)\n\n.. _license:\n\nLicense\n========\n\nLicensed under a `MIT license`_.\n\n.. _links:\n\n\n.. _klen: https://github.com/klen\n.. _Muffin: https://github.com/klen/muffin\n\n.. _MIT license: http://opensource.org/licenses/MIT\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Signed Cookie-Based HTTP sessions for the Muffin framework",
"version": "2.5.0",
"project_urls": {
"Homepage": "https://github.com/klen/muffin-session",
"Repository": "https://github.com/klen/muffin-session"
},
"split_keywords": [
"asyncio",
" trio",
" asgi",
" muffin",
" web",
" cookie",
" sessions",
" session"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "52a6f4053885d846828eb0894c9ec566e70d1ca8ff254a4de68897ca7fafdad2",
"md5": "8d9fdc53bc1ccccf1d3cc3501defe3e3",
"sha256": "255e1da8634fe9a68d225911f2ef9a0379ca092f53b5984af3be93c0ead016d3"
},
"downloads": -1,
"filename": "muffin_session-2.5.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "8d9fdc53bc1ccccf1d3cc3501defe3e3",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": "<4.0,>=3.9",
"size": 5725,
"upload_time": "2024-07-31T14:18:40",
"upload_time_iso_8601": "2024-07-31T14:18:40.221047Z",
"url": "https://files.pythonhosted.org/packages/52/a6/f4053885d846828eb0894c9ec566e70d1ca8ff254a4de68897ca7fafdad2/muffin_session-2.5.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "fea32a88de319e48f815e36e89d4a7cf49e926333a238685588e318f644b23e8",
"md5": "d24035253d3a055ecad3dfb7969df86d",
"sha256": "47768dc638da28e4ce169f17ca2021e6712fd2d7c6f6ac563a830db01fdf637f"
},
"downloads": -1,
"filename": "muffin_session-2.5.0.tar.gz",
"has_sig": false,
"md5_digest": "d24035253d3a055ecad3dfb7969df86d",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<4.0,>=3.9",
"size": 5611,
"upload_time": "2024-07-31T14:18:42",
"upload_time_iso_8601": "2024-07-31T14:18:42.301238Z",
"url": "https://files.pythonhosted.org/packages/fe/a3/2a88de319e48f815e36e89d4a7cf49e926333a238685588e318f644b23e8/muffin_session-2.5.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-07-31 14:18:42",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "klen",
"github_project": "muffin-session",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "muffin-session"
}