17 ms·
Responder: A familiar HTTP Service Framework
- monkmartinez 8y agoPretty cool, but I can't shake the feeling that the first example looks an awful lot like javascript... Perhaps... Maybe ... its because I have been "cheating" on Python with JS. I mean, it is a pain in the booty to code up a web app in python without JS. Try to code a mobile app with Python and Kivy... not all that fun (not practical). In less than a week with React, I have done both. So... why not just skip Python all together? I have been asking myself that question. Bottom line: The authors of this "service framework" states the Python world doesn't need another web framework, I agree. It needs some serious love in GUI land.
- m_ke 8y agoI'd argue that python needs an async django, which will hopefully be django in a few releases.
- scardine 8y agoThere is an async Flask in the form of Sanic[1]. Looks quite usable compared to raw aiohttp or twisted spaghetti I had to help maintain a couple months ago. [1] https://sanic.readthedocs.io/en/latest/ https://sanic.readthedocs.io/en/latest/
- m_ke 8y agoWe actually use Sanic alongside Django for some of our machine learning services. Has been working well so far.
- amorphic 8y agoI used aiohttp for a small project recently and found that it to be very good. Combined with aiohttp-json-rpc I had a very effective websocket-based JSON RPC backend service up and running in a very short time and with very little boilerplate. I'll be using this pattern again for sure. What would have been the advantage of me using Sanic instead (I haven't RTFM for sanic yet but I'm about to...)?
- abuckenheimer 8y ago[disclosure I am a sanic contributor] aiohttp is a great project, very similar to sanic, I'd say the big thing is sanic is slightly more flask like than aiohttp in ergonomics (which is something aiohttp has been working on[1]). Sanic also makes performance a key development goal so you can feel comfortable the project will scale gracefully. But I will stress I don't have current benchmarks to compare against aiohttp [1]https://aiohttp.readthedocs.io/en/stable/faq.html#id1 https://aiohttp.readthedocs.io/en/stable/faq.html#id1
- scardine 8y agoThe thing I like about Django is that it is an opinionated framework so lots of decisions were already made for me. Flask is a not too distant second place. With aiohttp you can make neat things it is operating a level below Sanic - in my experience people end up writing their own half-baked undocumented framework based on a combination of aiohttp, some ORM and a template engine - sometimes with half a dozen combinations in the same company.
- diminoten 8y agoYeah I mean the async landscape for web frameworks isn't exactly as populated as the "yet another web framework" statement makes it seem. This is how we get to async Django, and I think that's part of why Tom Christie is helping out. I also doubt Reitz thinks this is the usurper of Django anyway. It's more than an experiment, but less than "the new One True Way". As for ASGI python web frameworks, there are no mature winners in the space yet (compare uvicorn's quickstart example to this project's before you throw that project out as an example). This is Truly New Shit, and I'm pumped these two devs are working on it together.
- m_ke 8y agoAsync support is actually planned for django in upcoming releases. Here's some info about that https://www.aeracode.org/2018/06/04/django-async-roadmap/ https://www.aeracode.org/2018/06/04/django-async-roadmap/ From what I understand ASGI was developed by Andrew Godwin for Django Channels.
- diminoten 8y agoI'm super excited for that development work to begin! But just thinking about my own experiences, being able to look at what other people have done so far with it would help immensely when building the nuts and the bolts of the feature. This project will help immensely with that.
- amorphic 8y agoAndrew gave a great talk on this very topic at PyCon AU in August. Still at the formative stages it seems... https://www.youtube.com/watch?v=-7taKQnndfo https://www.youtube.com/watch?v=-7taKQnndfo
- tomchristie 8y agoYo. Yeah my (bit of) involvement is mostly around wanting to help guide the new ASGI ecosystem. For example, I'd like to see Python's async frameworks building on ASGI middleware rather than all re-writing their own middleware APIs. That way we end up with lots of cross-framework compatible middleware implementations, and we're all working together much more coherently. Similarly for test clients. We don't really need frameworks to all be building their own individual test clients to interact against their own interfaces, when we can instead build test clients to interface against ASGI, and then be able to use them against any ASGI framework. That's part of what the Starlette project (which Responder uses) is all about: https://www.starlette.io/ https://www.starlette.io/ (FWIW Starlette also composes all those bits and pieces into a framework in its own right)
- jklehm 8y agoIf you can manage with Flask there's Quart [1] [1] https://gitlab.com/pgjones/quart https://gitlab.com/pgjones/quart
- bpicolo 8y agoI've been using quart for some projects recently. Was super easy to move to from flask (though had to upstream a couple compat fixes). Overall, super pleased
- yla92 8y agoTornado[0] is not on per when it comes to features richness of Django. Yet, it's async and a joy to write. You should check it out if you have not. I would like to hear more from others about Tornado vs other Python frameworks as well. [0]: http://www.tornadoweb.org/en/stable/ http://www.tornadoweb.org/en/stable/
- amorphic 8y ago+1 I used Tornado in the past because it had an async event loop before it was native to Python. So much simpler than having to set up wsgi servers etc with the added benefit of easily-configured background tasks (like having cron jobs built in to your application). This is really good when you're building an application that you want other people to be able to install and run easily. It seems that Tornado is now offering the choice of its own event loop or the asyncio event loop. I built something recently in aiohttp because it felt like it had been built on asyncio from the ground up but will explore Tornado again.
- crgwbr 8y agoDjango’s channels project actually gets pretty close to this. It’s not flawless, but it makes it fairly simple to support websockets, etc.
- biggio 8y agoThere are numerous async frameworks already, aiohttp to name one, in addition to others mentioned above.
- m_ke 8y agoI'm aware of all of the flask inspired async micro frameworks. By django like I meant a batteries included framework with an integrated async ORM, auth, DRF and etc. From what I've seen we'll probably have to wait for django to get there, which might take a few years.
- basil-rash 8y agoI've started to wonder what the place of Python is at all. Machine Learning has become deeply coupled with Python, so you have that side of things, but that's not my personal area of interest. People say that it's good for "short scripts", but whenever I decide to write something in Python instead of TS, I'm instantly met with so many runtime type errors that I wonder how people can honestly believe lack of static typing increases productivity in these "short scripts". For instance, the second I decide to refactor, I know that even once I think I've cleaned everything up, the next few minutes will be spent running the code a few times to flush out all the type errors. Python is not my primary language, so that could play a part in the issues I have, but if I am allowed to lose humility for a second or two: even though I primarily use TS, my Python is still, in my opinion, stronger than many of my (college student) peers. I hate to imagine all the issues a novice would face. To be fair, I haven't used mypy in a while. I remember that being decent, but nowhere near the level of TS, in terms of both the power of the type system and the editor support.
- basil-rash 8y agoIn further reflection, it is perhaps only because I am so used to TS that I try to make as intense of refactorings as I do. A programmer who does not have prior experience working with as well tooled of a language would not be attempting the kinds of transformations I do, and thus may not experience as many issues.
- jnwatson 8y agoYou need `import typing`, and an editor with integrated mypy (e.g. vim). It is almost as good as static typing.
- basil-rash 8y agoInitial thoughts from looking through https://docs.python.org/3/library/typing.html# https://docs.python.org/3/library/typing.html#: 1. Love that it doesn't use structural typing, NewType seems great. 2. The syntax is bad. Maybe this is a "it just takes getting used to" thing, but I actually find it really bad. In TS, the syntax for typing almost always directly matches the syntax for the rest of the language. In Python, its a weird sort of LISPy DSL think that they made... compare: Py: Callable[[List[Tuple[int, string]], Dict[string, string]], int] TS: ([number, string][], { [key: string]: string }) => int This only gets worse as you chain callables together, whereas in TS everything left-associates as you'd expect and it all works out nicely. 3. Admittedly, the TS dict syntax isn't beautiful, but it becomes very helpful for things like `{ [K in keyof T]: K extends number ? T[K] : never }`, which does not seem to be possible in Py. 4. Related to 3, but no never type? I see NoReturn, but it does not seem to actually cause any errors when you try to assign it to a variable. See below. 5. Type narrowing... does it exist? Seemingly not, see below. 6. Literals as types (enums)? 7. Generics, do I really need to pass in the internal representation of the type I'd like to use? That seems absurd. Will bad things happen if these internal identifiers collide? (Reference: `T = Generic('T')` creates a generic type) Demo code that should throw an error at the assertUnreachable and nowhere else, but actually throws errors everywhere but the assert unreachable (types seemingly aren't narrowed by `type() == ...` checks): def foo(x: Union[str, int, float]): if (type(x) == int): return x / 3 if (type(x) == str): return x.upper() return assertUnreachable() def assertUnreachable() -> NoReturn: raise RuntimeError('no way') (this is all checked using mypy, v. 0.641)
- giancarlostoro 8y agoI love Python for back-end web development, it's hard to shake it off of me, except if I were doing ASP .NET Core (I'm ok with C#). So I think in that area it's pretty solid, but I agree, I wish the GUI side of Python got more love, maybe a proper RAD environment like VB had, hate on VB all you want, but damn it was neat. I'm surprised Kivy doesn't have a RAD editor, if it does then I am way behind. For now I'll keep using Tkinter.
- throwaway682888 8y agoGreat, another issue tracker for Kenneth and his followers^H^H^H^H^H^H^H^H^H maintainers to belittle contributors, delete unfavorable comments and generally create a hostile environment for users. No thanks!
- weberc2 8y agoI’ve got plenty of criticism for pipenv, but comments like these don’t endear me towards Kenneth’s critics.
- vaughnegut 8y agoWhat's wrong with pipenv? I've been meaning to try it
- rtpg 8y agoI tried using it for a heroku app since it was recommended in the Python setup (I used a plain requirements.txt in other projects) For me, it broke very often, would take forever to recalculate stuff, and would simply get in the way _way_ too much. I get the logic of the system but in practice pip + requirements.txt basically works for my use cases.
- meddlepal 8y agoSo I've been using it a bunch on my more recent Python projects. The promise and the reality are unfortunately not close. For the record I love having a one stop tool for virtualenvs and dependency management. That's quite nice. The Pipfile is nice. The Pipfile.lock is awesome. The tool itself is: 1. Painfully slow. 2. Very buggy. For example `pipenv graph --json` is broken in the latest release. This is the mechanism that other tools use to hook into pipenv. It's actually been broken in various ways since May. It's also incompatible in subtle ways with the latest pip. So I had to downgrade to pip 10.x. I've had some frustrating experiences lately now that the honeymoon is over. I'm going to keep using it, but I really hope some serious improvement is made in the next 6 to 12 months around performance and stability.
- setr 8y agoMaybe I’ll accept non-monospace fonts for code. You get the right ligatures, decent kerning, the softer touch of sans-serif... it has some possibility But psuedo-cursive strings? This font that looks like a retro emulator using a vectorizing filter? This is too much. I’m not happy about this development at all.
- meowface 8y agoYeah, using it even on the API documentation page [1] is a bit much. This does look like a cool framework, though. [1] http://python-responder.org/en/latest/api.html http://python-responder.org/en/latest/api.html
- reassembled 8y agoI believe the font is called Operator Mono and seems to have become popularized by the React scene. I was using it for a while and actually kind of like it but lately I've been experimenting with Fira Code, which also has ligature support.
- meowface 8y agoI've tried Fira Code but the ligatures and the overall look and feel of the font somehow feel too "loud" to me. Now that I'm looking at Operator Mono, I think I'll actually give that a try.
- Waterluvian 8y agoI'm slightly convinced that these kinds of things become slightly popular for a little bit for no reason other than change being nice. When people claim to like them, I wonder if they really just like the feeling of change. I have a few syntax color sets that I swap between every few months just because its a nice break. I also found that it's really nice to re-arrange my office every 6 months for no reason other than change is nice.
- Koshkin 8y ago> non-monospace fonts for code A proportional font helps when working with codebases that tend to have long lines (e.g. those written in Java or C#).
- mychael 8y agoCall me old fashioned, but I like functions that return something. Hard pass.
- darpa_escapee 8y agoPart of me agrees with you, the other part of me wants to point out that this can be solved trivially with a decorator.
- cantcopy 8y agoThe amount of negative feedback this post is getting is excessive.
- biggio 8y agoI used to hire people who have created their own frameworks like this one and our codebase were so bloated. At one point I had to let people go and spend the next year removing tens of thousands of lines of useless nonsense. Since that lesson, I look at candidates Github and if I see a custom built framework, I pass, regardless of how good they performed.
- basil-rash 8y agoYou can do that if you want... but it seems a bit extreme to rule out a candidate based on one project that could be really quite well designed and useful for whatever community it aims to benefit.
- servercobra 8y agoEspecially considering there's a big difference between what people work on for fun/publish to Github and what they'd consider using in a workplace environment.
- diminoten 8y agoThis is an insane notion, and I don't mean "insane" as a hyperbole, but literally not sane. Honestly, I very much doubt what you've written is even true, it's that nuts.
- biggio 8y agoI would say I can predict with relative accuracy how bloated a codebase is by looking at how many custom frameworks I find at team member profiles.
- diminoten 8y agoThe problem with this statement is that you're acting like everyone and their mother has a GitHub profile to begin with, and then that they've invariably got a "custom framework" there as well. None of this meshes with any reality I'm aware of. I'm willing to be wrong here, but considering the statistics I know about hiring, GitHub recreational usage among the average software dev, and... I dunno, my own proclivity to write frameworks, your story is pretty far from believable.
- deleted 8y ago[deleted]
- daenz 8y ago>The Python world certainly doesn't need more web frameworks. But, it does need more creativity. Then why create a "new python HTTP service framework"? The Flask and Falcon communities are very welcoming to creativity. This project strikes me as a fun side project that doesn't have serious legs or ambitions, which, don't get me wrong, is totally encouraged and fine! However, when it's being touted as a new framework for people to use, complete with its own logo and testimonials(???), it really presents itself as yet another soon-to-be unsupported and unmaintained/discarded project. We have to judge it based on how its presented, and in my humble opinion, it's being presented as The Hot New Shit, when it's maybe 300 original lines on top of massive existing frameworks.
- gigatexal 8y agoThis is Kenneth Reitz, it’ll be supported.
- daenz 8y agoSorry, but invoking the name of someone who has many half-baked projects on their github (and again, that's totally fine), doesn't instill confidence in me to put my business's new product on it. There's nothing groundbreaking here. Innovation has to outweigh the lack of project maturity for serious people to use it in production, and the innovation just isn't here.
- Perados 8y agoYou really have no idea who Kenneth Reitz is, do you?
- daenz 8y agoHe wrote Requests. His many other side projects are not nearly adopted, supported, or maintained like Requests. This project will likely be the same as the vast majority of those other side projects. This cult of personality stuff is really bizarre though. I actually feel bad for Kenneth in this regard, since he'll never know if what he makes is actually any good, since his followers will tell him it's the greatest thing since sliced bread regardless. I have legitimate support concerns before I would even consider using this for something real, and I've had two responses so far that address them by merely invoking his name. What a sad place to be in.
- amirathi 8y agoWhat I really need is a python web framework that has first class support for serving SPA applications (VueJS, React etc). I spent quite a bit of time setting up my Django app to serve VueJS (replacing the built-in Jinja templates). Once ready, it became a powerful application with ORM, middleware and all other Django goodies coupled with modern JS framework on the frontend. I hear Rails 6 is going to support modern web frameworks and using npm libraries, so something like that for Python/Django world.
- blocked_again 8y agoOhh please. No mixing of NPM with Django.
- giancarlostoro 8y agoSounds like you're confusing the purpose of the web framework. Don't try to force front-end specifics into a primarily back-end focused web server. Just because you create web templates for the back-end to RENDER does not mean you need to force it to push out VueJS. In theory VueJS should be able to run behind Apache stand-alone and make requests to your Python API which could be an entirely different codebase. No ambiguity if you did it this way instead, and some web frameworks let you serve up static files / HTML. If your JS front-end app is mostly static, you can just serve it up, and serve up basic HTML from the controller.
- amirathi 8y agoI understand the benefits of keeping front-end separate from back-end. - Separate teams working on front-end and back-end independently - Front end bundle can be served fast and cheap via CDN (only the naive serve static files with gunicorn/uwsgi right?) - and much more Knowing all that, I chose to mix up VueJS with Django solely to optimise for speed in a single person company. Thanks to this setup, - Authentication is handled via Django sessions (didn't have to spend time on JWT tokens) - I don't need to setup deployment pipeline, monitoring, testing for 2 applications. - Keep working on a single codebase and quickly iterate (slightly debatable, but still). While the setup is not ideal for everyone, it certainly has advantages that I value at my current stage. If you're curious this is the application: https://reviewnb.com https://reviewnb.com
- korijn 8y agoAre benchmarks available? And "nginx not needed"? Is uvicorn really that great?
- andrewstuart 8y agoasync & fstrings - seems Kenneth is on board with Python 3 then. One of his other really great applications is "das inbox" https://github.com/kennethreitz/inbox.py https://github.com/kennethreitz/inbox.py - it's brevity is inspiring - actually Responder seems very similar to das inbox.
- giancarlostoro 8y agoIt's not very encouraging to see that one as archived by the developer. I'd hope this new web framework he made doesn't end up the same way. I wouldn't mind experimenting with it.
- 0hn0 8y agoWhat about the performance of python-responder?
- reilly3000 8y agoAs a very regular Requests user I'm pretty excited about Responder. There are times when I just want to stand up a 'glue' API, and this looks extremely convenient for that purpose. I've wasted too many hours futzing with flask+WSGI+nginx+ubuntu to want to stand up something with it on a whim.
- reilly3000 8y agoI was able to follow a whim and use responder for a simple task where I just need to provide a single endpoint with one parameter that returns a JSON object with data from a SQL query. After about 2 hours (mostly spent trying to get a dependency issue ironed out) and 13 lines of code I have everything I need. I'm a happy customer so far.
- theptip 8y ago> Background tasks, spawned off in a ThreadPoolExecutor. This could be very nice; something that I've often found clunky when building a prototype is the amount of infrastructure required to get a more full-featured task queue up and running (say Celery or RQ). You can always just run an event loop, but then you have to reinvent a lot of the nice delay/scheduling machinery.