flaskwebgui


Nameflaskwebgui JSON
Version 1.1.6 PyPI version JSON
download
home_pagehttps://github.com/ClimenteA/flaskwebgui
SummaryCreate desktop applications with Flask/Django/FastAPI!
upload_time2024-10-01 14:04:39
maintainerNone
docs_urlNone
authorClimente Alin
requires_pythonNone
licenseMIT
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            ## Flaskwebgui

[![Downloads](https://pepy.tech/badge/flaskwebgui)](https://pepy.tech/project/flaskwebgui)
[![PyPI](https://img.shields.io/pypi/v/flaskwebgui?color=blue)](https://pypi.org/project/flaskwebgui/)

Create desktop applications with Flask/FastAPI/Django!

<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->

**Table of Contents** _generated with [DocToc](https://github.com/thlorenz/doctoc)_

- [Install](#install)
- [Usage with Flask](#usage-with-flask)
- [Usage with Flask-SocketIO](#usage-with-flask-socketio)
- [Usage with FastAPI](#usage-with-fastapi)
- [Usage with Django](#usage-with-django)
- [Close application using a route](#close-application-using-a-route)
- [Prevent users from opening browser console](#prevent-users-from-opening-browser-console)
- [Configurations](#configurations)
- [Advanced Usage](#advanced-usage)
- [Distribution](#distribution)
- [Observations](#observations)
- [Credits](#credits)

<!-- END doctoc generated TOC please keep comment here to allow auto update -->

## Install

```py
pip install flaskwebgui
```

If you are using `conda` checkout [this link](https://github.com/conda-forge/flaskwebgui-feedstock).

## Usage with Flask

Let's say we have the following flask application:

```py
#main.py

from flask import Flask
from flask import render_template
from flaskwebgui import FlaskUI # import FlaskUI

app = Flask(__name__)


@app.route("/")
def hello():
    return render_template('index.html')

@app.route("/home", methods=['GET'])
def home():
    return render_template('some_page.html')


if __name__ == "__main__":
  # If you are debugging you can do that in the browser:
  # app.run()
  # If you want to view the flaskwebgui window:
  FlaskUI(app=app, server="flask").run()

```

Install [`waitress`](https://pypi.org/project/waitress/) for more performance.

## Usage with Flask-SocketIO

Let's say we have the following SocketIO application:

```py
#main.py
from flask import Flask, render_template
from flask_socketio import SocketIO
from flaskwebgui import FlaskUI


app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app)

@app.route("/")
def hello():
    return render_template('index.html')

@app.route("/home", methods=['GET'])
def home():
    return render_template('some_page.html')


if __name__ == '__main__':
    # socketio.run(app) for development
    FlaskUI(
        app=app,
        socketio=socketio,
        server="flask_socketio",
        width=800,
        height=600,
    ).run()

```

App will be served by `flask_socketio`.

## Usage with FastAPI

Pretty much the same, below you have the `main.py` file:

```py
#main.py
from fastapi import FastAPI, Request
from fastapi.responses import HTMLResponse
from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates
from fastapi import FastAPI
from flaskwebgui import FlaskUI

app = FastAPI()

# Mounting default static files
app.mount("/public", StaticFiles(directory="dist/"))
templates = Jinja2Templates(directory="dist")


@app.get("/", response_class=HTMLResponse)
async def root(request: Request):
    return templates.TemplateResponse("index.html", {"request": request})


@app.get("/home", response_class=HTMLResponse)
async def home(request: Request):
    return templates.TemplateResponse("some_page.html", {"request": request})


if __name__ == "__main__":

    FlaskUI(app=app, server="fastapi").run()

```

FastApi will be served by `uvicorn`.

## Usage with Django

Install [`waitress`](https://pypi.org/project/waitress/) and [`whitenoise`](https://pypi.org/project/whitenoise/) to make it work nicely.

In the `settings.py` file you need to do the following.

Configure static/media files:

```py
STATIC_URL = "static/"
STATICFILES_DIRS = [os.path.join(BASE_DIR, "static")]
STATIC_ROOT = os.path.join(BASE_DIR, "staticfiles")

MEDIA_URL = "/media/"
MEDIA_ROOT = os.path.join(BASE_DIR, "media")

if not os.path.exists(MEDIA_ROOT):
    os.makedirs(MEDIA_ROOT)

```

Add `whitenoise` to MIDDLEWARE (to handle static files):

```py
MIDDLEWARE = [
    "whitenoise.middleware.WhiteNoiseMiddleware",
    ...
]
```

Next to `manage.py` file create a `gui.py` file where you need to import `application` from project's `wsgi.py` file.

```bash
├── project_name
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── gui.py # this
├── manage.py
```

In `gui.py` file add below code.

```py
#gui.py
from flaskwebgui import FlaskUI
from djangodesktop.wsgi import application as app

if __name__ == "__main__":
    FlaskUI(app=app, server="django").run()

```

Next start the application with:

```shell
python gui.py
```

## Close application using a route

You can close the application using the `close_application` from flaskwebgui.

```python

from flaskwebgui import FlaskUI, close_application

# Any python webframework routing here

@app.route("/close", methods=["GET"])
def close_window():
    close_application()

```

And somewhere a link:

```html
<a href="/close" class="exit" role="button"> CLOSE </a>
```

## Prevent users from opening browser console

Add below js script to your index.html file to prevent users from opening the browser console.
You can extend it to prevent other browser specific features.

Native like features are pretty hard to implement because we have access only to javascript.

See [issue 135](https://github.com/ClimenteA/flaskwebgui/issues/135).

```js

<script>

    // Prevent F12 key
    document.onkeydown = function (e) {
        if (e.key === "F12") {
            e.preventDefault();
        }
    };

    // Prevent right-click
    document.addEventListener("contextmenu", function (e) {
        e.preventDefault();
    });

</script>

```

## Configurations

Default FlaskUI class parameters:

- `server: Union[str, Callable[[Any], None]]`: function which receives `server_kwargs` to start server (see examples folder);
- `server_kwargs: dict = None`: kwargs which will be passed down to `server` function;
- `app: Any = None`: `wsgi` or `asgi` app;
- `port: int = None`: specify port if not a free port will set;
- `width: int = None`: width of the window;
- `height: int = None`: height of the window;
- `fullscreen: bool = True`: start app in fullscreen (maximized);
- `on_startup: Callable = None`: function to before starting the browser and webserver;
- `on_shutdown: Callable = None`: function to after the browser and webserver shutdown;
- `extra_flags: List[str] = None`: list of additional flags for the browser command;
- `browser_path: str = None`: set path to chrome executable or let the defaults do that;
- `browser_command: List[str] = None`: command line with starts chrome in `app` mode (example of browser command: `["/path/to/browser-executable", "--user-data-dir=/path/to/profile", "--new-window", "--no-default-browser-check", "--allow-insecure-localhost", "--no-first-run", "--disable-sync", "--window-size=800,600", "--app=http://127.0.0.1:46899"]`);
- `socketio: Any = None`: socketio instance in case of flask_socketio;
- `app_mode: bool = True`: by defaults stats in app mode (browser without address bar) if false will start the browser in guest mode (with address bar);
- `browser_pid: int = None`: when the app starts `browser_pid` will be filled with the pid of the process opened with subprocess.Popen;


Develop your app as you would normally do, add flaskwebgui at the end or for tests.
**flaskwebgui doesn't interfere with your way of doing an application** it just helps "converting" it into a desktop app more easily with pyinstaller or [pyvan](https://github.com/ClimenteA/pyvan).

## Advanced Usage

You can plug in any python webframework you want just by providing a function to start the server in `server` FlaskUI parameter which will be feed `server_kwargs`.

Example:

```python

# until here is the flask example from above

def start_flask(**server_kwargs):

    app = server_kwargs.pop("app", None)
    server_kwargs.pop("debug", None)

    try:
        import waitress

        waitress.serve(app, **server_kwargs)
    except:
        app.run(**server_kwargs)


if __name__ == "__main__":

    # Custom start flask

    def saybye():
        print("on_exit bye")

    FlaskUI(
        server=start_flask,
        server_kwargs={
            "app": app,
            "port": 3000,
            "threaded": True,
        },
        width=800,
        height=600,
        on_shutdown=saybye,
    ).run()

```

In this way any webframework can be plugged in and the webframework can be started in a more customized manner.

Here is another example with the `nicegui` package:

```python

from flaskwebgui import FlaskUI
from nicegui import ui

ui.label("Hello Super NiceGUI!")
ui.button("BUTTON", on_click=lambda: ui.notify("button was pressed"))

def start_nicegui(**kwargs):
    ui.run(**kwargs)

if __name__ in {"__main__", "__mp_main__"}:
    DEBUG = False

    if DEBUG:
        ui.run()
    else:
        FlaskUI(
            server=start_nicegui,
            server_kwargs={"dark": True, "reload": False, "show": False, "port": 3000},
            width=800,
            height=600,
        ).run()

```

Checkout `examples` for more information.

## Distribution

You can distribute it as a standalone desktop app with **pyinstaller** or [**pyvan**](https://github.com/ClimenteA/pyvan). If pyinstaller failes try pyinstaller version 5.6.2.

```shell
pyinstaller -w -F  main.py
```

After the command finishes move your files (templates, js,css etc) to the `dist` folder created by pyinstaller. Or add them into the executable: `pyinstaller --name your-app-name --add-data "dbsqlite:dbsqlite" --add-data "templates:templates" --add-data "static:static" --collect-all name_of_package_that_pyinstaller_did_not_found gui.py` (for Windows change `:` with `;`). 

If you want your desktop application to be installed via snap or flatpack (Linux) checkout:

- [cacao-accounting-flatpak](https://github.com/cacao-accounting/cacao-accounting-flatpak);
- [cacao-accounting-snap](https://github.com/cacao-accounting/cacao-accounting-snap);

Made by [William Moreno](https://github.com/williamjmorenor).

## Observations

- Parameters `width`, `height` and maybe `fullscreen` may not work on Mac;
- Window control is limited to width, height, fullscreen;
- Remember the gui is still a browser - pressing F5 will refresh the page + other browser specific things (you can hack it with js though);
- You don't need production level setup with gunicorn etc - you just have one user to serve;
- If you want to debug/reload features - just run it as you would normally do with `app.run(**etc)`, `uvicorn.run(**etc)`, `python manage.py runserver` etc. flaskwebgui does not provide auto-reload you already have it in the webframework you are using;

## Credits

It's a combination of https://github.com/Widdershin/flask-desktop and https://github.com/ChrisKnott/Eel

It has some advantages over flask-desktop because it doesn't use PyQt5, so you won't have any issues regarding licensing and over Eel because you don't need to learn any logic other than Flask/Django/FastAPI/etc.

**Submit any questions/issues you have! Fell free to fork it and improve it!**

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/ClimenteA/flaskwebgui",
    "name": "flaskwebgui",
    "maintainer": null,
    "docs_url": null,
    "requires_python": null,
    "maintainer_email": null,
    "keywords": null,
    "author": "Climente Alin",
    "author_email": "climente.alin@gmail.com",
    "download_url": "https://files.pythonhosted.org/packages/22/40/fe88054a6caaddd29f3a89de3edcc5b208688b63ec84413fe24d375b6ac4/flaskwebgui-1.1.6.tar.gz",
    "platform": null,
    "description": "## Flaskwebgui\n\n[![Downloads](https://pepy.tech/badge/flaskwebgui)](https://pepy.tech/project/flaskwebgui)\n[![PyPI](https://img.shields.io/pypi/v/flaskwebgui?color=blue)](https://pypi.org/project/flaskwebgui/)\n\nCreate desktop applications with Flask/FastAPI/Django!\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n**Table of Contents** _generated with [DocToc](https://github.com/thlorenz/doctoc)_\n\n- [Install](#install)\n- [Usage with Flask](#usage-with-flask)\n- [Usage with Flask-SocketIO](#usage-with-flask-socketio)\n- [Usage with FastAPI](#usage-with-fastapi)\n- [Usage with Django](#usage-with-django)\n- [Close application using a route](#close-application-using-a-route)\n- [Prevent users from opening browser console](#prevent-users-from-opening-browser-console)\n- [Configurations](#configurations)\n- [Advanced Usage](#advanced-usage)\n- [Distribution](#distribution)\n- [Observations](#observations)\n- [Credits](#credits)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Install\n\n```py\npip install flaskwebgui\n```\n\nIf you are using `conda` checkout [this link](https://github.com/conda-forge/flaskwebgui-feedstock).\n\n## Usage with Flask\n\nLet's say we have the following flask application:\n\n```py\n#main.py\n\nfrom flask import Flask\nfrom flask import render_template\nfrom flaskwebgui import FlaskUI # import FlaskUI\n\napp = Flask(__name__)\n\n\n@app.route(\"/\")\ndef hello():\n    return render_template('index.html')\n\n@app.route(\"/home\", methods=['GET'])\ndef home():\n    return render_template('some_page.html')\n\n\nif __name__ == \"__main__\":\n  # If you are debugging you can do that in the browser:\n  # app.run()\n  # If you want to view the flaskwebgui window:\n  FlaskUI(app=app, server=\"flask\").run()\n\n```\n\nInstall [`waitress`](https://pypi.org/project/waitress/) for more performance.\n\n## Usage with Flask-SocketIO\n\nLet's say we have the following SocketIO application:\n\n```py\n#main.py\nfrom flask import Flask, render_template\nfrom flask_socketio import SocketIO\nfrom flaskwebgui import FlaskUI\n\n\napp = Flask(__name__)\napp.config['SECRET_KEY'] = 'secret!'\nsocketio = SocketIO(app)\n\n@app.route(\"/\")\ndef hello():\n    return render_template('index.html')\n\n@app.route(\"/home\", methods=['GET'])\ndef home():\n    return render_template('some_page.html')\n\n\nif __name__ == '__main__':\n    # socketio.run(app) for development\n    FlaskUI(\n        app=app,\n        socketio=socketio,\n        server=\"flask_socketio\",\n        width=800,\n        height=600,\n    ).run()\n\n```\n\nApp will be served by `flask_socketio`.\n\n## Usage with FastAPI\n\nPretty much the same, below you have the `main.py` file:\n\n```py\n#main.py\nfrom fastapi import FastAPI, Request\nfrom fastapi.responses import HTMLResponse\nfrom fastapi.staticfiles import StaticFiles\nfrom fastapi.templating import Jinja2Templates\nfrom fastapi import FastAPI\nfrom flaskwebgui import FlaskUI\n\napp = FastAPI()\n\n# Mounting default static files\napp.mount(\"/public\", StaticFiles(directory=\"dist/\"))\ntemplates = Jinja2Templates(directory=\"dist\")\n\n\n@app.get(\"/\", response_class=HTMLResponse)\nasync def root(request: Request):\n    return templates.TemplateResponse(\"index.html\", {\"request\": request})\n\n\n@app.get(\"/home\", response_class=HTMLResponse)\nasync def home(request: Request):\n    return templates.TemplateResponse(\"some_page.html\", {\"request\": request})\n\n\nif __name__ == \"__main__\":\n\n    FlaskUI(app=app, server=\"fastapi\").run()\n\n```\n\nFastApi will be served by `uvicorn`.\n\n## Usage with Django\n\nInstall [`waitress`](https://pypi.org/project/waitress/) and [`whitenoise`](https://pypi.org/project/whitenoise/) to make it work nicely.\n\nIn the `settings.py` file you need to do the following.\n\nConfigure static/media files:\n\n```py\nSTATIC_URL = \"static/\"\nSTATICFILES_DIRS = [os.path.join(BASE_DIR, \"static\")]\nSTATIC_ROOT = os.path.join(BASE_DIR, \"staticfiles\")\n\nMEDIA_URL = \"/media/\"\nMEDIA_ROOT = os.path.join(BASE_DIR, \"media\")\n\nif not os.path.exists(MEDIA_ROOT):\n    os.makedirs(MEDIA_ROOT)\n\n```\n\nAdd `whitenoise` to MIDDLEWARE (to handle static files):\n\n```py\nMIDDLEWARE = [\n    \"whitenoise.middleware.WhiteNoiseMiddleware\",\n    ...\n]\n```\n\nNext to `manage.py` file create a `gui.py` file where you need to import `application` from project's `wsgi.py` file.\n\n```bash\n\u251c\u2500\u2500 project_name\n\u2502   \u251c\u2500\u2500 asgi.py\n\u2502   \u251c\u2500\u2500 settings.py\n\u2502   \u251c\u2500\u2500 urls.py\n\u2502   \u2514\u2500\u2500 wsgi.py\n\u251c\u2500\u2500 gui.py # this\n\u251c\u2500\u2500 manage.py\n```\n\nIn `gui.py` file add below code.\n\n```py\n#gui.py\nfrom flaskwebgui import FlaskUI\nfrom djangodesktop.wsgi import application as app\n\nif __name__ == \"__main__\":\n    FlaskUI(app=app, server=\"django\").run()\n\n```\n\nNext start the application with:\n\n```shell\npython gui.py\n```\n\n## Close application using a route\n\nYou can close the application using the `close_application` from flaskwebgui.\n\n```python\n\nfrom flaskwebgui import FlaskUI, close_application\n\n# Any python webframework routing here\n\n@app.route(\"/close\", methods=[\"GET\"])\ndef close_window():\n    close_application()\n\n```\n\nAnd somewhere a link:\n\n```html\n<a href=\"/close\" class=\"exit\" role=\"button\"> CLOSE </a>\n```\n\n## Prevent users from opening browser console\n\nAdd below js script to your index.html file to prevent users from opening the browser console.\nYou can extend it to prevent other browser specific features.\n\nNative like features are pretty hard to implement because we have access only to javascript.\n\nSee [issue 135](https://github.com/ClimenteA/flaskwebgui/issues/135).\n\n```js\n\n<script>\n\n    // Prevent F12 key\n    document.onkeydown = function (e) {\n        if (e.key === \"F12\") {\n            e.preventDefault();\n        }\n    };\n\n    // Prevent right-click\n    document.addEventListener(\"contextmenu\", function (e) {\n        e.preventDefault();\n    });\n\n</script>\n\n```\n\n## Configurations\n\nDefault FlaskUI class parameters:\n\n- `server: Union[str, Callable[[Any], None]]`: function which receives `server_kwargs` to start server (see examples folder);\n- `server_kwargs: dict = None`: kwargs which will be passed down to `server` function;\n- `app: Any = None`: `wsgi` or `asgi` app;\n- `port: int = None`: specify port if not a free port will set;\n- `width: int = None`: width of the window;\n- `height: int = None`: height of the window;\n- `fullscreen: bool = True`: start app in fullscreen (maximized);\n- `on_startup: Callable = None`: function to before starting the browser and webserver;\n- `on_shutdown: Callable = None`: function to after the browser and webserver shutdown;\n- `extra_flags: List[str] = None`: list of additional flags for the browser command;\n- `browser_path: str = None`: set path to chrome executable or let the defaults do that;\n- `browser_command: List[str] = None`: command line with starts chrome in `app` mode (example of browser command: `[\"/path/to/browser-executable\", \"--user-data-dir=/path/to/profile\", \"--new-window\", \"--no-default-browser-check\", \"--allow-insecure-localhost\", \"--no-first-run\", \"--disable-sync\", \"--window-size=800,600\", \"--app=http://127.0.0.1:46899\"]`);\n- `socketio: Any = None`: socketio instance in case of flask_socketio;\n- `app_mode: bool = True`: by defaults stats in app mode (browser without address bar) if false will start the browser in guest mode (with address bar);\n- `browser_pid: int = None`: when the app starts `browser_pid` will be filled with the pid of the process opened with subprocess.Popen;\n\n\nDevelop your app as you would normally do, add flaskwebgui at the end or for tests.\n**flaskwebgui doesn't interfere with your way of doing an application** it just helps \"converting\" it into a desktop app more easily with pyinstaller or [pyvan](https://github.com/ClimenteA/pyvan).\n\n## Advanced Usage\n\nYou can plug in any python webframework you want just by providing a function to start the server in `server` FlaskUI parameter which will be feed `server_kwargs`.\n\nExample:\n\n```python\n\n# until here is the flask example from above\n\ndef start_flask(**server_kwargs):\n\n    app = server_kwargs.pop(\"app\", None)\n    server_kwargs.pop(\"debug\", None)\n\n    try:\n        import waitress\n\n        waitress.serve(app, **server_kwargs)\n    except:\n        app.run(**server_kwargs)\n\n\nif __name__ == \"__main__\":\n\n    # Custom start flask\n\n    def saybye():\n        print(\"on_exit bye\")\n\n    FlaskUI(\n        server=start_flask,\n        server_kwargs={\n            \"app\": app,\n            \"port\": 3000,\n            \"threaded\": True,\n        },\n        width=800,\n        height=600,\n        on_shutdown=saybye,\n    ).run()\n\n```\n\nIn this way any webframework can be plugged in and the webframework can be started in a more customized manner.\n\nHere is another example with the `nicegui` package:\n\n```python\n\nfrom flaskwebgui import FlaskUI\nfrom nicegui import ui\n\nui.label(\"Hello Super NiceGUI!\")\nui.button(\"BUTTON\", on_click=lambda: ui.notify(\"button was pressed\"))\n\ndef start_nicegui(**kwargs):\n    ui.run(**kwargs)\n\nif __name__ in {\"__main__\", \"__mp_main__\"}:\n    DEBUG = False\n\n    if DEBUG:\n        ui.run()\n    else:\n        FlaskUI(\n            server=start_nicegui,\n            server_kwargs={\"dark\": True, \"reload\": False, \"show\": False, \"port\": 3000},\n            width=800,\n            height=600,\n        ).run()\n\n```\n\nCheckout `examples` for more information.\n\n## Distribution\n\nYou can distribute it as a standalone desktop app with **pyinstaller** or [**pyvan**](https://github.com/ClimenteA/pyvan). If pyinstaller failes try pyinstaller version 5.6.2.\n\n```shell\npyinstaller -w -F  main.py\n```\n\nAfter the command finishes move your files (templates, js,css etc) to the `dist` folder created by pyinstaller. Or add them into the executable: `pyinstaller --name your-app-name --add-data \"dbsqlite:dbsqlite\" --add-data \"templates:templates\" --add-data \"static:static\" --collect-all name_of_package_that_pyinstaller_did_not_found gui.py` (for Windows change `:` with `;`). \n\nIf you want your desktop application to be installed via snap or flatpack (Linux) checkout:\n\n- [cacao-accounting-flatpak](https://github.com/cacao-accounting/cacao-accounting-flatpak);\n- [cacao-accounting-snap](https://github.com/cacao-accounting/cacao-accounting-snap);\n\nMade by [William Moreno](https://github.com/williamjmorenor).\n\n## Observations\n\n- Parameters `width`, `height` and maybe `fullscreen` may not work on Mac;\n- Window control is limited to width, height, fullscreen;\n- Remember the gui is still a browser - pressing F5 will refresh the page + other browser specific things (you can hack it with js though);\n- You don't need production level setup with gunicorn etc - you just have one user to serve;\n- If you want to debug/reload features - just run it as you would normally do with `app.run(**etc)`, `uvicorn.run(**etc)`, `python manage.py runserver` etc. flaskwebgui does not provide auto-reload you already have it in the webframework you are using;\n\n## Credits\n\nIt's a combination of https://github.com/Widdershin/flask-desktop and https://github.com/ChrisKnott/Eel\n\nIt has some advantages over flask-desktop because it doesn't use PyQt5, so you won't have any issues regarding licensing and over Eel because you don't need to learn any logic other than Flask/Django/FastAPI/etc.\n\n**Submit any questions/issues you have! Fell free to fork it and improve it!**\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Create desktop applications with Flask/Django/FastAPI!",
    "version": "1.1.6",
    "project_urls": {
        "Homepage": "https://github.com/ClimenteA/flaskwebgui"
    },
    "split_keywords": [],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "f097aecd915b2a4ce78a787a8f21f71483b1197cfcc1fb3b48f53378b0d38c00",
                "md5": "fba41ac4a033227efa11c9ae62e153fa",
                "sha256": "bf70c19306001e74c5520b9cb6b700747b8f525e2433350f8c798086c53b3661"
            },
            "downloads": -1,
            "filename": "flaskwebgui-1.1.6-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "fba41ac4a033227efa11c9ae62e153fa",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": null,
            "size": 8752,
            "upload_time": "2024-10-01T14:04:37",
            "upload_time_iso_8601": "2024-10-01T14:04:37.824236Z",
            "url": "https://files.pythonhosted.org/packages/f0/97/aecd915b2a4ce78a787a8f21f71483b1197cfcc1fb3b48f53378b0d38c00/flaskwebgui-1.1.6-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "2240fe88054a6caaddd29f3a89de3edcc5b208688b63ec84413fe24d375b6ac4",
                "md5": "9ba73f4ff7bcc49507d3d5f6ebd8f260",
                "sha256": "28df2a5a4d63962416cc7eca4d51002c4cbf66d3c09968ef8fb5743112b52b45"
            },
            "downloads": -1,
            "filename": "flaskwebgui-1.1.6.tar.gz",
            "has_sig": false,
            "md5_digest": "9ba73f4ff7bcc49507d3d5f6ebd8f260",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": null,
            "size": 8807,
            "upload_time": "2024-10-01T14:04:39",
            "upload_time_iso_8601": "2024-10-01T14:04:39.562414Z",
            "url": "https://files.pythonhosted.org/packages/22/40/fe88054a6caaddd29f3a89de3edcc5b208688b63ec84413fe24d375b6ac4/flaskwebgui-1.1.6.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-10-01 14:04:39",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "ClimenteA",
    "github_project": "flaskwebgui",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "requirements": [],
    "lcname": "flaskwebgui"
}
        
Elapsed time: 0.30424s