mrkeyoor.com_
Sat 17 Oct 13:33 UTC
Webevaluationupdated 27 Aug 2026

flask review

Flask is a Python WSGI web application framework built around Werkzeug and Jinja. It provides a small core for traditional web applications while leaving database integration, form validation and other application choices to extensions or your own code.

-96stars / 7d
Verdict

Flask is worth considering for a traditional Python web application when choosing the surrounding libraries is useful to the team. Our recorded setup and build steps succeeded, while one async-view test failed because the required optional dependency was missing. That result does not establish a framework defect, a fully passing suite or application performance. Before adopting it, check the extensions your application needs and choose a production server. Consider Quart if the application is mainly async.

We ran it

Lab card: what happened when we ran flaskScreenshot of flask (flask.palletsprojects.com)
Install✓ · 22s40 packages · 38 MB
Build✓ · 4s
Tests✗ · 9s482 passed · 1 failed · 4 skipped of 483 (pytest)
Known vulns0(pip-audit)
Repo236 files~18,436 lines of source · 1.9 MB · 5 CI workflows · tests dir

Answers from our run

Does flask build from source?

Dependencies installed in 22 seconds (40 packages), and the build succeeded in 4 seconds. We cloned commit d318b68 into a clean Debian container with 3 CPUs and no project-specific setup.

Do flask's tests pass?

No. The project's own test command finished in 9 seconds and reported 482 passed, 1 failed, 4 skipped (pytest).

Does flask have known vulnerabilities in its dependencies?

pip-audit found none in the dependency tree at the time of our run.

Who should not use flask?

Teams seeking an included database abstraction layer or form validation library.

What are the alternatives to flask?

Quart, Flask with gevent. Flask is worth considering for a traditional Python web application when choosing the surrounding libraries is useful to the team.

Setup4/5The recorded install and build steps succeeded in about 22 and 4 seconds. Async testing encountered a missing optional dependency, and no installed CLI check or corrective rerun was supplied.
Docs5/5The supplied guides explicitly explain omitted database and form features, async extras, worker limits, background-task cancellation and production server requirements.
Community3/5The README identifies Pallets support, community extensions and contribution routes. The supplied evidence does not measure response times, contributor activity or support quality.
Maturity4/5The supplied 3.1.x documentation explains compatibility constraints and deployment choices, and the 3.1.3 release documents a specific maintenance fix. This run does not establish operational reliability.

Discussed on

  1. hnFlask 2.0.0 has been merged into master150 points
  2. hnFlask 2 Coming soon with Async Support7 points
  3. hnFlask fails after itsdangerous module’s update5 points

Who it’s for

Python developers building traditional web applications or HTTP services.
Teams that want to choose their database libraries and application structure.
Maintainers working with existing Flask applications and extensions.

Who it’s NOT for

Teams seeking an included database abstraction layer or form validation library.
Mainly async applications whose requirements include WebSockets or many concurrent long-running requests: Flask's documentation recommends considering Quart.
Applications that expect background tasks started with asyncio.create_task inside a normal async view to survive after the view finishes.
Operators expecting flask run to provide a production deployment.

Setup reality

In our recorded run on August 23, 2026, at commit d318b683471101618febed18996405ad26462110, the install step succeeded in about 22 seconds and the build step succeeded in about 4 seconds. The record lists 40 dependency packages and 38 MB of installation size. These are sandbox setup measurements, not application memory use or request-performance results. The supplied output does not independently confirm an installed Flask CLI.

The test step exited with code 1 after about 9 seconds. Its output reported 482 passed, 1 failed and 4 skipped. The failing test, tests/test_helpers.py::TestStreaming::test_async_view, raised: "Install Flask with the 'async' extra in order to use async views." This identifies a missing optional dependency in the recorded environment. There is no supplied rerun after installing it. The parser's total of 483 is not an exhaustive total including skips, and unique test coverage was not reconciled against a complete log.

The audit record contains zero findings but also zero audited packages. It does not establish a clean dependency audit.

Flask's documentation requires flask[async] for async views and a dedicated WSGI server or hosting platform for production. Neither successful setup steps nor this test summary establish production readiness for a particular application.

What Flask leaves to your application

Flask is a Python WSGI web framework built around Werkzeug and Jinja. Its README describes a lightweight starting point that can grow into complex applications. That is the project's positioning, rather than a result established by our sandbox run.

The practical choice is how much of the surrounding stack you want to select. Flask does not include a database abstraction layer or form validation by default. Its design guide directs those needs to extensions and other libraries. This suits a team with preferred tools, but the team must assess how those tools work together.

For examples of those separate decisions, see our existing pages on Flask-SQLAlchemy and Flask-Login. They address individual integrations rather than the framework choice reviewed here.

What our recorded run establishes

Our run took place on August 23, 2026, at commit d318b683471101618febed18996405ad26462110. The sandbox used the ghcr.io/astral-sh/uv:python3.12-bookworm image with 3 CPUs and 8 GB of RAM; the install output identified Python 3.12.12. No new execution was performed for this correction.

The install step exited successfully in 21.530 seconds, rounded to 22 seconds in the stored summary. The build step exited successfully in 3.728 seconds, rounded to 4 seconds. The record lists 40 dependency packages and 38 MB of installation size. It does not supply an installed-binary check, a request workload, throughput measurements or application memory measurements.

The repository measurements were 236 files, 18,436 source lines and a 1.9 MB checkout. The harness detected five CI workflow files and a tests directory, with no Dockerfile or Compose file. These describe the recorded checkout, not a comparison with other frameworks or proof of deployment completeness.

The test step exited with code 1 after 8.645 seconds, rounded to 9 seconds. The pytest tail reported 1 failed, 482 passed, 4 skipped in 2.28s. The pytest-reported duration and the harness step duration measure different scopes. The stored parser also records a total of 483, which must not be presented as the total including skipped tests. The supplied record explicitly says unique and exhaustive test counts were not verified through complete-log reconciliation.

The failure was tests/test_helpers.py::TestStreaming::test_async_view. Its traceback shows an import failure for the async adapter followed by this message: "Install Flask with the 'async' extra in order to use async views." This supports a diagnosis of a missing optional dependency in that environment. It does not prove Flask is broken, and there is no recorded rerun showing the result after adding the dependency.

The pip-audit summary records zero findings and zero audited packages. That is insufficient evidence for a claim that the installed dependencies had no known vulnerabilities.

Async support has a specific boundary

Flask added coroutine support in version 2.0. Its guide requires flask[async] for async views. Under the documented WSGI model, Flask starts an event loop in a thread to run an async view, and each request still occupies one worker. Concurrent I/O within a view can be useful, but adding async def does not increase the number of requests the application can handle simultaneously.

The normal per-request event loop stops when the async view completes. Unfinished tasks started with asyncio.create_task are then cancelled. Flask recommends a task queue for background work. The guide also describes serving Flask through an ASGI server with the WsgiToAsgi adapter, which creates a continuously running loop.

Check extension compatibility separately. Flask's guide warns that extensions written before async support may neither await decorated views nor provide awaitable functions. For a mainly async application, the guide points to Quart, an ASGI reimplementation of Flask. It also describes gevent as another approach to async request handling. Our run tested neither alternative.

Plan production separately from local development

The README's flask run example is a local starting point. Flask's deployment guide says the development server, debugger and reloader should not be used in production, including private deployments serving a single user.

Choose a dedicated WSGI server or hosting platform for deployment. The guide discusses options including Gunicorn, Waitress, mod_wsgi, uWSGI and gevent, as well as an ASGI adapter. Evaluate server configuration and any reverse proxy against the application's needs. Our successful build step does not validate those choices.

What the release evidence says

The supplied release page identifies Flask 3.1.3 as a security fix release. It says the session is marked as accessed for operations that inspect keys without retrieving values, such as in and len, and says the release should not otherwise change behavior compared with the latest feature release.

That is evidence for a specific maintenance change. It does not establish that every deployment is secure, and the recorded checkout should not be treated as identical to the 3.1.3 release tag. Star counts and a small issue queue would not establish support responsiveness or reliability either.

Choose Flask when a small WSGI core and freedom over supporting libraries fit the application. As a next step, list the extensions and deployment components you need, check their compatibility, and reproduce the relevant tests with the required extras installed. For a mainly async service, evaluate Quart before committing to Flask's WSGI request model.

Alternatives

ProjectWhat it isPick it when
QuartAn ASGI reimplementation of Flask described in Flask's own async guide.Consider Quart when the application is mainly async or needs WebSockets, long-running requests or many concurrent requests.
Flask with geventA Flask deployment approach that uses gevent's patching of low-level Python functions for async request handling.Evaluate this approach when retaining Flask while seeking benefits of async request handling. Flask's guide describes it as an option; our recorded run did not test it.

Sources

  1. Flask README
  2. Flask async and await guide
  3. Flask deployment guide
  4. Flask design decisions
  5. Flask 3.1.3 release

More web reviews

dioramas · elpis · deepseek-whale-girl · floorplan-3d · taro · driver.js · the whole board →