bottlepy / bottle

bottle.py is a fast and simple micro-framework for python web-applications.
http://bottlepy.org/
MIT License
8.45k stars 1.46k forks source link

"cgi" standard library module used by bottle is deprecated in Python 3.11, to be removed in 3.13 #1403

Closed liyanage closed 2 months ago

liyanage commented 2 years ago

I'm running bottle with Python 3.11 for the first time and I see this deprecation warning:

/xxx/lib/bottle/bottle.py:72: DeprecationWarning: 'cgi' is deprecated and slated for removal in Python 3.13
  import base64, calendar, cgi, email.utils, functools, hmac, itertools,\

I guess bottle needs to stop using this module?

defnull commented 2 years ago

That's unfortunate, bottle uses the form-data/multipart parser from that library. The PEP says:

FieldStorage/MiniFieldStorage has no direct replacement, but can typically be replaced by using multipart (for POST and PUT requests) or urllib.parse.parse_qsl (for GET and HEAD requests)

Great. I'm the author of multipart, so I'm okay with that, but copy&pasting all that into bottle (to maintain the zero-dependency design goal) feels wrong.

zb3 commented 1 year ago

Removing the multipart/form-data parser from Python standard library is unthinkable. I understand the cgi module was deprecated because CGI is itself deprecated, but the multipart encoding is not deprecated, it's still used today, hence I totally don't understand this..

simsong commented 1 year ago

PEP 594: Remove the cgi and cgitb modules, deprecated in Python 3.11.

cgi.FieldStorage can typically be replaced with urllib.parse.parse_qsl() for GET and HEAD requests, and the email.message module or multipart PyPI project for POST and PUT.

(per https://docs.python.org/3.13/whatsnew/3.13.html)

fedepell commented 1 year ago

Any news maybe on this? 3.13 is now getting closer with 3.12 being out in the meantime, albeit the release plan is around half of next year.

defnull commented 1 year ago

The only viable solution is to copy&paste code from multipart into bottle. I really really do not want to do that, but I have no other idea how to maintain the single-file no-deps aspect any other way.

fedepell commented 1 year ago

The only viable solution is to copy&paste code from multipart into bottle. I really really do not want to do that, but I have no other idea how to maintain the single-file no-deps aspect any other way.

Thanks for the fast reply! I see your point and absolutely agree is not "nice", but if we don't want to have dependencies, then I guess it's really the only way to go ("soon" or as Python 3.13 start getting traction).

Would you mind when you have time in case create a branch (possibly also for 0.12.x ?) with this so we can start testing? (I'm looking at this in the scope of future Fedora 41 planning to use it)

aisk commented 11 months ago

@defnull Hi can we using the email module in the standard library to avoid the copy / pasting?

ilrico commented 11 months ago

@defnull Since @aisk proposal does not work out (for large data as you underlined), what is your position on this issue ?

simsong commented 11 months ago

If the only requirement is to handle multipart and nothing else, it should not be hard to write a parser that does just that. multipart is not complex.

ilrico commented 11 months ago

I wonder if the no-deps line should not be open to compromise, as it is theorical: we see with this issue we are always dependant anyway, as least from std lib.

simsong commented 11 months ago

I'm also fine with copying the lines we from the cgi library into bottle.

valq7711 commented 11 months ago

Here is the POC https://github.com/valq7711/bottle/tree/multipart

Features:

simsong commented 11 months ago

Looks good; are you going to commit a test as well?

valq7711 commented 11 months ago

@simsong what do you mean? It passed the test https://github.com/valq7711/bottle/actions/runs/7160872053 Multipart test is in test_environ.py The problem is that it is breaking changes as cgi supports nested multiparts and allows LF-delimiters (instead of CRLF)

simsong commented 11 months ago

Ah. I didn’t see that.

On Mon, Dec 11, 2023 at 1:25 AM valq7711 @.***> wrote:

@simsong https://github.com/simsong what do you mean? It passed the test https://github.com/valq7711/bottle/actions/runs/7160872053 Multipart test is in test_environ.py The problem is that it is breaking changes as cgi supports nested multiparts and allows LF-delimiters (instead of CRLF)

— Reply to this email directly, view it on GitHub https://github.com/bottlepy/bottle/issues/1403#issuecomment-1849400028, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAMFHLGUEIPLDPCVBTOOFXLYI2RNRAVCNFSM6AAAAAARZPDW7WVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTQNBZGQYDAMBSHA . You are receiving this because you were mentioned.Message ID: @.***>

ilrico commented 8 months ago

hi folks, a gentle reminder that 3.13 in alpha 4 and cgi confirmed removed!

PEP 594 (Removing dead batteries from the standard library) scheduled removals of many deprecated modules: aifc, audioop, chunk, cgi, cgitb, crypt, imghdr, mailcap, msilib, nis, nntplib, ossaudiodev, pipes, sndhdr, spwd, sunau, telnetlib, uu, xdrlib, lib2to3.

fedepell commented 5 months ago

Just a ping as Python 3.13 is closer and closer...

opoplawski commented 5 months ago

Python 3.13b2 has landed in Fedora Rawhide breaking bottle

ilrico commented 2 months ago

Hello, seems evolution to handle change in python 3.13 is stalled. @defnull should be assumed that bottle maintenance is over? I guess the community deserves a clear answer, some are already migrating to flask/fastAPI as we can see here.

That does not remove the fact that we are all grateful for the great work done for the last years on bottle.

oz123 commented 2 months ago

For those interested, I intend on maintaining bottle under the fork here:

https://github.com/veilchen-web/veilchen

simsong commented 2 months ago

I guess the community deserves a clear answer, some are already migrating to flask/fastAPI as we can see here.

I have decided to migrate to fastAPI. It is not difficult, although some features of bottle are missing.

defnull commented 2 months ago

No the project is not dead, but not healthy either. My dilemma is as follows:

tl;dr; Project is not dead, but struggling. I got stuck and need help. But before anyone can help me, I need to help myself and publish what I already have done.

simsong commented 2 months ago

@defnull - thank you for the heartfelt reply above. I appreciate all of the work that you have done on Bottle. and it is a great piece of work. The idea of having code that runs on both Python 3.13 and Python 2.7 is admirable, but I think that it is misguided. Running a production website on Python 2.7 would be a mistake because of the ever-increasing number of unfixable security bugs. I would encourage you to drop Python 2 support, as most other projects have done over the past decade.

oz123 commented 2 months ago

@defnull you should let more people be involved in the process and let people co-author commits. I've dropped all python 2 code from Veilchen and added your multipart implementation. I've tried a few times to get more involved with bottle but your lack of response made me create my own fork. I'd love to contribute to bottle directly though.

ilrico commented 2 months ago

@defnull I totally agree with @simsong : we are in 2024 and python 2 is hardly a subject. And system stuck on python2 always the possibility to stay on current 0.12.x Regarding versionning, my first thought is "this guy could never work at Microsoft" ;-) my second thought is, quoting a sticker seen on a laptop in a train trip "Done is better than perfect". You can always commit it under 1.0rc1 so people are aware that it's not guaranteed bug free for now. And hopefully 1.0 will follow soon.

Fork is not a good option IMHO. Bottle has a nice goodwill. It is known (not as flask, but still) and is respected for the choices your made (no dependency for instance). So I push for option 3. Sanity matters ;-) But there's no much time, people are moving away...

simsong commented 2 months ago

@ilrico - thanks for your comments. I agree that it would be easier for me to stay with Bottle than to move to FastAPI. But unless new projects have a positive reason to use Bottle, it's going to be a dwindling community.

The ease of getting an app running with Bottle is its big benefit. It's not just the lack of dependencies, it is the ease of integration.

defnull commented 2 months ago

Thanks a lot for the feedback and support. I just spend the last 2 hours reviewing what I had done already, cleaning everything up and pushing to #1438. The PR now contains more than it should (e.g. a complete documentation overhaul) but it's a bit late late for being picky. That's fine.

New plan:

defnull commented 2 months ago

The PR now passes all tests. I'll be off the computer for a couple of days and ask everyone to have a look at #1438 and provide feedback. I'm actually quite happy with it now. If there are no major issues with it, I'd merge that into master next week and prepare a 0.13 release.

oz123 commented 2 months ago

Thanks for your work so far and bring responsive now. Enjoy your time off, and please think about solving the human resource problem. Currently you are the only person who is actively working on bottle with access to GitHub and pypi. You should really involve at least one more person of trust. Maybe even apply for tidelift.

defnull commented 2 months ago

New implementation was just merged into master and I'm preparing a 0.13 release at this very moment.

defnull commented 2 months ago

Done. I'll finally close this issue now :) Thank you for all the feedback, your kind words and above all your patience. The next releases should be way easier, now that the 'big one' is out of the door.

I'll now start working on issues and PRs and see which ones can be closed or easily fixed. You can all help by commenting on issues that should be fixed in 0.13 and can be closed now. There sure is a lot of outdated stuff in the issue tracker.