The web framework for inventors

Overview

Emmett

Emmett is a full-stack Python web framework designed with simplicity in mind.

The aim of Emmett is to be clearly understandable, easy to be learned and to be used, so you can focus completely on your product's features:

from emmett import App, request, response
from emmett.orm import Database, Model, Field
from emmett.tools import service, requires

class Task(Model):
    name = Field.string()
    is_completed = Field.bool(default=False)

app = App(__name__)
app.config.db.uri = "postgres://user:[email protected]/foo"
db = Database(app)
db.define_models(Task)
app.pipeline = [db.pipe]

def is_authenticated():
    return request.headers["Api-Key"] == "foobar"
    
def not_authorized():
    response.status = 401
    return {'error': 'not authorized'}

@app.route(methods='get')
@service.json
@requires(is_authenticated, otherwise=not_authorized)
async def todo():
    page = request.query_params.page or 1
    tasks = Task.where(
        lambda t: t.is_completed == False
    ).select(paginate=(page, 20))
    return {'tasks': tasks}

pip version Tests Status

Documentation

The documentation is available at https://emmett.sh/docs. The sources are available under the docs folder.

Examples

The bloggy example described in the Tutorial is available under the examples folder.

Status of the project

Emmett is production ready and is compatible with Python 3.7 and above versions.

Emmett follows a semantic versioning for its releases, with a {major}.{minor}.{patch} scheme for versions numbers, where:

  • major versions might introduce breaking changes
  • minor versions usually introduce new features and might introduce deprecations
  • patch versions only introduce bug fixes

Deprecations are kept in place for at least 3 minor versions, and the drop is always communicated in the upgrade guide.

How can I help?

We would be very glad if you contributed to the project in one or all of these ways:

  • Talking about Emmett with friends and on the web
  • Adding issues and features requests here on GitHub
  • Participating in discussions about new features and issues here on GitHub
  • Improving the documentation
  • Forking the project and writing beautiful code

License

Emmmett is released under the BSD License.

However, due to original license limitations, some components are included in Emmett under their original licenses. Please check the LICENSE file for more details.

Comments
  • Bug in session?

    Bug in session?

    I get an error here [1]

    data = pickle.dumps(sdict(current.session)) TypeError: 'NoneType' object is not callable

    But all the objects and variables involved contains data, in no case is it None

    current.session has data, sdict and pickle existed

    emmett 2.4.3 emmett-crypto 0.2.2 emmett-rest 1.3.2

    [1] https://github.com/emmett-framework/emmett/blob/8bf5c23c33a0fbdad260789baa6c28e1657bd2e6/emmett/sessions.py#L141

    bug bug::confirmed 
    opened by josejachuf 21
  • Possible bug in stream_dbfile

    Possible bug in stream_dbfile

    Hi @gi0baro, I do not know where the problem may be. I will try to put the maximum information about what is happening.

    Given a model with an upload field, an image in my case.

    In development mode works fine. I upload the image and I can show it on some page, but in production (nginx + gunicorn) the following happens:

    • The image is uploaded well to the server
    • The image fails to display on the page

    I did this test:

    Create a tunnel to the server to access port 8000 and start the development server from weppy.

    [develop]

    1. I uploaded the image and I could see it without problems

    [nginx] 2) Try to view image uploaded in (1) and fail. 3) I uploaded another image but could not see it

    [develop] 4) I can see the image uploaded in (3)

    The download function is this:

    @app.route("/download/<str:filename>")
    def download(filename):
        stream_dbfile(db, filename)
    
    

    If I copy the url of the image and paste it in another tab, sometimes it gives: "Internal Server Error" and other times malformed image

    There is no error in the nginx log.

    If you need any further proof, please let me know.

    Jose

    invalid 
    opened by josejachuf 19
  • Next major release

    Next major release

    So, I think during this year a couple of minor releases (1.1 and 1.2) hopefully will take place, and they probably will focus on optimization – rewriting the router to gain performance is one of these – and small enhancements on the existing features.

    The key-fact of this discussion is regarding the next major release (2.0) which I really hope would be ready for the end of the year or the start of the next. Here are some ideas I got in the last months.

    Things I really want into 2.0

    Drop the Python 2 support With the status of Python 3 and the ecosystem, and the official drop of the support in 2020, I can't see any good reason to keep all the compatibility code inside weppy. Definitely moving to Python 3 will really simplify the internal code and avoid slow downs caused by compatibility layers.

    Rewrite and separate the ORM Some people already asked me to separate the ORM into a separate project, and I think that's a good idea. But I really want to take advantage of this to rewrite the bottom layer and stop depending from the pydal library. This will surely bring some advantages, like generally improving the performance of the ORM, and the ability to extend it with new features quickly (hstore and jsonb support on postgres, for example). Even if I am one of the core contributors of pydal, moving the weppy ORM layer into a separated project will definitely avoid me the pain of keeping really old and awful code just for keeping backward compatibility and to remove a lot of codes weppy doesn't really use or need. Surely rewriting this layer will cause some disadvantages, like some incompatibilities with weppy 1.0 or loosing the compatibility with some DBMS – even if today I don't really supports them, and they actually doesn't work really well 'cause nobody supports them in pydal – but I really feel bad when I think the difficulty of adding new features to the current layer. What I can say right now is that I want to keep support for sqlite, mysql, postgresql, mssql and mongo, but the list might be expanded depending on the workload. We'll see.

    Support for sockets/channels I don't really want to switch the framework when I need them, so they will definitely be in 2.0. I don't actually know if the next major version will be totally async compatible, 'cause right now weppy abuses quite a lot of thread locals, but I'll see in the next month how to deal with that.

    Things nice to have in 2.0

    • Enhancements to the templates system: would be nice to make it even more flexible
    • Support for isomorphism/frontend components: seems like a trend right know, and it's really interesting to me (can lead to frontend validation with forms and things like that), but I need to explore this more accurately.
    • Commands to generate scaffolds: can be a good point to generate different applications scaffolds for new adopters

    This is almost everything I have in my plans. But I am totally open to suggestions, feature requests, feedbacks, whatever. Feel free to add your 2 cents to the discussion.

    discussion 
    opened by gi0baro 18
  • URL validation causes weird bug in general validation

    URL validation causes weird bug in general validation

    Try these examples:

    The following URLs fail on URL validation of forms: www.domain.tld domain.tld http://domain.tld http://www.domain.tld http://www.domain.tld/

    This works: http://domain.tld/

    After I tried this again - the working URL wasn't accepted a second time. So this check is inconsistent and weirdly at the same time when this URL validation passes, all other form errors aren't shown like all other fields (which are empty in this situation) are okay even if I force them to be filled in.

    There must be some bug in the form validation.

    opened by GiantCrocodile 16
  • Temporarily return to rapidjson

    Temporarily return to rapidjson

    I have a problem that is not directly from emmett but with the installation of orjson.

    All the server infrastructure I use is freebsd (+ jails). The orjson installation with pip does not use binaries, it is compiled. To compile you need to install some dependencies, including maturin. In the maturin installation an error occurs (I reported it) and therefore I cannot install orjson.

    I've been seeing this [1]

    What I want to do is temporarily modify serializers.py [2] and go back to rapidjson. This is apparently the only place where orjson is referenced. The query is if this change is enough and nothing will break.

    [1] https://github.com/emmett-framework/emmett/commit/2878fbdfd0ddedbee40ed863d78fb9c6525fc93e [2] https://github.com/emmett-framework/emmett/commit/5bbbae35c8517fd147e9b76ec4486432c347ef9e

    question 
    opened by josejachuf 12
  • From weppy to emmett

    From weppy to emmett

    Hi @gi0baro

    Emmet: 2.0.0a5 Emmet-REST: 1.0.0a1

    I am trying to run a weppy app with the new emmett and emmett_rest. After fixing the imports the app compiles and starts the server. But for any request return an error. The app is exactly as I took it working from weppy.

    ERROR: Application exception: Traceback (most recent call last): File "/home/jose/emmett/venv38/lib/python3.8/site-packages/emmett/asgi/handlers.py", line 282, in dynamic_handler http = await self.router.dispatch() File "/home/jose/emmett/venv38/lib/python3.8/site-packages/emmett/routing/router.py", line 217, in dispatch http_cls, output = await route.dispatcher.dispatch(request, reqargs) File "/home/jose/emmett/venv38/lib/python3.8/site-packages/emmett/routing/dispatchers.py", line 75, in dispatch await self._parallel_flow(self.flow_open) File "/home/jose/emmett/venv38/lib/python3.8/site-packages/emmett/routing/dispatchers.py", line 26, in _parallel_flow tasks = [asyncio.create_task(method()) for method in flow] File "/home/jose/emmett/venv38/lib/python3.8/site-packages/emmett/routing/dispatchers.py", line 26, in tasks = [asyncio.create_task(method()) for method in flow] File "/usr/lib/python3.8/asyncio/tasks.py", line 382, in create_task task = loop.create_task(coro) File "uvloop/loop.pyx", line 1396, in uvloop.loop.Loop.create_task TypeError: a coroutine was expected, got None

    What should I consider to do the w2e migration?

    question 
    opened by josejachuf 12
  • Password fields get reprocessed on saves even without changes

    Password fields get reprocessed on saves even without changes

    Hi @gi0baro

    [emmett: 2.4.9]

    Give the following model for User:

    class User(AuthUser):
        tablename = 'auth_users'
        belongs_to({'institucion': 'Institucion'})
    
        id = Field.string(default=lambda: uuid4().hex)
        avatar = Field.upload(autodelete=True)
        cuit = Field.string(length=11)
          
        validation = {
                'email': {'is': 'email', 'message': 'Ingrese el Correo Electrónico'},
                'last_name': {'presence': True, 'message': 'Ingrese el Apellido'},
                'first_name': {'presence': True, 'message': 'Ingrese el Nombre'},
                'password': {'len': {'gte': 8, 'lte': 50},
                         'message': 'La contraseña debe contener entre 8 y 50 caracteres'
                         }
        }
    
        fields_rw = {
                'institucion': True,
                'cuit': True
                }
    
        rest_rw = {
            'institucion': True,
            'registration_key': True,
            'password': (False, True)
        }
    

    And the form to create and update

    @user.route("/form")
    async def form():
        
        _id = request.query_params.id
    
        exclude_fields = []
        if _id:
            exclude_fields = ['password']
    
        form = await User.form(record_id=_id,  exclude_fields=exclude_fields)
        if form.accepted:
            if 'id' in form.params:
                _id = form.params.id
                  
            redirect(url('.bar', params=dict(id=_id)))
    
        return dict(form=form)
    

    From the form I can create a user useless, but when I edit it, the changes are not registered. It does not give error of any kind, neither in the console nor in the browser

    In this way I have working on Emmett 2.3.1 (and Weppy). I can't try this in version 2.3.1 for the use of PK as UUID, but in another old project it works.

    bug bug::confirmed 
    opened by josejachuf 11
  • regex and russian language in utf-8 template

    regex and russian language in utf-8 template

    Hi, @gi0baro !

    I'm cannot find nothing about regular expressions in templates, and when i create template with utf-8 encoding and write russian text, i cannot see a valid text on template rendering. Does weppy framework supports these features?

    Sorry, if i ask stupid questions, and my english.

    Thank you.

    opened by hloe0xff 11
  • About signed urls

    About signed urls

    @gi0baro, Based on bloggy, I added signature.py. (Attached)

    Modifications to bloggy.py:

    from signature import SignPipe, SignInjector

    app.injectors = [SignInjector()]

    @app.route("/post/<int:pid>", pipeline=[SignPipe()])
    def one(pid):
       ...
    
    @app.route("/new")
    @requires(lambda: auth.has_membership('admin'), url('index'))
    def new_post():
        form = Post.form()
        if form.accepted:
            redirect(url('one', form.params.id, sign=SignInjector.sign))
        return dict(form=form)
    
    

    index.html

    {{extend 'layout.html'}}
    
    <a href="{{=url('new_post')}}">Create a new post</a>
    <ul class="posts">
    {{for post in posts:}}
        <li>
            <h2>{{=post.title}}</h2>
            <a href="{{=url('one', post.id, sign=sign)}}">Read more</a>
            <hr />
        </li>
    {{pass}}
    {{if not posts:}}
        <li><em>No posts here so far.</em></li>
    {{pass}}
    </ul>
    

    As you can see only the one function requires that it be signed.

    It happens that after entering a signed link ["Read more"] other links are signed, for example new_post. It is as if the _signature parameter appears in each url, so when the signature is created, the url already contains another signature and it is obvious that validation will always fail.

    I found a solution modifying weppy / espose / url by removing the _signature parameter if it exists in params like this:

    # add signature
        if '_signature' in params:
            params.pop('_signature')
    
        if sign:
            params['_signature'] = sign(
                path, args, params, anchor, scheme, host, language)
    

    Can you apply this change to the repository?

    bloggy.zip

    opened by josejachuf 11
  • multiple route and one function  work random,404

    multiple route and one function work random,404

    Here is my simple app server,use two route /api/v1/book/isbn/<str:isbn> and /api/v1/book/<int:bookid>

    when I visit http://127.0.0.1:8001/api/v1/book/isbn/1231 It works 50% work at #return 1 ,50% 404, I dont know why,It has run inside the book function already。

    This is my code:

    #coding=utf-8
    from weppy import request
    from weppy import App
    from weppy.tools import service
    
    app = App(__name__)
    
    import random
    
    @app.route('/api/v1/book/isbn/<str:isbn>')
    @app.route('/api/v1/book/<int:bookid>')
    @service.json
    def book(isbn=None,bookid=None):
    
        if random.random()>0.5:
        #return 1
            return isbn
        #return 2
        if isbn != None:
            data = {'isbn':isbn}
        if bookid != None:
            bookid = int(bookid)
            data = {'id':bookid}
    
        return data
    
    if __name__ == '__main__':
        app.debug = True
        app.run(host='0.0.0.0', port=8001)
    
    opened by alingse 9
  • Auth: True for read is ignored on form_profile_rw

    Auth: True for read is ignored on form_profile_rw

    When I set form_profile_rw for field username to (True, False) in my User(AuthUserBasic) model the username field isn't displayed. It looks like read-access is broken and only writing works because if I set it to (True, True) or (False, True) I can see a textfield to type in.

    Expected behaviour is explained here: http://weppy.org/docs/0.5/dal#the-models-setup-helper

    enhancement feature request 
    opened by GiantCrocodile 9
  • PK uuid and auth_permission

    PK uuid and auth_permission

    Taking into account the UUID type PK support. How is it resolved in auth_permission record_id (integer) field?

    Sample of docs:

    maintenance = db.Preference(name='maintenance').first()
    auth.add_permission(admins, 'write', 'Preference', maintenance.id)
    auth.has_permission('write', 'Preference', maintenance.id)
    

    If Preference.id is uuid, this would not work.

    Jose

    enhancement 
    opened by josejachuf 1
  • Bug with 'in': {'dbset': ...} validation

    Bug with 'in': {'dbset': ...} validation

    I have this validation

    'f1': {'in': {'dbset': lambda db: db.where(db.A.f2 == session.f2)}}

    In another way:

    def val_f2(db):
        print(session.f2)
        return db.where(db.A.f2 == session.f2)
        
    'f1': {'in': {'dbset': lambda db: val_f2(db)}}
    

    The problem I have is that lambda runs only once and after that first time does not come to run, then it is always calling db.where from the first condition. I can check it with the print() that only runs once

    Jose

    ORM bug::investigation-needed 
    opened by josejachuf 5
  • Introduce relations facilities on forms

    Introduce relations facilities on forms

    Aim: make it easy to generate forms containing also related models' fields

    See https://github.com/emmett-framework/emmett/discussions/324 and https://github.com/emmett-framework/emmett/discussions/350

    enhancement nicetohave 
    opened by gi0baro 1
  • Introduce facilities for large applications

    Introduce facilities for large applications

    Some might be:

    • application composition
    • re-utilizable ORM models
    • ORM migrations' namespaces
    • advanced control of AppModule lifecycle
    • routes abstract classes to facilitate code recycling/extension
    enhancement nicetohave 
    opened by gi0baro 1
  • Use Emmett ORM separately from the App (in a Notebook)

    Use Emmett ORM separately from the App (in a Notebook)

    Hey @gi0baro ,

    I wanted to know use Emmett ORM separately from the App.

    Ideally, I would use a Notebook where I would declare the DB and the Models, attach the Models to the DB, and test different queries.

    Is it possible ?

    Thank you! Pierre

    feature request 
    opened by delarroqua 4
Releases(v2.4.13)
  • v2.4.13(Nov 24, 2022)

  • v2.4.12(Oct 31, 2022)

  • v2.4.11(Oct 28, 2022)

  • v2.4.10(May 23, 2022)

  • v2.4.9(Apr 19, 2022)

  • v2.4.8(Apr 12, 2022)

  • v2.4.7(Apr 11, 2022)

  • v2.4.6(Apr 11, 2022)

    Patch release

    Changes since 2.4.5:

    • ensure Row relations attributes typing across all operations
    • update uvicorn and http stack dependencies
    Source code(tar.gz)
    Source code(zip)
  • v2.4.5(Mar 11, 2022)

    Patch release

    Changes since 2.4.4:

    • fix regression bug preventing ORM Row objects to be pickled due to relations
    • fix regression bug in ORM adapter patches with NoSQLAdapter
    Source code(tar.gz)
    Source code(zip)
  • v2.4.4(Mar 6, 2022)

    Patch release

    Changes since 2.4.3:

    • fix regression bug preventing ORM Row objects to be pickled in certain conditions
    • align Request.client behaviour to ASGI standard
    Source code(tar.gz)
    Source code(zip)
  • v2.4.3(Feb 8, 2022)

  • v2.4.2(Jan 27, 2022)

    Patch release

    Changes since 2.4.1:

    • fix regression bug preventing has_many decorator relations resolution
    • fix via relations resolution iteration with intermediate via relations
    • fix migration engine generation in case of custom commands in tree
    • align has_one relations behaviour to has_many with via usage
    • avoid to replace field contents unless necessary in empty validation checks
    Source code(tar.gz)
    Source code(zip)
  • v2.4.1(Jan 18, 2022)

  • v2.4.0(Jan 10, 2022)

    This was huge. With almost 7k lines diff from previous release, 2.4 is focused on Python 3.10 support and ORM features. Due to the already consistent amount of changes, some features originally planned for this release were postponed to next major release.

    Thanks to all the community for their patience, with a special mention to @Kkeller83 who keeps sponsoring Emmett project and @treelym who sponsored the project for a couple of months since last major release.

    Changes since 2.3:

    • Added official Python 3.10 support
    • Added relative path support in templates
    • Added support for spatial columns in ORM
    • Added support for custom/multiple primary keys in ORM
    • Added support for custom/multiple foreign keys in ORM
    • Added support for custom and multiple primary keys relations in ORM
    • Added watch parameter to ORM's compute decorator
    • Added save method to ORM's rows and relevant callbacks
    • Added destroy method to ORM's rows and relevant callbacks
    • Added refresh method to ORM's rows
    • Added before_commit and after_commit ORM callbacks
    • Added changes tracking to ORM's rows
    • Added support to call super rowmethod decorated methods in ORM models
    • Added migrations set command to CLI
    • Added skip_callbacks parameter to relevant methods in ORM
    • ORM now automatically adds appropriate indexes for unique fields

    As usual, upgrade guide is available in the docs

    Source code(tar.gz)
    Source code(zip)
  • v2.3.2(Oct 29, 2021)

  • v2.3.1(Aug 19, 2021)

  • v2.3.0(Aug 12, 2021)

    Changes since 2.2:

    • Minor enhancements on request flow
    • Added ORM support for PostgreSQL json/jsonb fields and operators
    • Added widget_radio to forms.FormStyle
    • Added dict values support for in validations
    • Use optional emmett-crypto package for cryptographic functions
    • Deprecated security.secure_dumps and security.secure_loads in favour of new crypto package
    • Add on_delete option to belongs_to and refers_to
    • Add --dry-run option to migrations up and down commands
    Source code(tar.gz)
    Source code(zip)
  • v2.2.5(Aug 8, 2021)

    Patch release

    Changes since 2.2.4:

    • Fix regression bug preventing correct serialisation/deserialisation with tools.service module pipes and websockets
    Source code(tar.gz)
    Source code(zip)
  • v2.2.4(Jul 27, 2021)

    Patch release

    Changes since 2.2.3:

    • Fix ORM migrations engine producing wrong SQL instructions in columns foreign keys constraints on some adapters
    • Bump bundled jQuery to 3.5.x to fix several vulnerabilities
    Source code(tar.gz)
    Source code(zip)
  • v2.2.3(Jun 21, 2021)

  • v2.2.2(Jun 1, 2021)

  • v2.2.1(Apr 26, 2021)

  • v2.2.0(Mar 9, 2021)

    Changes since 2.1:

    • Slightly refactored request flow
    • Added App.command_group decorator
    • Added additional arguments acceptance in AppModule
    • Added static paths customisation for AppModule
    • Added workers options to serve command
    • Changed default logging level to info in serve command
    • Changed default SameSite policy for session cookies to Lax
    • Added official Python 3.9 support
    Source code(tar.gz)
    Source code(zip)
  • v2.1.4(Nov 9, 2020)

  • v2.1.3(Nov 6, 2020)

  • v2.1.2(Oct 31, 2020)

  • v2.1.1(Oct 28, 2020)

  • v2.1.0(Oct 17, 2020)

    Changes since 2.0:

    • Added type hints on all major interfaces
    • Deprecated App.run
    • Deprecated string signals in favour of extensions.Signals
    • Removed libs.sanitizer
    • Use orjson for JSON serialization
    • Refactored request flow internals
    • Added namespaces to templater
    • Added SameSite support to session cookies
    • Added HTTP/2 support
    • Added Request.push_promise
    • Added Python 3.9 support (beta)
    Source code(tar.gz)
    Source code(zip)
  • v2.0.2(Aug 30, 2020)

  • v2.0.1(Aug 11, 2020)

Owner
Emmett
Emmett
The little ASGI framework that shines. ?

✨ The little ASGI framework that shines. ✨ Documentation: https://www.starlette.io/ Community: https://discuss.encode.io/c/starlette Starlette Starlet

Encode 7.7k Jan 01, 2023
Swagger/OpenAPI First framework for Python on top of Flask with automatic endpoint validation & OAuth2 support

Connexion Connexion is a framework that automagically handles HTTP requests based on OpenAPI Specification (formerly known as Swagger Spec) of your AP

Zalando SE 4.2k Jan 07, 2023
An easy-to-use high-performance asynchronous web framework.

An easy-to-use high-performance asynchronous web framework.

Aber 264 Dec 31, 2022
The Python micro framework for building web applications.

Flask Flask is a lightweight WSGI web application framework. It is designed to make getting started quick and easy, with the ability to scale up to co

The Pallets Projects 61.5k Jan 06, 2023
Online Boutique is a cloud-native microservices demo application

Online Boutique is a cloud-native microservices demo application. Online Boutique consists of a 10-tier microservices application. The application is

Matt Reider 1 Oct 22, 2021
Free & open source Rest API for YTDislike

RestAPI Free & open source Rest API for YTDislike, read docs.ytdislike.com for implementing. Todo Add websockets Installation Git clone git clone http

1 Nov 25, 2021
A comprehensive reference for all topics related to building and maintaining microservices

This pandect (πανδέκτης is Ancient Greek for encyclopedia) was created to help you find and understand almost anything related to Microservices that i

Ivan Bilan 64 Dec 09, 2022
Flask + Docker + Nginx + Gunicorn + MySQL + Factory Method Pattern

This Flask project is reusable and also an example of how to merge Flask, Docker, Nginx, Gunicorn, MySQL, new: Flask-RESTX, Factory Method design pattern, and other optional dependencies such as Dyna

Facundo Padilla 19 Jul 23, 2022
The web framework for inventors

Emmett is a full-stack Python web framework designed with simplicity in mind. The aim of Emmett is to be clearly understandable, easy to be learned an

Emmett 796 Dec 26, 2022
Flask like web framework for AWS Lambda

lambdarest Python routing mini-framework for AWS Lambda with optional JSON-schema validation. ⚠️ A user study is currently happening here, and your op

sloev / Johannes Valbjørn 91 Nov 10, 2022
A high-level framework for building GitHub applications in Python.

A high-level framework for building GitHub applications in Python. Core Features Async Proper ratelimit handling Handles interactions for you (

Vish M 3 Apr 12, 2022
A proof-of-concept CherryPy inspired Python micro framework

Varmkorv Varmkorv is a CherryPy inspired micro framework using Werkzeug. This is just a proof of concept. You are free to use it if you like, or find

Magnus Karlsson 1 Nov 22, 2021
A framework that let's you compose websites in Python with ease!

Perry Perry = A framework that let's you compose websites in Python with ease! Perry works similar to Qt and Flutter, allowing you to create componen

Linkus 13 Oct 09, 2022
Quiz Web App with Flask and MongoDB as the Databases

quiz-app Quiz Web Application made with flask and mongodb as the Databases Before you run this application, change the inside MONGODB_URI ( in config.

gibran abdillah 7 Dec 14, 2022
A library that makes consuming a RESTful API easier and more convenient

Slumber is a Python library that provides a convenient yet powerful object-oriented interface to ReSTful APIs. It acts as a wrapper around the excellent requests library and abstracts away the handli

Sam Giles 597 Dec 13, 2022
Fast, asynchronous and elegant Python web framework.

Warning: This project is being completely re-written. If you're curious about the progress, reach me on Slack. Vibora is a fast, asynchronous and eleg

vibora.io 5.7k Jan 08, 2023
Bablyon 🐍 A small ASGI web framework

A small ASGI web framework that you can make asynchronous web applications using uvicorn with using few lines of code

xArty 8 Dec 07, 2021
aiohttp-ratelimiter is a rate limiter for the aiohttp.web framework.

aiohttp-ratelimiter aiohttp-ratelimiter is a rate limiter for the aiohttp.web fr

JGL Technologies 4 Dec 11, 2022
The comprehensive WSGI web application library.

Werkzeug werkzeug German noun: "tool". Etymology: werk ("work"), zeug ("stuff") Werkzeug is a comprehensive WSGI web application library. It began as

The Pallets Projects 6.2k Jan 01, 2023
easyopt is a super simple yet super powerful optuna-based Hyperparameters Optimization Framework that requires no coding.

easyopt is a super simple yet super powerful optuna-based Hyperparameters Optimization Framework that requires no coding.

Federico Galatolo 9 Feb 04, 2022