{ "info": { "author": "Brian Cappello", "author_email": "", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Environment :: Web Environment", "Framework :: Flask", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6" ], "description": "# Flask Unchained\n\n## The best way to build Flask apps\n\n**What is it?**\n\nFlask Unchained is a (*work-in-progress*) **fully integrated, optional-batteries-included web framework built on top of Flask** and its extension ecosystem. Flask Unchained aims to be a fresh, modern take on building web apps and APIs with Flask - while trying to stay as true as possible to the spirit and API of Flask.\n\n**Why?**\n\n- designed to be **easy to start with and even easier to grow** your app\n- **clean, predictable application structure** that encourages good design patterns (no circular imports!)\n- **documented with real-world-usage in mind** (*some sections are still a work-in-progress*)\n- **no integration headaches between supported libraries**; everything just works\n- absolutely **as little boilerplate as possible** (your focus should be on your app, not plumbing!)\n- out-of-the-box support for **testing** with `pytest`\n- **simple and consistent patterns for customizing, extending, and/or overriding almost everything** (e.g. configuration, views/controllers/resources, routes, templates, services, extensions, ...)\n - your customizations are easily distributable as a standalone bundle (Python package), which itself then supports the same patterns for customization, ad infinitum.\n\n**How?**\n\n**Flask Unchained implements the Application Factory Pattern, utilizing a standardized (but configurable) way to organize \"bundles\" of code, such that they become easily distributable, reusable, and customizable across multiple independent projects.** All of the code within bundles is automatically discovered and registered with the app. You can think of bundles as an enhanced replacement for both Flask blueprints and extensions. Bundles are somewhat comparable to Django's \"apps\", but I think you'll find bundles are more powerful and flexible.\n\nThe architecture is inspired by [Symfony](https://symfony.com/), which is enterprise-level awesome, aside from the fact that it isn't Python ;) If you've heard of [Laravel](https://laravel.com/), that framework is built on top of [the Symfony Components](https://symfony.com/components) - with Flask Unchained, the existing Flask/Python ecosystems constitute our \"components\".[*]\n\n[*] Don't like the default choices? Flask Unchained is almost completely customizable. The core architecture offers you the potential to use an entirely different stack of libraries, or swap out only certain components - the power to choose is yours.\n\n## Useful Links\n\n* [Read the Docs](https://flask-unchained.readthedocs.io/en/latest/)\n* [Fork it on GitHub](https://github.com/briancappello/flask-unchained)\n* [Releases on PyPI](https://pypi.org/project/Flask-Unchained/)\n\n### Table of Contents\n\n* [Features](https://github.com/briancappello/flask-unchained#features)\n* [Quickstart](https://github.com/briancappello/flask-unchained#quickstart)\n* [What does it look like?](https://github.com/briancappello/flask-unchained#what-does-it-look-like)\n * [Application Structure and Project Layout](https://github.com/briancappello/flask-unchained#application-structure-and-project-layout)\n * [Bundles](https://github.com/briancappello/flask-unchained#bundles)\n * [Configuration](https://github.com/briancappello/flask-unchained#configuration)\n * [Views](https://github.com/briancappello/flask-unchained#views)\n * [Templates](https://github.com/briancappello/flask-unchained#templates)\n * [Routes](https://github.com/briancappello/flask-unchained#routes)\n * [Commands](https://github.com/briancappello/flask-unchained#commands)\n* [Contributing](https://github.com/briancappello/flask-unchained#contributing)\n* [License](https://github.com/briancappello/flask-unchained#license)\n\n## Features\n\n* Python 3.6+\n* improved class-based views with the [Controller](https://flask-unchained.readthedocs.io/en/latest/api/controller_bundle.html#controller), [Resource](https://flask-unchained.readthedocs.io/en/latest/api/controller_bundle.html#resource), and [ModelResource](https://flask-unchained.readthedocs.io/en/latest/api/api_bundle.html#modelresource) base classes\n* declarative routing\n* dependency injection of services and extensions\n* includes out-of-the-box (mostly optional) integrations with:\n - [SQLAlchemy](https://www.sqlalchemy.org/) and [Flask-Migrate](https://flask-migrate.readthedocs.io/en/latest/) (database ORM and migrations, optional). [SQLAlchemy Unchained](https://sqlalchemy-unchained.readthedocs.io/en/latest/) builds some \"sugar\" on top of SQLAlchemy to make the best ORM in existence even quicker and easier to use:\n - models automatically get a primary key column, unless you define one yourself\n - models are (optionally) automatically timestamped when they are created and updated\n - super-simple polymorphic model class inheritance\n - a unified API for creating, querying, updating and deleting models with the [ModelManager](https://sqlalchemy-unchained.readthedocs.io/en/latest/api.html#modelmanager) service base class\n - [Flask-Login](http://flask-login.readthedocs.io/) (user authentication and sessions management) and [Flask-Principal](https://pythonhosted.org/Flask-Principal/) (user authorization with permissions and roles)\n - both session and token authentication are currently supported\n - includes optional support for registration (with optional required email confirmation before account activation)\n - optional change password and forgot password functionality\n - [Flask-Marshmallow](https://flask-marshmallow.readthedocs.io/en/latest/) (SQLAlchemy model serialization, optional)\n - the API Bundle provides a (*work-in-progress*) RESTful API framework integrating Marshmallow Serializers (aka Schemas) and SQLAlchemy models using [ModelResource](https://flask-unchained.readthedocs.io/en/latest/api/api_bundle.html#modelresource)\n - work-in-progress support for [OpenAPI](https://swagger.io/specification/) (aka Swagger) docs, using [ReDoc](https://github.com/Rebilly/ReDoc) as the frontend\n - [Flask-GraphQL](https://github.com/graphql-python/flask-graphql) (GraphQL support, integrates [Graphene](https://docs.graphene-python.org/en/latest/) with SQLAlchemy, optional)\n - [Flask-WTF](https://flask-wtf.readthedocs.io/en/stable/) (forms and CSRF protection, always enabled)\n - [Flask-Session](https://pythonhosted.org/Flask-Session/) (server-side sessions, optional)\n - [Celery](http://docs.celeryproject.org/en/latest/index.html) (distributed task queue, optional)\n - [Flask-Mail](https://pythonhosted.org/flask-mail/) (email sending support, optional)\n - [Flask-Admin](https://flask-admin.readthedocs.io/en/latest/) (admin interface, optional)\n - [Flask-BabelEx](https://pythonhosted.org/Flask-BabelEx/) (translations, always enabled but optional)\n - [pytest](https://docs.pytest.org/en/latest/) and [factory_boy](https://factoryboy.readthedocs.io/en/latest/) (testing framework)\n\n## Quickstart\n\n```bash\n# (create a virtual environment)\npip install flask-unchained[dev]\nflask new project --prompt\n\n# (answer the questions and `cd` into the new directory)\npip install -r requirements-dev.txt\nflask run\n```\n\n**NOTE:** If you enabled the SQLAlchemy Bundle, then you need to install [alembic](https://github.com/sqlalchemy/alembic) version 1.0.9 or greater.\n\nYou may also need to run migrations before starting the development server:\n\n```bash\nflask db init\nflask db migrate -m 'create initial tables'\nflask db upgrade\n```\n\n## What does it look like?\n\n### Application Structure and Project Layout\n\nUnlike stock Flask, Flask Unchained apps cannot be written in a single file. Instead, Flask Unchained's bundles define a (configurable) folder convention that must be followed for Flask Unchained to be able to correctly discover all of your code. A large application structure might look about like this:\n\n```\n/home/user/dev/project-root\n\u251c\u2500\u2500 app # your app bundle package\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 admins # model admins\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 commands # Click CLI groups/commands\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 extensions # Flask extensions\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 models # SQLAlchemy models\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 fixtures # SQLAlchemy model fixtures (for seeding the dev db)\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 serializers # Marshmallow serializers (aka schemas)\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 services # dependency-injectable services\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 tasks # Celery tasks\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 templates # Jinja2 templates\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 views # Controllers, Resources and views\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 config.py # app config\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 routes.py # declarative routes\n\u251c\u2500\u2500 assets # static assets to be handled by Webpack\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 images\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 scripts\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 styles\n\u251c\u2500\u2500 bundles # custom bundles and/or bundle extensions/overrides\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 security # a customized/extended Security Bundle\n\u2502 \u251c\u2500\u2500 models\n\u2502 \u251c\u2500\u2500 serializers\n\u2502 \u251c\u2500\u2500 services\n\u2502 \u251c\u2500\u2500 templates\n\u2502 \u2514\u2500\u2500 __init__.py\n\u251c\u2500\u2500 db\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 migrations # Alembic (SQLAlchemy) migrations (generated by Flask-Migrate)\n\u251c\u2500\u2500 static # static assets (Webpack compiles to here, and Flask\n\u2502 # serves this folder at /static (by default))\n\u251c\u2500\u2500 templates # the top-level templates folder\n\u251c\u2500\u2500 tests # your pytest tests\n\u251c\u2500\u2500 webpack # Webpack configs\n\u2514\u2500\u2500 unchained_config.py # the Flask Unchained config\n```\n\nTo learn how to build such a larger example application, check out the [official tutorial](https://flask-unchained.readthedocs.io/en/latest/tutorial/index.html).\n\nA minimal application structure looks about like this:\n\n```\n/home/user/dev/hello-flask-unchained\n\u251c\u2500\u2500 app\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 templates\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 site\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 index.html\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 forms.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 models.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 routes.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 services.py\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 views.py\n\u2514\u2500\u2500 unchained_config.py\n```\n\nLet's built it!\n\n```bash\n# (create a virtualenv and activate it)\npip install flask-unchained[dev,sqlalchemy] \\\n && mkdir -p hello-flask-unchained/app && cd hello-flask-unchained \\\n && touch unchained_config.py && cd app \\\n && mkdir -p templates/site && touch templates/site/index.html \\\n && touch __init__.py config.py forms.py models.py routes.py services.py views.py\n```\n\n### Bundles\n\nThe first step is to create an app bundle module in your project root - we're calling ours `app` here - with an `AppBundle` subclass in it:\n\n```python\n# hello-flask-unchained/app/__init__.py\n\nfrom flask_unchained import AppBundle, FlaskUnchained\n\n\nclass App(AppBundle):\n # you only need to subclass AppBundle; everything below is optional. for example, these\n # attributes can be set to customize which bundle module to load from (defaults shown)\n config_module_name = 'config'\n models_module_name = 'models'\n routes_module_name = 'routes'\n services_module_name = 'services'\n\n # these two methods are optional callbacks which the app factory will call\n def before_init_app(self, app: FlaskUnchained):\n pass\n\n def after_init_app(self, app: FlaskUnchained):\n pass\n```\n\n### Configuration\n\nThe configuration for Flask Unchained itself is pretty minimal, for example:\n\n```python\n# hello-flask-unchained/unchained_config.py\n\nimport os\n\nPROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))\n\ndef folder_or_none(folder_name):\n folder = os.path.join(PROJECT_ROOT, folder_name)\n return folder if os.path.exists(folder) else None\n\n# these get passed to the :class:`FlaskUnchained` constructor\nTEMPLATE_FOLDER = folder_or_none('templates')\nSTATIC_FOLDER = folder_or_none('static')\nSTATIC_URL_PATH = '/static' if STATIC_FOLDER else None\n\n# declare which bundles Flask Unchained should load\nBUNDLES = [\n 'flask_unchained.bundles.sqlalchemy',\n 'app', # your app bundle *must* be last\n]\n```\n\nAnd add the required app configuration to your app bundle:\n\n```python\n# hello-flask-unchained/app/config.py\n\nimport os\n\nfrom flask_unchained import AppBundleConfig\n\n\nclass Config(AppBundleConfig):\n SECRET_KEY = os.getenv('FLASK_SECRET_KEY', 'change-me-to-a-secret-key')\n\n\n# the following env-specific config classes are all optional\n\nclass DevConfig(Config):\n pass\n\nclass ProdConfig(Config):\n pass\n\nclass StagingConfig(ProdConfig):\n pass\n```\n\n### Models\n\n```python\n# hello-flask-unchained/app/models.py\n\nfrom flask_unchained.bundles.sqlalchemy import db\n\n\nclass NameSubmission(db.Model):\n class Meta:\n repr = ('id', 'name')\n\n name = db.Column(db.String(128))\n\n # the following primary key and timestamp columns are automatically added to models\n # (if necessary/not customized)\n # id = db.Column(db.Integer, primary_key=True)\n # created_at = db.Column(db.DateTime, server_default=sqlalchemy.func.now())\n # updated_at = db.Column(db.DateTime, server_default=sqlalchemy.func.now(),\n # onupdate=sqlalchemy.func.now())\n```\n\n### Services\n\n```python\n# hello-flask-unchained/app/services.py\n\nfrom flask_unchained.bundles.sqlalchemy import ModelManager\n\nfrom . import models\n\n\nclass NameSubmissionManager(ModelManager):\n class Meta:\n model = models.NameSubmission\n\n def create(self, name, commit: bool = False, **kwargs) -> models.NameSubmission:\n return super().create(name=name, commit=commit, **kwargs)\n```\n\n### Forms\n\n```python\n# hello-flask-unchained/app/forms.py\n\nfrom flask_unchained.bundles.sqlalchemy.forms import ModelForm\n\nfrom . import models\n\n\nclass NameSubmissionForm(ModelForm):\n class Meta:\n model = models.NameSubmission\n```\n\n### Views\n\nA hello world view:\n\n```python\n# hello-flask-unchained/app/views.py\n\nfrom flask_unchained import Controller, route, request, injectable, param_converter\n\nfrom . import forms, models, services\n\n\nclass SiteController(Controller):\n name_submission_manager: services.NameSubmissionManager = injectable\n\n @route('/', methods=['GET', 'POST'])\n @param_converter(id=models.NameSubmission) # converts the `id` query param to a model\n def index(self, name_submission=None):\n form = forms.NameSubmissionForm(request.form)\n if form.validate_on_submit():\n name_submission = self.name_submission_manager.create(name=form.name.data,\n commit=True)\n return self.redirect('index', id=name_submission.id)\n return self.render('index', form=form, name_submission=name_submission)\n```\n\n### Templates\n\n```jinja2\n{# hello-flask-unchained/app/templates/layout.html #}\n\n\n\n \n \n \n {% block title %}Flask Unchained Hello World{% endblock %}\n\n {% block stylesheets %}\n {% endblock stylesheets %}\n \n\n \n {% block body %}\n
\n {% block content %}\n {% endblock content %}\n
\n {% endblock body %}\n\n {% block javascripts %}\n {% endblock javascripts %}\n \n\n```\n\n```jinja2\n{# hello-flask-unchained/app/templates/site/index.html #}\n\n{% extends 'layout.html' %}\n\n{% set name = name_submission.name | default('World') %}\n\n{% block title %}Hello {{ name }}{% endblock %}\n\n{% block content %}\n

Hello {{ name }}

\n\n
\n {{ form.hidden_tag() }}\n {{ form.name.label('Enter your name:') }}\n {{ form.name() }}\n \n
\n{% endblock %}\n```\n\n### Routes\n\nNow we can register the controller with our `routes`:\n\n```python\n# hello-flask-unchained/app/routes.py\n\nfrom flask_unchained import (controller, resource, func, include, prefix,\n get, delete, post, patch, put, rule)\n\nfrom .views import SiteController\n\n\nroutes = lambda: [\n controller(SiteController),\n]\n```\n\n### Commands\n\nAnd run it:\n\n```bash\nflask run\n * Environment: development\n * Debug mode: on\n * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)\n```\n\nNow you should be able to browse to [http://localhost:5000](http://localhost:5000) to view your new site!\n\n## Contributing\n\nContributions are more than welcome! This is a big project with a lot of different things that need doing. There's a TODO file in the project root, or if you've got an idea, open an issue or a PR and let's chat.\n\n## License\n\nMIT\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/briancappello/flask-unchained", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "Flask-Unchained", "package_url": "https://pypi.org/project/Flask-Unchained/", "platform": "", "project_url": "https://pypi.org/project/Flask-Unchained/", "project_urls": { "Homepage": "https://github.com/briancappello/flask-unchained" }, "release_url": "https://pypi.org/project/Flask-Unchained/0.7.9/", "requires_dist": [ "blinker (>=1.4)", "click (>=7.0)", "flask (>=1.0.2)", "flask-babelex (>=0.9.3)", "flask-wtf (>=0.14.2)", "py-meta-utils (>=0.7.6)", "networkx (>=2.1)", "flask-admin (>=1.5.3) ; extra == 'admin'", "sqlalchemy (<1.3) ; extra == 'admin'", "apispec (>=0.39.0) ; extra == 'api'", "flask-marshmallow (>=0.10.0) ; extra == 'api'", "marshmallow (<3.0,>=2.19.2) ; extra == 'api'", "marshmallow-sqlalchemy (<0.17,>=0.16.2) ; extra == 'api'", "celery (>=4.2.1) ; extra == 'celery'", "dill (>=0.2.8.2) ; extra == 'celery'", "coverage (>=4.5.1) ; extra == 'dev'", "factory-boy (>=2.11.1) ; extra == 'dev'", "IPython (>=7.1.1) ; extra == 'dev'", "m2r (>=0.2.1) ; extra == 'dev'", "mock (>=2.0.0) ; extra == 'dev'", "pytest (>=3.9.3) ; extra == 'dev'", "pytest-flask (>=0.14.0) ; extra == 'dev'", "tox (>=3.5.2) ; extra == 'dev'", "IPython (>=7.1.1) ; extra == 'docs'", "PyQt5 (>=5.11.2) ; extra == 'docs'", "qtconsole (>=4.4.0) ; extra == 'docs'", "sphinx (>=1.8.1) ; extra == 'docs'", "sphinx-autobuild (>=0.7.1) ; extra == 'docs'", "sphinx-click (>=1.4.0) ; extra == 'docs'", "sphinx-rtd-theme (>=0.4.2) ; extra == 'docs'", "flask-graphql (>=2.0) ; extra == 'graphene'", "graphene (>=2.1.3) ; extra == 'graphene'", "graphene-sqlalchemy (>=2.1.0) ; extra == 'graphene'", "beautifulsoup4 (>=4.6.3) ; extra == 'mail'", "lxml (>=4.2.4) ; extra == 'mail'", "Flask-OAuthlib (>=0.9.5) ; extra == 'oauth'", "bcrypt (>=3.1.4) ; extra == 'security'", "flask-login (>=0.4.1) ; extra == 'security'", "flask-principal (>=0.4.0) ; extra == 'security'", "itsdangerous (>=1.1.0) ; extra == 'security'", "passlib (>=1.7.1) ; extra == 'security'", "dill (>=0.2.8.2) ; extra == 'session'", "flask-session (>=0.3.1) ; extra == 'session'", "flask-migrate (>=2.2.1) ; extra == 'sqlalchemy'", "flask-sqlalchemy-unchained (>=0.7.3) ; extra == 'sqlalchemy'", "sqlalchemy-unchained (>=0.7.6) ; extra == 'sqlalchemy'" ], "requires_python": ">=3.6", "summary": "The best way to build Flask apps", "version": "0.7.9" }, "last_serial": 5290048, "releases": { "0.1.2": [ { "comment_text": "", "digests": { "md5": "c9d62061074ea3f266e76900159e7829", "sha256": "3f2e2e4725100ebc8ccbf6425b7fd1106cdb1df78b99460c0dc53a861b2a68c7" }, "downloads": -1, "filename": "Flask_Unchained-0.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "c9d62061074ea3f266e76900159e7829", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 29462, "upload_time": "2017-12-27T01:18:07", "url": "https://files.pythonhosted.org/packages/f7/77/ddac527ff0ce7cc17eefa7a8f2e1ea87343b2b401f819f16a912abf6868a/Flask_Unchained-0.1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0f0b7c5e9d447198615a853e7a27cf25", "sha256": "1a215c8582f4d4e75b3d7e3f5fb7da208723c326b3ccea8d29d572d449de31c2" }, "downloads": -1, "filename": "Flask Unchained-0.1.2.tar.gz", "has_sig": false, "md5_digest": "0f0b7c5e9d447198615a853e7a27cf25", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 40348, "upload_time": "2017-12-27T01:18:08", "url": "https://files.pythonhosted.org/packages/dc/7f/112bc0b838b8ce61697f1c748ab01c6256f4e815894eb15b9508d2ae754d/Flask%20Unchained-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "e4890a1944f2b310e9776e1e492cee2f", "sha256": "f2c79bcf3abe5e1e6e7db9e612f6a4c2d0c7065c9f9208258dc041c3d98e8b54" }, "downloads": -1, "filename": "Flask_Unchained-0.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "e4890a1944f2b310e9776e1e492cee2f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 30806, "upload_time": "2018-01-03T12:02:26", "url": "https://files.pythonhosted.org/packages/db/26/ff9832b90820f93497473017764f5780fe388e68f7b044a92ce30bf74e2a/Flask_Unchained-0.1.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ee613287ba0f1ccd4a2a40fc991c8786", "sha256": "7f3af77f263699638b2661033c02df056f306e5c4452d2b32f8fccf74692159c" }, "downloads": -1, "filename": "Flask Unchained-0.1.3.tar.gz", "has_sig": false, "md5_digest": "ee613287ba0f1ccd4a2a40fc991c8786", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 41658, "upload_time": "2018-01-03T12:02:28", "url": "https://files.pythonhosted.org/packages/be/f5/94315ba91c517a5921c17ae9bbb15a9fdff8f018533a8edaa816a7158a7e/Flask%20Unchained-0.1.3.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "52128cdb6dc2e013d1acc8d663edfb7f", "sha256": "4d0b3792e76bb9dce81562bcd4879f749d25c70cbf06a66a252f18c86b9b686a" }, "downloads": -1, "filename": "Flask_Unchained-0.1.4-py3-none-any.whl", "has_sig": false, "md5_digest": "52128cdb6dc2e013d1acc8d663edfb7f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 32152, "upload_time": "2018-01-03T12:29:01", "url": "https://files.pythonhosted.org/packages/b5/5b/27c80cb2e82fae12fbd6d2bd477b038ff11d69a7e8d3767f27f6f86181fa/Flask_Unchained-0.1.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9f4358ab3307a623101497dcce8507c0", "sha256": "aa163f338bab6de94d2d1c3eea8f718e4e26f4128197239ed40281110ea4c5be" }, "downloads": -1, "filename": "Flask Unchained-0.1.4.tar.gz", "has_sig": false, "md5_digest": "9f4358ab3307a623101497dcce8507c0", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 41554, "upload_time": "2018-01-03T12:29:03", "url": "https://files.pythonhosted.org/packages/a2/48/4f593228cb73d5e5c2b4782a7c23b309a33d3ef42845061ac0edc5721ac4/Flask%20Unchained-0.1.4.tar.gz" } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "0970adffe5918c1e89b3b15d63de938a", "sha256": "7759b452eba08ce26427bda6b5b6e46d27bd3cf1e06ac0f4449cf0072753971f" }, "downloads": -1, "filename": "Flask_Unchained-0.1.5-py3-none-any.whl", "has_sig": false, "md5_digest": "0970adffe5918c1e89b3b15d63de938a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 32159, "upload_time": "2018-01-03T13:02:29", "url": "https://files.pythonhosted.org/packages/1c/02/592fb5f27216af30ad5a8500ab4c7b6b03cd42b04a2a7962d629ff8f4383/Flask_Unchained-0.1.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "91a7e64ab0bc79c5098bd5c4ae7c9e20", "sha256": "b882d0a2d8b10ef98a996d6251af2344ac48d23f10d8bdc5ec29dc175cd45341" }, "downloads": -1, "filename": "Flask Unchained-0.1.5.tar.gz", "has_sig": false, "md5_digest": "91a7e64ab0bc79c5098bd5c4ae7c9e20", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 41554, "upload_time": "2018-01-03T13:02:32", "url": "https://files.pythonhosted.org/packages/39/ef/dfc932e604a603c1bda097324c9122c16eea909a55abb68861c6d0d700b1/Flask%20Unchained-0.1.5.tar.gz" } ], "0.1.6": [ { "comment_text": "", "digests": { "md5": "71a9a073335c9061b97814dab6e00a78", "sha256": "62d11475bd20a6209ea09930dc29309def596f775c03adef31ed57285cd1c34b" }, "downloads": -1, "filename": "Flask_Unchained-0.1.6-py3-none-any.whl", "has_sig": false, "md5_digest": "71a9a073335c9061b97814dab6e00a78", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 45222, "upload_time": "2018-03-30T22:53:51", "url": "https://files.pythonhosted.org/packages/f6/fd/0132a89c1d51361cf6026b09aad9673a111ed4a193fb35e7349b9781966f/Flask_Unchained-0.1.6-py3-none-any.whl" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "3f7836cdda5e2529e52d9f57cd9f3eed", "sha256": "7657984b643dc7ae40a51c702d49fc314435fc5c965b2fb0e6e81a6b315e3257" }, "downloads": -1, "filename": "Flask_Unchained-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "3f7836cdda5e2529e52d9f57cd9f3eed", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 48184, "upload_time": "2018-04-06T18:37:19", "url": "https://files.pythonhosted.org/packages/ce/e4/e2eb628a97328f0d59ea1e0edc7754b967a78a236924dc8c8e1bf53c3d2e/Flask_Unchained-0.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d08ac60858d8f452965ca236a46c06ad", "sha256": "93fa7d0b55eb4cfdfb6796e11e7254addbdd0f3712c70af7d39d5cae065df97e" }, "downloads": -1, "filename": "Flask Unchained-0.2.0.tar.gz", "has_sig": false, "md5_digest": "d08ac60858d8f452965ca236a46c06ad", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 36292, "upload_time": "2018-04-06T18:37:20", "url": "https://files.pythonhosted.org/packages/ef/31/7d89711cbdf57629c56dc84f6ddb74135347407e84c1bd0a33a491f668c7/Flask%20Unchained-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "033c97e0824f778b94a88bbf1d8335f5", "sha256": "5ddbadf459c0e7f9f3f27fe320bb1441603ea96eb38d79826d9709dd3c46c684" }, "downloads": -1, "filename": "Flask_Unchained-0.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "033c97e0824f778b94a88bbf1d8335f5", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 48254, "upload_time": "2018-04-08T15:11:55", "url": "https://files.pythonhosted.org/packages/5a/80/08d908d5662a0f6dbb61004824ed1e21eeeeab4822a3649f9f45231310d7/Flask_Unchained-0.2.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ddd963215103de6e95dc46228c2f19ab", "sha256": "331d66bfc1874f49a6a7998ab9b7df1bae0d8a74174a9ef7214f719063987837" }, "downloads": -1, "filename": "Flask Unchained-0.2.1.tar.gz", "has_sig": false, "md5_digest": "ddd963215103de6e95dc46228c2f19ab", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 36594, "upload_time": "2018-04-08T15:11:57", "url": "https://files.pythonhosted.org/packages/b2/e4/1bf824c1d695c144adb489a11a546e153117709c5a36ae7def66e019b83f/Flask%20Unchained-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "384b3bb96cd1e6478f53ffc16d07035f", "sha256": "f642fe792c675acfb0cfbb62bf05839676eff6edf1b1a657fd45547fd03911d4" }, "downloads": -1, "filename": "Flask_Unchained-0.2.2-py3-none-any.whl", "has_sig": false, "md5_digest": "384b3bb96cd1e6478f53ffc16d07035f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 48260, "upload_time": "2018-04-09T00:43:57", "url": "https://files.pythonhosted.org/packages/1c/2b/2211450aac333379a7c89e3a98ec7ad743cf6008814ffbbaf4f7ecf2469b/Flask_Unchained-0.2.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "05fab214025805e7c95d72ce2c330291", "sha256": "7704629dcd47ac230138cb27a15ecac2fdd0b7b6f72a40d0df779fdb12c82eb6" }, "downloads": -1, "filename": "Flask Unchained-0.2.2.tar.gz", "has_sig": false, "md5_digest": "05fab214025805e7c95d72ce2c330291", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 36635, "upload_time": "2018-04-09T00:43:58", "url": "https://files.pythonhosted.org/packages/f9/53/87515c7890d8441cab669477aa624741d52402ade051dcb7ec2cb3941ca2/Flask%20Unchained-0.2.2.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "464282b27f1150d6dcc9b55a4693905f", "sha256": "cae2234572f283ace805aee3ae7fe7cf6d5fc03ced6e2b1f33ef771e84a8a087" }, "downloads": -1, "filename": "Flask_Unchained-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "464282b27f1150d6dcc9b55a4693905f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 100572, "upload_time": "2018-07-15T02:06:38", "url": "https://files.pythonhosted.org/packages/83/1e/e918572d34878ec96b92c5787a4537ead6f95bc86c864412b01f33d9a6fa/Flask_Unchained-0.3.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "efc77b2bc4bde3ad58abcf99dd201fc7", "sha256": "0276dc5798933f5a2c06c8d2eae26fbfa055f95c1c36a6c7286d39b89ee4b8f3" }, "downloads": -1, "filename": "Flask Unchained-0.3.0.tar.gz", "has_sig": false, "md5_digest": "efc77b2bc4bde3ad58abcf99dd201fc7", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 69786, "upload_time": "2018-07-15T02:06:39", "url": "https://files.pythonhosted.org/packages/8f/30/ea97d1fa6d0a9943816153bdbc93394b0d662d79f200ed08d9b1bc94c79d/Flask%20Unchained-0.3.0.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "e96b45917c406f1bb1c8e08d57106fe1", "sha256": "638d6563137b3bd1542988658ca7670a30d81851258b02f8c76fa5e02a23dce2" }, "downloads": -1, "filename": "Flask_Unchained-0.3.1-py3-none-any.whl", "has_sig": false, "md5_digest": "e96b45917c406f1bb1c8e08d57106fe1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 101031, "upload_time": "2018-07-16T22:37:29", "url": "https://files.pythonhosted.org/packages/76/05/cd68c8f326f5f1bc7826631ce6ec51cef6624f65131cb9ba2404e5f72fcf/Flask_Unchained-0.3.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "48d60903b958118dad97975e1853103b", "sha256": "076327262ec261ffb7bd5f98ce3823c33b4aa3ac9a6dbcf3fa1117c5d76cb8f9" }, "downloads": -1, "filename": "Flask Unchained-0.3.1.tar.gz", "has_sig": false, "md5_digest": "48d60903b958118dad97975e1853103b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 70301, "upload_time": "2018-07-16T22:37:32", "url": "https://files.pythonhosted.org/packages/21/73/bdeef4e364dc578d6a2d88c9479a6389fd294cb62f1eebea3da99ac7d083/Flask%20Unchained-0.3.1.tar.gz" } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "3caf82cfd5b970b7a137c9de2dd48355", "sha256": "c87a9ec8b427d58054a4c8156606847fa6515cac34309b5613104b10b2c77c4d" }, "downloads": -1, "filename": "Flask_Unchained-0.3.2-py3-none-any.whl", "has_sig": false, "md5_digest": "3caf82cfd5b970b7a137c9de2dd48355", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 102830, "upload_time": "2018-07-16T23:54:46", "url": "https://files.pythonhosted.org/packages/be/29/9dba697189ef4fe8112698a5da79243cbf6c7d4d473439d53655ab499d78/Flask_Unchained-0.3.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ace1cff17e8b1e4c4fba667a4be03cb2", "sha256": "061feb51f032ebef9fd8aefc47d3573106440e90e05b199bcfa26a0f440bc58c" }, "downloads": -1, "filename": "Flask Unchained-0.3.2.tar.gz", "has_sig": false, "md5_digest": "ace1cff17e8b1e4c4fba667a4be03cb2", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 69482, "upload_time": "2018-07-16T23:54:48", "url": "https://files.pythonhosted.org/packages/6d/1e/838f727f38dd93a60efaa0eb4997598343541fd6bcff89fcdc0e18fbb3f3/Flask%20Unchained-0.3.2.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "16a61d64ce2a6b6224cc992c27bcf86b", "sha256": "f76e4378aa5e845b457edf8eec0eff88a025e21dc5d6c59887d4471098f343c4" }, "downloads": -1, "filename": "Flask_Unchained-0.4.0-py3-none-any.whl", "has_sig": false, "md5_digest": "16a61d64ce2a6b6224cc992c27bcf86b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 101267, "upload_time": "2018-07-21T01:24:13", "url": "https://files.pythonhosted.org/packages/9f/f6/fa431b40f0e0f0a77771848621696186d8434f02fbfff74e281353dd663f/Flask_Unchained-0.4.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6a821ec90063fe41aef6048e77c4bb5d", "sha256": "504570c86ced5c16b53578d46e990dda4c1eaa860abe672cfa249e32b974fec2" }, "downloads": -1, "filename": "Flask Unchained-0.4.0.tar.gz", "has_sig": false, "md5_digest": "6a821ec90063fe41aef6048e77c4bb5d", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 69791, "upload_time": "2018-07-21T01:24:15", "url": "https://files.pythonhosted.org/packages/d7/bf/7794b7a46881808ae0274b330f040164f509349806230d9f60eb7a3158e8/Flask%20Unchained-0.4.0.tar.gz" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "81d57ed3a495043d8b951be45b520af4", "sha256": "ee95114b6aaa019addc84bf24537c4e4864281dad34973c79e700857b1c4eba6" }, "downloads": -1, "filename": "Flask_Unchained-0.4.1-py3-none-any.whl", "has_sig": false, "md5_digest": "81d57ed3a495043d8b951be45b520af4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 101383, "upload_time": "2018-07-21T02:07:15", "url": "https://files.pythonhosted.org/packages/2e/5c/c64fb3d910a8d9b1aefdbcf2d58407fa946de655c8c2b737c55257e59099/Flask_Unchained-0.4.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "921d0f2fdbc314edf8e667dc5d490478", "sha256": "608ba395fe232aec7d388c9c706b3f4e0651e4c496ee2e2b2406ba27c0548311" }, "downloads": -1, "filename": "Flask Unchained-0.4.1.tar.gz", "has_sig": false, "md5_digest": "921d0f2fdbc314edf8e667dc5d490478", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 69897, "upload_time": "2018-07-21T02:07:17", "url": "https://files.pythonhosted.org/packages/cf/50/a6b6b579f77787e9f5c44df9303cf039fa953adcb0bc9ccb4429ab928d8c/Flask%20Unchained-0.4.1.tar.gz" } ], "0.4.2": [ { "comment_text": "", "digests": { "md5": "1401cda004b559cfad5d5e30cbb5aaf9", "sha256": "3f9dff68f782ab4ad29ec02def5b20d7ee59e541d1ee6dcb19ea61eb8435ee4d" }, "downloads": -1, "filename": "Flask_Unchained-0.4.2-py3-none-any.whl", "has_sig": false, "md5_digest": "1401cda004b559cfad5d5e30cbb5aaf9", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 101443, "upload_time": "2018-07-21T22:32:24", "url": "https://files.pythonhosted.org/packages/6d/8d/03229df6b50effaaf228b2274f015184cbc67a4c355bd03070378ff5251b/Flask_Unchained-0.4.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0ab6748fcce61bc8587b875534267420", "sha256": "00084f78690236fafb1d028e1678f2d7b2f0a8fc277acc76dc593a1895c6f2e2" }, "downloads": -1, "filename": "Flask Unchained-0.4.2.tar.gz", "has_sig": false, "md5_digest": "0ab6748fcce61bc8587b875534267420", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 69962, "upload_time": "2018-07-21T22:32:26", "url": "https://files.pythonhosted.org/packages/24/3a/7a6e047b1a8eeaed874d33f6a4825f86248b588da23172fbec6c8c46402b/Flask%20Unchained-0.4.2.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "10391bf8be1c5549a8fb966c5cb2ad81", "sha256": "cdc7a20c4d1cda1528262638c736eea26ba287586687b5289067727b2e4eb87c" }, "downloads": -1, "filename": "Flask_Unchained-0.5.0-py3-none-any.whl", "has_sig": false, "md5_digest": "10391bf8be1c5549a8fb966c5cb2ad81", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 209432, "upload_time": "2018-07-25T22:13:09", "url": "https://files.pythonhosted.org/packages/b9/17/45dbf9cc46fdf03538dd6705524b89bcf7402860a7a71079527caac3936a/Flask_Unchained-0.5.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "54c0a6a332c326e3eef50bea81d50498", "sha256": "fe1b169558a5a2576036563d5cd71ce82a09baa4882bf7192de0fa6361b6ced5" }, "downloads": -1, "filename": "Flask Unchained-0.5.0.tar.gz", "has_sig": false, "md5_digest": "54c0a6a332c326e3eef50bea81d50498", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 136464, "upload_time": "2018-07-25T22:13:11", "url": "https://files.pythonhosted.org/packages/75/cc/87824d35f92159592a13561782de6598a172824550a3514abbad020576b1/Flask%20Unchained-0.5.0.tar.gz" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "6f75281cf395125433f940248871ae29", "sha256": "1694c4fe6ddc7b809eaafeb6509da1c0e0a58fa5c9d81122efe2ca0929fd1c41" }, "downloads": -1, "filename": "Flask_Unchained-0.5.1-py3-none-any.whl", "has_sig": false, "md5_digest": "6f75281cf395125433f940248871ae29", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 219056, "upload_time": "2018-07-25T23:30:22", "url": "https://files.pythonhosted.org/packages/4c/e2/d26e077577131edf5224c0f7f458cea6823543d89073112cebe42fbb660b/Flask_Unchained-0.5.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "35948b1487b15b51ce6527cbddc0fe1b", "sha256": "066cfa139ec2cde41543d739eda518aa7034a070c28d5f6b67202ed2c32544ca" }, "downloads": -1, "filename": "Flask Unchained-0.5.1.tar.gz", "has_sig": false, "md5_digest": "35948b1487b15b51ce6527cbddc0fe1b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 142237, "upload_time": "2018-07-25T23:30:25", "url": "https://files.pythonhosted.org/packages/c8/d9/cd48cfffb631b49f31b89eebabb5b2184273b9e910267594afe2378c1a8f/Flask%20Unchained-0.5.1.tar.gz" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "3ac3a289ef0925e395ab0b438474513a", "sha256": "b82bc3be07adeb1c63c06f75c1920b43666160e9c866fccb9e0df7a6b0dc2400" }, "downloads": -1, "filename": "Flask_Unchained-0.6.0-py3-none-any.whl", "has_sig": false, "md5_digest": "3ac3a289ef0925e395ab0b438474513a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 310967, "upload_time": "2018-10-09T23:06:38", "url": "https://files.pythonhosted.org/packages/da/ce/a0d908908947973c458d08bf9a6dcb7df53bc9909876be56b2609d2c81d4/Flask_Unchained-0.6.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "cc32251900567413ed8cfe88f4299f38", "sha256": "e43b89a27ee619168f1691d9eee7d7db12d357221b032ab9557ed71a447fe047" }, "downloads": -1, "filename": "Flask Unchained-0.6.0.tar.gz", "has_sig": false, "md5_digest": "cc32251900567413ed8cfe88f4299f38", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 209460, "upload_time": "2018-10-09T23:06:42", "url": "https://files.pythonhosted.org/packages/cd/2c/da24baa9ae8b7cab87b6b5c531912b542c5dc9e859d2b7212837527d60a2/Flask%20Unchained-0.6.0.tar.gz" } ], "0.6.1": [ { "comment_text": "", "digests": { "md5": "dbdd1e6e416e6206a1154de809348f93", "sha256": "d6dec3abb692e64d33607a868d76071502a15951236c9537930ae8df87b410e9" }, "downloads": -1, "filename": "Flask_Unchained-0.6.1-py3-none-any.whl", "has_sig": false, "md5_digest": "dbdd1e6e416e6206a1154de809348f93", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 310962, "upload_time": "2018-10-09T23:23:10", "url": "https://files.pythonhosted.org/packages/2d/be/8d4593f26d8073a39f0ce8cc66e6d8d01b16031e668a10f31261d243041b/Flask_Unchained-0.6.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ff5d638fe5fa8ed0b896e6f8f1a700c1", "sha256": "ae0140a605ddc12c3440c12778c959f37f531ef86f4398b95f3a9b5b8a79deb6" }, "downloads": -1, "filename": "Flask Unchained-0.6.1.tar.gz", "has_sig": false, "md5_digest": "ff5d638fe5fa8ed0b896e6f8f1a700c1", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 281331, "upload_time": "2018-10-09T23:23:13", "url": "https://files.pythonhosted.org/packages/7c/c0/11352f8a4a884287b529b3cbfb9206086ee201200448f775be0ac255d522/Flask%20Unchained-0.6.1.tar.gz" } ], "0.6.2": [ { "comment_text": "", "digests": { "md5": "9cfd151d040ccf92cdbe341167102000", "sha256": "f0156ea7814ec074e5854f09524a9fe6a3e4e17e4b26e7a00988e5ca3dcf2677" }, "downloads": -1, "filename": "Flask_Unchained-0.6.2-py3-none-any.whl", "has_sig": false, "md5_digest": "9cfd151d040ccf92cdbe341167102000", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 393591, "upload_time": "2018-10-09T23:50:09", "url": "https://files.pythonhosted.org/packages/6f/b0/6a4050f1acbab343832ad0e7286919d53ea70a850889f8df78df1f8368b9/Flask_Unchained-0.6.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7a34b6fd365a1dabbcf48492d0068c6d", "sha256": "53c4e939c7e960c5fdc44720c39971b77ee4fafc184fe76718fdfe00b4cae385" }, "downloads": -1, "filename": "Flask Unchained-0.6.2.tar.gz", "has_sig": false, "md5_digest": "7a34b6fd365a1dabbcf48492d0068c6d", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 281508, "upload_time": "2018-10-09T23:50:11", "url": "https://files.pythonhosted.org/packages/fc/70/fc5dba6164cf199fed8b621976acccd2a000506e22912402f9b850139873/Flask%20Unchained-0.6.2.tar.gz" } ], "0.6.3": [ { "comment_text": "", "digests": { "md5": "ab5a7a2f0f123137f5042de40d2ab819", "sha256": "63d1f67ce1782f961c01aa56acf43a30f1215159ec13697359a97776e587d57a" }, "downloads": -1, "filename": "Flask_Unchained-0.6.3-py3-none-any.whl", "has_sig": false, "md5_digest": "ab5a7a2f0f123137f5042de40d2ab819", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 393729, "upload_time": "2018-10-10T00:07:32", "url": "https://files.pythonhosted.org/packages/d4/dc/e3c37a34be4aa51f5b34d21e1fbe2d6743a3520c3172e3082454a88d0814/Flask_Unchained-0.6.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "efa72cd2457bc6e574b9e887be57d7f0", "sha256": "98266250cd5914f6215e3793f6cdb1afcc7ef61e49ff9b7c7e02e1003cff69d8" }, "downloads": -1, "filename": "Flask Unchained-0.6.3.tar.gz", "has_sig": false, "md5_digest": "efa72cd2457bc6e574b9e887be57d7f0", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 281726, "upload_time": "2018-10-10T00:07:34", "url": "https://files.pythonhosted.org/packages/49/8d/8736c4942119642f831f1fefa272ed9c990c5b0f8f3d172e362158b6789e/Flask%20Unchained-0.6.3.tar.gz" } ], "0.6.4": [ { "comment_text": "", "digests": { "md5": "98efd66b4038d8a45e86a32c9ca2716e", "sha256": "a26602bd76a6be6537fe72e294937007232c080f281490d1c3c96dc9ad19a47c" }, "downloads": -1, "filename": "Flask_Unchained-0.6.4-py3-none-any.whl", "has_sig": false, "md5_digest": "98efd66b4038d8a45e86a32c9ca2716e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 1444556, "upload_time": "2018-10-10T00:20:14", "url": "https://files.pythonhosted.org/packages/56/3a/738557893c411c34117838e9561d2515f552ac7cc7e8e7de4dc547d56375/Flask_Unchained-0.6.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "fad2d5cbf76eac2f0f9fb96ef45277cc", "sha256": "f68d8cb87467ca5c9b3bc4c0599f2a5cb660d2fb0602e969ede3d910a6da720b" }, "downloads": -1, "filename": "Flask Unchained-0.6.4.tar.gz", "has_sig": false, "md5_digest": "fad2d5cbf76eac2f0f9fb96ef45277cc", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 605005, "upload_time": "2018-10-10T00:20:17", "url": "https://files.pythonhosted.org/packages/16/e1/71535e0fddd988ba32d59b0b80a962885beb807f58fe99f56df08ac92117/Flask%20Unchained-0.6.4.tar.gz" } ], "0.6.5": [ { "comment_text": "", "digests": { "md5": "198c97d58c503a8ef91165869b291d91", "sha256": "f8e246fc195c52b2c5ca577f5b5855850325760fe890bdd850354a47ecd4a432" }, "downloads": -1, "filename": "Flask_Unchained-0.6.5-py3-none-any.whl", "has_sig": false, "md5_digest": "198c97d58c503a8ef91165869b291d91", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 399238, "upload_time": "2018-10-10T00:24:58", "url": "https://files.pythonhosted.org/packages/2a/e3/d7850db48e73e420efe43afd2d411ef899e7227e903f45fbe1680a25b23c/Flask_Unchained-0.6.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f1538e66424cd2a026f74d831184155c", "sha256": "aaf54552504f5a14158061b12996f9c8d1d582d5c8ede509f81ad935eb50799a" }, "downloads": -1, "filename": "Flask Unchained-0.6.5.tar.gz", "has_sig": false, "md5_digest": "f1538e66424cd2a026f74d831184155c", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 284332, "upload_time": "2018-10-10T00:25:01", "url": "https://files.pythonhosted.org/packages/46/70/f4cf02571b53f3c18e03c0feeefd08e56b2b61ff56e910a05f896c2d04e7/Flask%20Unchained-0.6.5.tar.gz" } ], "0.6.6": [ { "comment_text": "", "digests": { "md5": "009588b1cb158abc0b45f22884ab8e0e", "sha256": "c6d2370105404949f150ba88c9111f1b96530ab0787027f7f8ee893495a04951" }, "downloads": -1, "filename": "Flask_Unchained-0.6.6-py3-none-any.whl", "has_sig": false, "md5_digest": "009588b1cb158abc0b45f22884ab8e0e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 399324, "upload_time": "2018-10-10T00:32:48", "url": "https://files.pythonhosted.org/packages/41/3e/ef90fdbc5f01469310855a50475b71ef6e7e51b98602e06c55569a498aaf/Flask_Unchained-0.6.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "81cd47746eb69bea7862e336051aedd2", "sha256": "a1474ee347860e3ec371cfbe588ae6fb321929305d9106e8fa35e10b9cf8a518" }, "downloads": -1, "filename": "Flask Unchained-0.6.6.tar.gz", "has_sig": false, "md5_digest": "81cd47746eb69bea7862e336051aedd2", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 284439, "upload_time": "2018-10-10T00:32:50", "url": "https://files.pythonhosted.org/packages/25/cd/8c3db415832d485501a74bdcc4b92add2a8de604e4fa7db885de815b35df/Flask%20Unchained-0.6.6.tar.gz" } ], "0.7.0": [ { "comment_text": "", "digests": { "md5": "154c6dc30e21fb81bfae7d008532a646", "sha256": "2def4e49d95a6d6b3684da53d52524e3940fc8468e64aa2ac19f053ce4adeb36" }, "downloads": -1, "filename": "Flask_Unchained-0.7.0-py3-none-any.whl", "has_sig": false, "md5_digest": "154c6dc30e21fb81bfae7d008532a646", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 420241, "upload_time": "2019-01-31T00:36:10", "url": "https://files.pythonhosted.org/packages/78/4d/d8b4592803ad66147e75173ce297811bcdd0d9fcfa1b07f0a66de05b6f72/Flask_Unchained-0.7.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f3136cbe191972f3d127982599e2ef29", "sha256": "d5f1f07692d94f5c0ec8e7c8f9f0f13bcccbe792b35c0e562d2912637f3f20b3" }, "downloads": -1, "filename": "Flask Unchained-0.7.0.tar.gz", "has_sig": false, "md5_digest": "f3136cbe191972f3d127982599e2ef29", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 296684, "upload_time": "2019-01-31T00:36:13", "url": "https://files.pythonhosted.org/packages/8b/0f/d0f42f6fe224b69fe40c7e42e59b59d9e28c4de1a671229d1ee8193d2d6c/Flask%20Unchained-0.7.0.tar.gz" } ], "0.7.1": [ { "comment_text": "", "digests": { "md5": "23e249bb32bfe60749e65c99286da930", "sha256": "31eeb71b8a40de876aa75f38b8b39395f9570267e4a6cadd26971aa7c873973b" }, "downloads": -1, "filename": "Flask_Unchained-0.7.1-py3-none-any.whl", "has_sig": false, "md5_digest": "23e249bb32bfe60749e65c99286da930", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 420588, "upload_time": "2019-02-04T19:32:44", "url": "https://files.pythonhosted.org/packages/a0/c8/a5d7133f213aa91f619eb89ae4f9f78aa2d7a5bea73a22022dda9a11c213/Flask_Unchained-0.7.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e0eac6c10ae89db254cb9497b651612c", "sha256": "18dc7afb2f9eba823a8129ee3bfe3e1faeef995e39c9fdfd964627216709e21d" }, "downloads": -1, "filename": "Flask Unchained-0.7.1.tar.gz", "has_sig": false, "md5_digest": "e0eac6c10ae89db254cb9497b651612c", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 297160, "upload_time": "2019-02-04T19:32:47", "url": "https://files.pythonhosted.org/packages/8e/ba/01f00d3eb9c800dbec1c3d1c8dbb95a83dc66cfdd8809bfa5d9268bbe511/Flask%20Unchained-0.7.1.tar.gz" } ], "0.7.2": [ { "comment_text": "", "digests": { "md5": "3e57e66571a1faba6a957f9daa62f483", "sha256": "919a72423345186ba29557097edb144aca41862570140826508f00109b69d4cb" }, "downloads": -1, "filename": "Flask_Unchained-0.7.2-py3-none-any.whl", "has_sig": false, "md5_digest": "3e57e66571a1faba6a957f9daa62f483", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 421380, "upload_time": "2019-02-26T05:13:20", "url": "https://files.pythonhosted.org/packages/4a/1d/d4fcd297d2547f5d80fe87296cb5038617260e0ac4e966ef13c8bc0087b3/Flask_Unchained-0.7.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e89367279d08470badc0528d6845cb8d", "sha256": "dd0ac8c5d74e1780e52eb2bb33997ecc6217cb00128b06db64a5319570247bfb" }, "downloads": -1, "filename": "Flask-Unchained-0.7.2.tar.gz", "has_sig": false, "md5_digest": "e89367279d08470badc0528d6845cb8d", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 297152, "upload_time": "2019-02-26T05:13:23", "url": "https://files.pythonhosted.org/packages/b4/e9/6ed20aacdeb15ede73c78fa567bff1e93e33a674cd6fdca82be84b30d07b/Flask-Unchained-0.7.2.tar.gz" } ], "0.7.3": [ { "comment_text": "", "digests": { "md5": "dbc892da458fbacaa47b42d7355f461e", "sha256": "80452fea716a972e940dee7a36fdc4a4a1cd41581622240d8dad8e0ceb3c76a5" }, "downloads": -1, "filename": "Flask_Unchained-0.7.3-py3-none-any.whl", "has_sig": false, "md5_digest": "dbc892da458fbacaa47b42d7355f461e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 420602, "upload_time": "2019-02-26T21:55:08", "url": "https://files.pythonhosted.org/packages/8d/5a/a0cfb295d0b7ee201522dce8fbccdcd1f04171d8779eacebf7b095173dc9/Flask_Unchained-0.7.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "58eddf81b29b007f6c5c14e3d1646af1", "sha256": "7dd586a9e470500c37c2664606b7d4a9c8da5b63d0d03dcaa7904d17ba2fffdc" }, "downloads": -1, "filename": "Flask-Unchained-0.7.3.tar.gz", "has_sig": false, "md5_digest": "58eddf81b29b007f6c5c14e3d1646af1", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 297306, "upload_time": "2019-02-26T21:55:11", "url": "https://files.pythonhosted.org/packages/2c/d2/9ccf027161661ed89f9bb611f6e65eaaafde150b933445cc1e17edc55d40/Flask-Unchained-0.7.3.tar.gz" } ], "0.7.4": [ { "comment_text": "", "digests": { "md5": "00d58a120bca9996474d2038a33eddc3", "sha256": "da595f03d7f22e695928dc93326febf69f9c73f5543393546ee690cbde7132ab" }, "downloads": -1, "filename": "Flask_Unchained-0.7.4-py3-none-any.whl", "has_sig": false, "md5_digest": "00d58a120bca9996474d2038a33eddc3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 420033, "upload_time": "2019-03-17T21:16:44", "url": "https://files.pythonhosted.org/packages/22/b3/e749423192a56fd4976929dab86cd2557600aeda2837703d44c9b32b6617/Flask_Unchained-0.7.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "fad8324a155b32bbc4691061a9cba91e", "sha256": "c75b3162c75c536534b6027b8c49a783f0c1ef3f2724e4f59f3437c49598a27a" }, "downloads": -1, "filename": "Flask-Unchained-0.7.4.tar.gz", "has_sig": false, "md5_digest": "fad8324a155b32bbc4691061a9cba91e", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 295358, "upload_time": "2019-03-17T21:16:47", "url": "https://files.pythonhosted.org/packages/d3/9c/bf5b5fe8fd6204c8c488d51d498ad858ff2cef35343828f17eb9242eca95/Flask-Unchained-0.7.4.tar.gz" } ], "0.7.5": [ { "comment_text": "", "digests": { "md5": "e7c42aa848435d244fcbb6f1f513af3f", "sha256": "cc121c879d3e9839eac33ecf0cd5d23702807a672f8bde87df93ac9d77b56076" }, "downloads": -1, "filename": "Flask_Unchained-0.7.5-py3-none-any.whl", "has_sig": false, "md5_digest": "e7c42aa848435d244fcbb6f1f513af3f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 420022, "upload_time": "2019-03-25T03:05:49", "url": "https://files.pythonhosted.org/packages/29/12/9a14dbdf71ee10a62672b4ed00e2f742b15bebf835b64466fee9ffad8829/Flask_Unchained-0.7.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d4838f5b216559654907a4b289f980f7", "sha256": "edd41a388f930c4462d71b08f4f9d33efd6040b823a87cda02cc1700394a092e" }, "downloads": -1, "filename": "Flask-Unchained-0.7.5.tar.gz", "has_sig": false, "md5_digest": "d4838f5b216559654907a4b289f980f7", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 295363, "upload_time": "2019-03-25T03:05:52", "url": "https://files.pythonhosted.org/packages/ce/87/3a3768df9b22c5d4e4555b7bc62ad910a58f7c405ff371d323c8dea34bc1/Flask-Unchained-0.7.5.tar.gz" } ], "0.7.6": [ { "comment_text": "", "digests": { "md5": "f60612dc287f51e278166386e5f8b249", "sha256": "13791e72b160d7f387e828e7b5540fba8e5f5ee3c79b8546773951eeb6bc1839" }, "downloads": -1, "filename": "Flask_Unchained-0.7.6-py3-none-any.whl", "has_sig": false, "md5_digest": "f60612dc287f51e278166386e5f8b249", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 419979, "upload_time": "2019-03-25T03:33:42", "url": "https://files.pythonhosted.org/packages/70/77/6992b70d70d75b96898d012108eaaa6a8a1cc361762f0a07c1625b1a8728/Flask_Unchained-0.7.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3d3b3752df662929ec5d3622aa427899", "sha256": "960d8b223c16171b668ea3ea8809c8d119ef5f20e25436cef19a78019133b35b" }, "downloads": -1, "filename": "Flask-Unchained-0.7.6.tar.gz", "has_sig": false, "md5_digest": "3d3b3752df662929ec5d3622aa427899", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 295345, "upload_time": "2019-03-25T03:33:44", "url": "https://files.pythonhosted.org/packages/b0/3a/e91c6a18c6a117792af26bb428f094cfdde0a1e16aaf020e416e30901cce/Flask-Unchained-0.7.6.tar.gz" } ], "0.7.7": [ { "comment_text": "", "digests": { "md5": "787847811b07d310c71cde970318182c", "sha256": "9fab5f883aec126aece01a463315a6baedc4b9f532b8d2a90b1c4bf99b9656d2" }, "downloads": -1, "filename": "Flask_Unchained-0.7.7-py3-none-any.whl", "has_sig": false, "md5_digest": "787847811b07d310c71cde970318182c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 422439, "upload_time": "2019-04-11T20:32:34", "url": "https://files.pythonhosted.org/packages/4e/03/a501fd98bfa271b1b4520796ee2a1a7a4008342206bd455b35b546b0cd7a/Flask_Unchained-0.7.7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "442674638af310f2e7b47fbca82a7f70", "sha256": "d585ffe68b156c5f1bc5afe13646173e055f3b62b09f3fa5e12f56d87b023f9e" }, "downloads": -1, "filename": "Flask-Unchained-0.7.7.tar.gz", "has_sig": false, "md5_digest": "442674638af310f2e7b47fbca82a7f70", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 303843, "upload_time": "2019-04-11T20:32:36", "url": "https://files.pythonhosted.org/packages/bb/e1/36eb4910a2e1c2b3793490362a2e3534290ac3f2b0f3d8f7f023154bc027/Flask-Unchained-0.7.7.tar.gz" } ], "0.7.8": [ { "comment_text": "", "digests": { "md5": "1f0406954c7658d6d718c704af763b57", "sha256": "eaf18a25d98f77feff076d09affed6566779c1fe6a8a6f1ecd442b7c0f1fafc3" }, "downloads": -1, "filename": "Flask_Unchained-0.7.8-py3-none-any.whl", "has_sig": false, "md5_digest": "1f0406954c7658d6d718c704af763b57", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 419929, "upload_time": "2019-04-21T18:07:05", "url": "https://files.pythonhosted.org/packages/5b/d3/4874f092c8ef30d4e5765bebb1cda8a02d44d40eb4e0ca216ea9f5a67d91/Flask_Unchained-0.7.8-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8cfc5b062957a8933ef9d436c77ac525", "sha256": "dc3385b6ac65bd6baaef4c717e9bf4d739d2f79617e6ec8d2a4803f46e0391e8" }, "downloads": -1, "filename": "Flask-Unchained-0.7.8.tar.gz", "has_sig": false, "md5_digest": "8cfc5b062957a8933ef9d436c77ac525", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 295600, "upload_time": "2019-04-21T18:07:07", "url": "https://files.pythonhosted.org/packages/bd/a1/826d7c417feb49ddc1b0ae84aa0d35134898dd74b7625447aa4cb9bc35b4/Flask-Unchained-0.7.8.tar.gz" } ], "0.7.9": [ { "comment_text": "", "digests": { "md5": "518e2bb7f76ce3b0eac704049d16f38d", "sha256": "422996bc08dd0289ff981a847f18d9dd990c04fa3f225431911384528be67b97" }, "downloads": -1, "filename": "Flask_Unchained-0.7.9-py3-none-any.whl", "has_sig": false, "md5_digest": "518e2bb7f76ce3b0eac704049d16f38d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 419978, "upload_time": "2019-05-20T01:57:24", "url": "https://files.pythonhosted.org/packages/15/03/c9f615a0bb570c44a9d2d7d74ccbda7b8b801c2e6622099717654e292533/Flask_Unchained-0.7.9-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "194dbc853466f5042ee4443af7a20d6f", "sha256": "3e0c302a4cbe7df04d45b37ace5674ac0086654387759375743db3112b7793eb" }, "downloads": -1, "filename": "Flask-Unchained-0.7.9.tar.gz", "has_sig": false, "md5_digest": "194dbc853466f5042ee4443af7a20d6f", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 295675, "upload_time": "2019-05-20T01:57:28", "url": "https://files.pythonhosted.org/packages/6d/a4/14c094bab7eaa9852b6a185234b2f011c2ba3a5b79b84f87ca9caadb5b9d/Flask-Unchained-0.7.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "518e2bb7f76ce3b0eac704049d16f38d", "sha256": "422996bc08dd0289ff981a847f18d9dd990c04fa3f225431911384528be67b97" }, "downloads": -1, "filename": "Flask_Unchained-0.7.9-py3-none-any.whl", "has_sig": false, "md5_digest": "518e2bb7f76ce3b0eac704049d16f38d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 419978, "upload_time": "2019-05-20T01:57:24", "url": "https://files.pythonhosted.org/packages/15/03/c9f615a0bb570c44a9d2d7d74ccbda7b8b801c2e6622099717654e292533/Flask_Unchained-0.7.9-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "194dbc853466f5042ee4443af7a20d6f", "sha256": "3e0c302a4cbe7df04d45b37ace5674ac0086654387759375743db3112b7793eb" }, "downloads": -1, "filename": "Flask-Unchained-0.7.9.tar.gz", "has_sig": false, "md5_digest": "194dbc853466f5042ee4443af7a20d6f", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 295675, "upload_time": "2019-05-20T01:57:28", "url": "https://files.pythonhosted.org/packages/6d/a4/14c094bab7eaa9852b6a185234b2f011c2ba3a5b79b84f87ca9caadb5b9d/Flask-Unchained-0.7.9.tar.gz" } ] }