urn:uuid:d7012b07-ce1c-3355-b28f-5d1a2062ef36Meta — Pallets Project2023-04-02T21:11:50.218456+00:00python-feedgenurn:uuid:ba23d91c-87ff-3b7b-a696-d132831d8b66Hello Pallets Users2016-04-01T00:00:00+00:00Armin Ronacher<p>On the first of April 2010, I released a joke microframework called denied
which made fun of the fact that all microframeworks at the time decided to
forgo with dependencies and bundle up everything they need in a single Python
file. What I did was embed all of Jinja2 and Werkzeug in a base64 encoded
zip file within the framework's only Python file. The response to it was
interesting in a few ways because on the one hand quite a few people did not
really understand that it was an April fools joke to begin with and on the
other, there was a discussion where there were no microframeworks that actually
did use dependencies and encouraged it.</p>
<p>One month later there was a new project by the name of "Flask" which actually
gave this concept a real shot. It launched with the tagline "a microframework
for Python based on Werkzeug, Jinja 2 and good intentions" and six years later
it's the most starred Python framework on GitHub.</p>
<p>What's interesting about Flask is that its success just happened. There are
no conferences about it, no society or foundation and still today much of it
heavily depends on me directly. I'm not even sure why it became this
successful but I attribute a lot of it to the fact that it's easy to get
started and the full footprint of the framework is small enough that it becomes
easy enough to understand.</p>
<p>So what's changing now? Today we launch the Pallets Projects. What is it?
Primarily it's a GitHub organization which will be the home of Flask and all
the associated projects. It will be a new home for those libraries and the
first step to give the community more impact on the development of Flask and
all libraries. In addition there will be a new release of Flask very soon
after a thorough check that we do not break anything.</p>
<p>The people behind the Pallets Projects are <a href="/people/mitsuhiko/">me</a>,
<a href="/people/untitaker">Markus Unterwaditzer</a>, <a href="/people/davidism/">David Lord</a>
and <a href="https://github.com/ThiefMaster">Adrian Mönnich</a> with the organization
being open for newcomers to help and drive the projects forward.</p>
<p>We will spend the next few weeks adding as much organizational information on
the project's website to ensure that what often currently only exists in my
head is brought down to text.</p>
<p>I'm amazed how many people use and love Flask and my libraries and I hope that
this organization will be a good step towards making this scale past me. It's
humbling how big all of this became.</p>
urn:uuid:681b3821-ed23-3ec9-bca8-721c6d007f20Donate to Support Pallets2018-04-26T00:00:00+00:00David Lord<p>Pallets is excited to announce that we have joined the Python Software
Foundation's Fiscal Sponsorship program. As a non-profit organization,
the PSF will accept donations on behalf of Pallets into a dedicated
account.</p>
<p>Donations enable more attention from maintainers, which translates into
more time devoted to fixing bugs, developing features, and making
quicker releases. <a href="https://psfmember.org/civicrm/contribute/transact?reset=1&id=20"><strong>Click here to donate today.</strong></a></p>
<p>The Pallets organization develops and supports Flask, Jinja, Werkzeug,
Click, and other Python libraries. These libraries power applications of
all sizes around the world, and are downloaded millions of times each
month. Despite their popularity, the projects are primarily maintained
by only a few developers. The goal of Pallets is to grow the community
around these projects to create a sustainable group of contributors and
users.</p>
<p>Your donation will help:</p>
<ul>
<li>Allow maintainers to devote more of their time to the projects.</li>
<li>Recognize outstanding contributors in the community.</li>
<li>Allow maintainers and community members to attend conferences.</li>
<li>Acquire infrastructure and developer tools.</li>
<li>Sponsor local meetup events.</li>
<li>And more!</li>
</ul>
<p>If you like the work we do, you may donate as an
individual. If your employer uses Flask or any of the Pallets projects,
reach out to them to donate.</p>
<p>Flask and the Pallets team depends on you, the community. We thank you
for all the contributions you've already made, and look forward to
growing the community even more.</p>
<p><a href="https://psfmember.org/civicrm/contribute/transact?reset=1&id=20"><strong>Click here to donate today.</strong></a></p>
urn:uuid:88dca35e-ad86-3be2-9982-ce523b667365PyCon and Adding Maintainers to Click2018-06-01T00:00:00+00:00David Lord<p>In May I attended PyCon US 2018 in Cleveland, Ohio. It's a great opportunity to meet people interested in the Pallets projects and Python web applications. It can be a little intimidating, but also a lot of fun. The biggest difficulty is that there are <em>too many</em> things to do, and I always wish everyone could have a few more days together.</p>
<p>During the main conference, while talks are happening, anyone can organize "open spaces," impromptu meetings for any topic. I organized a Pallets open space, and we had a huge turnout. I was kind of unprepared for the size, so we started with people asking me questions, and then split up into tables for new users, Flask, Click, and Jinja.</p>
<p><img src="/blog/pycon-2018-click/open-space-board.jpg" alt="Open space announcement"></p>
<p>For up to four days after the talks, developers get together for sprints, working together to contribute to Python open source projects. Experienced developers help new ones learn how to contribute, and everyone gets to learn about new projects and meet the developers behind them.</p>
<p><img src="/blog/pycon-2018-click/open-space.jpg" alt="Pallets open space"></p>
<p>At the open space, I had mentioned that no one had really been maintaining Click for the past year. It turns out a <em>lot</em> of people use Click. They came motivated from the open space to contribute during the sprint. Some were new to contributing, but they all had one thing in common: they knew how Click was being used more than I did! So I took a chance and gave them all write permissions to the repository. Click started at ~250 open issues and 68 pull requests. After 2 days, it was at 140 issues and 22 pull requests. Wow! With that success, I'm officially welcoming all these new maintainers to the Pallets Click team. While Click stole the show, we had great contributions to Werkzeug, Flask, and Jinja as well.</p>
<p><img src="/blog/pycon-2018-click/sprint-dinner.jpg" alt="Dinner with Pallets sprinters"></p>
<p>If you want to get involved, a great way is to <a href="https://help.github.com/articles/watching-and-unwatching-repositories/">watch our repositories on GitHub</a>. You'll get notifications for each issue, so you can see what's happening and start contributing. You can help by triaging issues, improving tests and documentation, and fixing bugs. If your company uses a Pallets project like Flask, Click, or Jinja, consider pointing them to our <a href="https://www.palletsprojects.com/donate">PSF donation page</a>. Donations will help get maintainers to more events so we can do more sprints like this one. Thank you to everyone at PyCon and in the community for making Pallets a success!</p>
urn:uuid:e1d22563-b376-32b0-a0d5-4e6491910a23Take the Pallets / Flask Community Survey2019-01-29T00:00:00+00:00David Lord<p>One of my goals as a Pallets maintainer is to build the community around our projects. The Pallets projects (Flask, Jinja, Click, etc.) are downloaded millions of times each month, but it's hard to get a clear picture of what our users do and want with downloads stats only. We'd like to learn about you and your projects. Knowing more about our community will help us decide what to focus on to grow the Pallets projects.</p>
<p><a href="https://goo.gl/forms/CtZrOgWUa8gy1FNz2"><strong>Click here to take our Community Survey.</strong></a></p>
<p>Please share the link with friends, coworkers, and the internet! We're looking forward to seeing everyone's responses! You can follow <a href="https://twitter.com/PalletsTeam">https://twitter.com/PalletsTeam</a> or this blog to get updates about Pallets, including the survey results.</p>
urn:uuid:2fdc6045-cb82-32b2-83b5-0ea1cae34af1Ending Python 2 Support2019-12-17T00:00:00+00:00David Lord<p>Upstream support for Python 2.7 is ending on <a href="https://www.python.org/dev/peps/pep-0373/">January 1, 2020</a>.
Pallets is joining the <a href="https://python3statement.org/">community of open source projects</a>
ending support for Python 2 at that time. Our statement and support plan
are based on <a href="https://docs.pytest.org/en/5.3.2/py27-py34-deprecation.html">PyTest's announcement</a>.</p>
<p>We will be dropping support for Python 2.7 as well as Python 3.5 and
below, as their support windows have ended or will end around the same
time. Future releases of each Pallets project will only support Python
versions still supported upstream, which can be found in the
<a href="https://devguide.python.org/#status-of-python-branches">Python Developer's Guide</a>.</p>
<p>The last version branch of each core project to support Python 2.7
and Python 3.5 are:</p>
<ul>
<li>Flask 1.1.x</li>
<li>Werkzeug 1.0.x</li>
<li>Click 7.x</li>
<li>Jinja 2.11.x</li>
<li>ItsDangerous 1.1.x</li>
<li>MarkupSafe 1.1.x</li>
</ul>
<p>Each project will receive a major version bump to indicate support
for only 3.6+:</p>
<ul>
<li>Flask 2.0</li>
<li>Werkzeug 2.0</li>
<li>Click 8.0</li>
<li>Jinja 3.0</li>
<li>ItsDangerous 2.0</li>
<li>MarkupSafe 2.0</li>
</ul>
<p>Thanks to the <code>python_requires</code> package metadata, Python 2.7 and
3.5 users with a modern pip version will install the last supported
version automatically even if later versions are available.</p>
<p>The team will no longer backport patches for unsupported versions, but
the branches will continue to exist. The team will be happy to
accept patches contributed by the community for any severe security and
usability issues until mid-2020.</p>
<p>We made this decision based on multiple factors. Foremost is ease of
community contribution and maintainer availability. As time goes on,
fewer contributors have used or are familiar with the differences
between Python 2 and 3. Contributors and maintainers must keep track of
an ever growing list of obscure compatibility issues and workarounds,
and cannot use many modern features.</p>
<p>Over the last two years, we've talked to many developers and teams at
conferences and meetups and heard overwhelming support for the move to
Python 3. This is backed up by data collected from our community in a
survey we ran during January 2019, with 92% of respondents already using
or actively upgrading to Python 3. The <a href="https://www.jetbrains.com/research/python-developers-survey-2018/#python-3-adoption">PSF developer survey</a> and
PyPI statistics report similar majorities and show adoption continuing
to increase.</p>
<p>Thank you to everyone in the community for your support, and to everyone
who has made this transition a reality. We look forward to continuing
to develop the Pallets projects with you!</p>
urn:uuid:b11ac9c4-f403-3395-9e60-09f0fd3ef481Introducing the Pallets Community Organization (Pallets-Eco)2022-04-03T00:00:00+00:00Kara Babcock<p>Flask and many of the other Pallets projects benefit from having a diverse
ecosystem of user-maintained extensions. However, we recognize that not every
extension creator can maintain an extension indefinitely. Last year, the
Pallets team started the <a href="https://github.com/pallets-eco/">Pallets Community Organization</a>,
aka Pallets-Eco, on GitHub to provide a
place where the community can work together to maintain the extensions that we
all rely on.</p>
<p>The popular <a href="https://flask-caching.readthedocs.io/">Flask-Caching</a> and
<a href="http://packages.python.org/Flask-OpenID/">Flask-OpenID</a> extensions have
already been moved to Pallets-Eco.</p>
<p>In time, we hope that this organization will ensure the stability of the Pallets
ecosystem and provide a great point of entry for new contributors.</p>
<h2 id="what-belongs-in-pallets-eco">What Belongs in Pallets-Eco?</h2><p>Although we expect that most extensions we take in will be for Flask, the
organization is open to extensions for <em>any</em> of the Pallets projects—Click,
Jinja, Werkzeug, etc.</p>
<p>It's important to note, however, that this is <em>not</em> an official extension
repository. Extensions in this organization are not guaranteed to be up to date
or maintained by the Pallets team. Rather, this is a centralized place for
members of the wider community to help maintain these extensions.</p>
<p>The Pallets Community Organization is not currently accepting non-extension
projects, such as documentation translations. If you are interested in such
projects, <a href="https://discord.gg/pallets">join the Pallets Discord</a> and ask about
the Flask Community Working Group.</p>
<h2 id="how-you-can-transfer-your-extension">How You Can Transfer Your Extension</h2><p>First, <a href="https://discord.gg/pallets">reach out on Discord</a> (in the <code>#pallets-eco</code>
channel) to express your interest. Only the current owner of a repository can
transfer it, so please don't inquire on behalf of extensions you don't own. If
there is an abandoned extension that you want to start maintaining, <em>fork</em> it,
work on it, and then ask about joining Pallets-Eco.</p>
<p>Second, <a href="https://docs.github.com/en/repositories/creating-and-managing-repositories/transferring-a-repository">review the GitHub docs on transferring a repo</a>.
We will work with you to transfer the repo into the Pallets-Eco organization.</p>
<p>Third, you will need to give some of our organization members access to make
releases on PyPI.</p>
<p>Keep in mind that transferring your extension to the Pallets Community
Organization means you're giving up the final say on how your extension
evolves. You will remain as a collaborator on your extension and can continue
to contribute, but other members will have input on pull requests and when
releases are made. If you prefer to keep your extension completely under your
control, then Pallets-Eco is not for you.</p>
<h2 id="help-with-maintenance">Help With Maintenance</h2><p>Whether you're interested in maintaining one extension in particular or just
contributing to the organization overall, we welcome new contributors! This is
a great starting point if you've always wanted to contribute to a Pallets
project but haven't seen an issue you are ready to tackle—most of the issues in
an extension will be smaller in scope and easier to resolve.</p>
<p>All extensions in the Pallets Community Organization follow the same
<a href="https://github.com/pallets/flask/blob/main/CONTRIBUTING.rst">contributing guidelines</a> as the core
Pallets projects. Different extensions will come to the organization with
different testing coverage and documentation completion. To that end, even if
an extension doesn't have open issues, it's likely you could improve its tests
and/or docs. After you have reviewed the contributing guidelines, fork the
repo, make changes, and open a pull request when you are ready.</p>
<p>Release permissions will be limited to trusted members of the organization
(you could become one in time). If you have questions that don't belong in a
specific extension's issues, ask in <code>#pallets-eco</code> on the Pallets Discord.</p>
urn:uuid:1b219140-432a-3a27-890a-09fd24be3809Quart is now a Pallets project2022-07-06T00:00:00+00:00P G Jones<p>Quart, an ASGI re-implementation of the Flask API has joined the
Pallets organization. This means that future development will be under
the Pallets governance by the Pallets maintainers.</p>
<p>Our long term aim is to merge Quart and Flask to bring ASGI support
directly to Flask. This aim has significant technical obstacles, as
outlined in this
<a href="https://pgjones.dev/blog/flask-async-quart-sync-2019/">post</a> or this
<a href="https://youtu.be/bw1qeMoFBmw">talk</a>. However, this change clears
governance obstacles and brings the Quart and Flask maintainers closer
together.</p>
<h1 id="introduction-to-quart">Introduction to Quart</h1><p>Quart was developed from a desire to use asyncio and the async/await
keywords in Flask. Which at the time of Quart's inception was not
possible in Flask nor was it possible to add support. Instead Quart
was developed as a reimplementation of Flask's API using async/await
(learn more from this
<a href="https://www.youtube.com/watch?v=EgpQcLy1kf0">talk</a>). Later Quart
adopted the <a href="https://asgi.readthedocs.io">ASGI</a> standard and is now a
compliant ASGI framework.</p>
<p>The Quart API is a superset's of Flask in that it matches Flask's
whilst including ASGI specific features such as websockets, for
example:</p>
<div class="hll"><pre><span></span><span class="kn">from</span> <span class="nn">quart</span> <span class="kn">import</span> <span class="n">Quart</span><span class="p">,</span> <span class="n">render_template</span><span class="p">,</span> <span class="n">websocket</span>
<span class="n">app</span> <span class="o">=</span> <span class="n">Quart</span><span class="p">(</span><span class="vm">__name__</span><span class="p">)</span>
<span class="nd">@app</span><span class="o">.</span><span class="n">route</span><span class="p">(</span><span class="s2">"/"</span><span class="p">)</span>
<span class="k">async</span> <span class="k">def</span> <span class="nf">hello</span><span class="p">():</span>
<span class="k">return</span> <span class="k">await</span> <span class="n">render_template</span><span class="p">(</span><span class="s2">"index.html"</span><span class="p">)</span>
<span class="nd">@app</span><span class="o">.</span><span class="n">route</span><span class="p">(</span><span class="s2">"/api"</span><span class="p">)</span>
<span class="k">async</span> <span class="k">def</span> <span class="nf">json</span><span class="p">():</span>
<span class="k">return</span> <span class="p">{</span><span class="s2">"hello"</span><span class="p">:</span> <span class="s2">"world"</span><span class="p">}</span>
<span class="nd">@app</span><span class="o">.</span><span class="n">websocket</span><span class="p">(</span><span class="s2">"/ws"</span><span class="p">)</span>
<span class="k">async</span> <span class="k">def</span> <span class="nf">ws</span><span class="p">():</span>
<span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
<span class="k">await</span> <span class="n">websocket</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s2">"hello"</span><span class="p">)</span>
<span class="k">await</span> <span class="n">websocket</span><span class="o">.</span><span class="n">send_json</span><span class="p">({</span><span class="s2">"hello"</span><span class="p">:</span> <span class="s2">"world"</span><span class="p">})</span>
</pre></div>
<p>You can read more about Quart at
<a href="https://quart.palletsprojects.com">quart.palletsprojects.com</a>
including a guide to
<a href="https://quart.palletsprojects.com/en/latest/how_to_guides/flask_migration.html">migrating</a>
from Flask to Quart.</p>
<h2 id="when-to-use-quart">When to use Quart</h2><p>Quart is an ASGI framework utilising async IO throughout, whereas
Flask is a WSGI framework utilising sync IO. It is therefore best to
use Quart if you intend to use async IO (i.e. async/await libraries)
and Flask if not. Don't worry if you choose the 'wrong' framework
though, as Quart supports sync IO and Flask supports async IO,
although less efficiently.</p>
<h1 id="what-s-next">What's next</h1><p>The large ecosystem of Flask extensions is a real strength but
unfortunately these extensions only work with Flask, and vice versa
for Quart extensions. Therefore we plan to enable extensions to
support both Flask and Quart in the future.</p>
<p>We expect to keep developing features for both Flask and Quart, in
fact a number of features now present in Flask were developed in Quart
or from knowledge gained from Quart. This includes typing, async/await
support (in Flask), faster routing, and more.</p>
<p>With the closer relationship now possible both Flask and Quart should
benefit from new features, shared bug fixes, and more. Please join our
<a href="https://discord.gg/pallets">discord</a> if you'd like to get involved.</p>