Fast, asynchronous and elegant Python web framework.

Overview

Warning: This project is being completely re-written. If you're curious about the progress, reach me on Slack.

License: MIT PyPI Code style: black Join Slack


Vibora is a fast, asynchronous and elegant Python 3.6+ http client/server framework. (Alpha stage)

Before you ask, Vibora means Viper in Portuguese :)

Server Features

  • Performance (https://github.com/vibora-io/benchmarks).
  • Schemas Engine.
  • Nested Blueprints / Domain Based Routes / Components
  • Connection Reaper / Self-Healing Workers
  • Sessions Engine
  • Streaming
  • Websockets
  • Caching tools
  • Async Template Engine (hot-reloading, deep inheritance)
  • Complete flow customization
  • Static Files (Smart Cache, Range, LastModified, ETags)
  • Testing Framework
  • Type hints, type hints, type hints everywhere.

Client Features

  • Streaming MultipartForms (Inspired by: https://github.com/requests/requests/issues/1584)
  • Rate Limiting / Retries mechanisms
  • Websockets
  • Keep-Alive & Connection Pooling
  • Sessions with cookies persistence
  • Basic/digest Authentication
  • Transparent Content Decoding

Server Example

from vibora import Vibora, Request
from vibora.responses import JsonResponse

app = Vibora()


@app.route('/')
async def home(request: Request):
    return JsonResponse({'hello': 'world'})


if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=8000)

Client Example

import asyncio
from vibora import client


async def hello_world():
    response = await client.get('https://google.com/')
    print(f'Content: {response.content}')
    print(f'Status code: {response.status_code}')


if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(hello_world())

Documentation

Check it out at Vibora docs website.

Performance (Infamous Hello World benchmark)

Frameworks Requests/Sec Version
Tornado 14,197 5.0.2
Django 22,823 2.0.6
Flask 37,487 1.0.2
Aiohttp 61,252 3.3.2
Sanic 119,764 0.7.0
Vibora 368,456 0.0.6

More benchmarks and info at https://github.com/vibora-io/benchmarks


Goals

  • Be the fastest Python http client/server framework..
  • Windows / Linux / MacOS.
  • Enjoyable and up to date development features/trends.

Coming Soon

  • Auto Reloading
  • HTTP2 Support
  • Brotli support (Server/Client)
  • Cython compiled templates.
  • Cython compiled user-routes.
Comments
  • cannot import name 'SO_REUSEPORT'

    cannot import name 'SO_REUSEPORT'

    File "/home/abc/anaconda3/lib/python3.6/site-packages/vibora/workers/handler.py", line 3, in from socket import IPPROTO_TCP, TCP_NODELAY, SO_REUSEADDR, SOL_SOCKET, SO_REUSEPORT,socket ImportError: cannot import name 'SO_REUSEPORT'

    python version is 3.6.0, need to upgrade to 3.7?

    opened by zzeric 12
  • Using pip to install Vibora is failing

    Using pip to install Vibora is failing

    Describe the bug When I try to use pip(10.0.1) to install Vibora I get the error listed below. I found this in another github issue for another package ('https://github.com/ets-labs/python-dependency-injector/issues/157'), which is the same issue I have. I tried solving the issue with the provided links from the issue I cited with no luck. If anyone has a fix or any more information it would be very appreciated. I'm on windows 10 with a fresh install of python 3.6.5 and visual studio 2017 enterprise installed. Thank you for all the work that you put into this package and hopefully I'll get to work with it soon, have a good day.

    To Reproduce Steps to reproduce the behavior:

    1. Open terminal and type 'pip install vibora'
    2. Let it run and you should get the error below
    `Installing collected packages: vibora
      Running setup.py install for vibora ... error
        Complete output from command c:\users\jscott35\appdata\local\programs\python\python36-32\python.exe -u -c "import setuptools, tokenize;__file__='C:\\Users\\jscott35\\AppData\\Local\\Temp\\pip-install-y7zh0qbz\\vibora\\setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record C:\Users\jscott35\AppData\Local\Temp\pip-record-2acsp4iy\install-record.txt --single-version-externally-managed --compile:
        running install
        running build
        running build_py
        creating build
        creating build\lib.win32-3.6
        creating build\lib.win32-3.6\tests
        copying tests\blueprints.py -> build\lib.win32-3.6\tests
        copying tests\cache.py -> build\lib.win32-3.6\tests
        copying tests\components.py -> build\lib.win32-3.6\tests
        copying tests\exceptions.py -> build\lib.win32-3.6\tests
        copying tests\forms.py -> build\lib.win32-3.6\tests
        copying tests\headers.py -> build\lib.win32-3.6\tests
        copying tests\helpers.py -> build\lib.win32-3.6\tests
        copying tests\hooks.py -> build\lib.win32-3.6\tests
        copying tests\limits.py -> build\lib.win32-3.6\tests
        copying tests\responses.py -> build\lib.win32-3.6\tests
        copying tests\streaming.py -> build\lib.win32-3.6\tests
        copying tests\subdomains.py -> build\lib.win32-3.6\tests
        copying tests\timeouts.py -> build\lib.win32-3.6\tests
        copying tests\__init__.py -> build\lib.win32-3.6\tests
        creating build\lib.win32-3.6\vibora
        copying vibora\application.py -> build\lib.win32-3.6\vibora
        copying vibora\blueprints.py -> build\lib.win32-3.6\vibora
        copying vibora\constants.py -> build\lib.win32-3.6\vibora
        copying vibora\context.py -> build\lib.win32-3.6\vibora
        copying vibora\cookies.py -> build\lib.win32-3.6\vibora
        copying vibora\exceptions.py -> build\lib.win32-3.6\vibora
        copying vibora\hooks.py -> build\lib.win32-3.6\vibora
        copying vibora\limits.py -> build\lib.win32-3.6\vibora
        copying vibora\optimizer.py -> build\lib.win32-3.6\vibora
        copying vibora\server.py -> build\lib.win32-3.6\vibora
        copying vibora\static.py -> build\lib.win32-3.6\vibora
        copying vibora\tests.py -> build\lib.win32-3.6\vibora
        copying vibora\utils.py -> build\lib.win32-3.6\vibora
        copying vibora\__init__.py -> build\lib.win32-3.6\vibora
        copying vibora\__version__.py -> build\lib.win32-3.6\vibora
        creating build\lib.win32-3.6\tests\client
        copying tests\client\external.py -> build\lib.win32-3.6\tests\client
        copying tests\client\interface.py -> build\lib.win32-3.6\tests\client
        copying tests\client\keep_alive.py -> build\lib.win32-3.6\tests\client
        copying tests\client\multipart.py -> build\lib.win32-3.6\tests\client
        copying tests\client\ssl_connections.py -> build\lib.win32-3.6\tests\client
        copying tests\client\streaming.py -> build\lib.win32-3.6\tests\client
        copying tests\client\__init__.py -> build\lib.win32-3.6\tests\client
        creating build\lib.win32-3.6\tests\router
        copying tests\router\prefixes.py -> build\lib.win32-3.6\tests\router
        copying tests\router\strategies.py -> build\lib.win32-3.6\tests\router
        copying tests\router\__init__.py -> build\lib.win32-3.6\tests\router
        creating build\lib.win32-3.6\tests\templates
        copying tests\templates\exceptions.py -> build\lib.win32-3.6\tests\templates
        copying tests\templates\extensions.py -> build\lib.win32-3.6\tests\templates
        copying tests\templates\integration.py -> build\lib.win32-3.6\tests\templates
        copying tests\templates\nodes.py -> build\lib.win32-3.6\tests\templates
        copying tests\templates\__init__.py -> build\lib.win32-3.6\tests\templates
        creating build\lib.win32-3.6\vibora\cache
        copying vibora\cache\cache.py -> build\lib.win32-3.6\vibora\cache
        copying vibora\cache\__init__.py -> build\lib.win32-3.6\vibora\cache
        creating build\lib.win32-3.6\vibora\client
        copying vibora\client\connection.py -> build\lib.win32-3.6\vibora\client
        copying vibora\client\decoders.py -> build\lib.win32-3.6\vibora\client
        copying vibora\client\defaults.py -> build\lib.win32-3.6\vibora\client
        copying vibora\client\exceptions.py -> build\lib.win32-3.6\vibora\client
        copying vibora\client\limits.py -> build\lib.win32-3.6\vibora\client
        copying vibora\client\pool.py -> build\lib.win32-3.6\vibora\client
        copying vibora\client\request.py -> build\lib.win32-3.6\vibora\client
        copying vibora\client\response.py -> build\lib.win32-3.6\vibora\client
        copying vibora\client\retries.py -> build\lib.win32-3.6\vibora\client
        copying vibora\client\session.py -> build\lib.win32-3.6\vibora\client
        copying vibora\client\websocket.py -> build\lib.win32-3.6\vibora\client
        copying vibora\client\__init__.py -> build\lib.win32-3.6\vibora\client
        creating build\lib.win32-3.6\vibora\components
        copying vibora\components\__init__.py -> build\lib.win32-3.6\vibora\components
        creating build\lib.win32-3.6\vibora\headers
        copying vibora\headers\headers.py -> build\lib.win32-3.6\vibora\headers
        copying vibora\headers\__init__.py -> build\lib.win32-3.6\vibora\headers
        creating build\lib.win32-3.6\vibora\multipart
        copying vibora\multipart\containers.py -> build\lib.win32-3.6\vibora\multipart
        copying vibora\multipart\__init__.py -> build\lib.win32-3.6\vibora\multipart
        creating build\lib.win32-3.6\vibora\parsers
        copying vibora\parsers\errors.py -> build\lib.win32-3.6\vibora\parsers
        copying vibora\parsers\typing.py -> build\lib.win32-3.6\vibora\parsers
        copying vibora\parsers\__init__.py -> build\lib.win32-3.6\vibora\parsers
        creating build\lib.win32-3.6\vibora\protocol
        copying vibora\protocol\definitions.py -> build\lib.win32-3.6\vibora\protocol
        copying vibora\protocol\__init__.py -> build\lib.win32-3.6\vibora\protocol
        creating build\lib.win32-3.6\vibora\request
        copying vibora\request\__init__.py -> build\lib.win32-3.6\vibora\request
        creating build\lib.win32-3.6\vibora\responses
        copying vibora\responses\responses.py -> build\lib.win32-3.6\vibora\responses
        copying vibora\responses\__init__.py -> build\lib.win32-3.6\vibora\responses
        creating build\lib.win32-3.6\vibora\router
        copying vibora\router\parser.py -> build\lib.win32-3.6\vibora\router
        copying vibora\router\router.py -> build\lib.win32-3.6\vibora\router
        copying vibora\router\__init__.py -> build\lib.win32-3.6\vibora\router
        creating build\lib.win32-3.6\vibora\schemas
        copying vibora\schemas\exceptions.py -> build\lib.win32-3.6\vibora\schemas
        copying vibora\schemas\messages.py -> build\lib.win32-3.6\vibora\schemas
        copying vibora\schemas\schemas.py -> build\lib.win32-3.6\vibora\schemas
        copying vibora\schemas\types.py -> build\lib.win32-3.6\vibora\schemas
        copying vibora\schemas\__init__.py -> build\lib.win32-3.6\vibora\schemas
        creating build\lib.win32-3.6\vibora\sessions
        copying vibora\sessions\base.py -> build\lib.win32-3.6\vibora\sessions
        copying vibora\sessions\client.py -> build\lib.win32-3.6\vibora\sessions
        copying vibora\sessions\file.py -> build\lib.win32-3.6\vibora\sessions
        copying vibora\sessions\redis.py -> build\lib.win32-3.6\vibora\sessions
        copying vibora\sessions\__init__.py -> build\lib.win32-3.6\vibora\sessions
        creating build\lib.win32-3.6\vibora\templates
        copying vibora\templates\ast.py -> build\lib.win32-3.6\vibora\templates
        copying vibora\templates\cache.py -> build\lib.win32-3.6\vibora\templates
        copying vibora\templates\engine.py -> build\lib.win32-3.6\vibora\templates
        copying vibora\templates\exceptions.py -> build\lib.win32-3.6\vibora\templates
        copying vibora\templates\extensions.py -> build\lib.win32-3.6\vibora\templates
        copying vibora\templates\loader.py -> build\lib.win32-3.6\vibora\templates
        copying vibora\templates\nodes.py -> build\lib.win32-3.6\vibora\templates
        copying vibora\templates\parser.py -> build\lib.win32-3.6\vibora\templates
        copying vibora\templates\template.py -> build\lib.win32-3.6\vibora\templates
        copying vibora\templates\utils.py -> build\lib.win32-3.6\vibora\templates
        copying vibora\templates\__init__.py -> build\lib.win32-3.6\vibora\templates
        creating build\lib.win32-3.6\vibora\websockets
        copying vibora\websockets\obj.py -> build\lib.win32-3.6\vibora\websockets
        copying vibora\websockets\__init__.py -> build\lib.win32-3.6\vibora\websockets
        creating build\lib.win32-3.6\vibora\workers
        copying vibora\workers\handler.py -> build\lib.win32-3.6\vibora\workers
        copying vibora\workers\necromancer.py -> build\lib.win32-3.6\vibora\workers
        copying vibora\workers\reaper.py -> build\lib.win32-3.6\vibora\workers
        copying vibora\workers\__init__.py -> build\lib.win32-3.6\vibora\workers
        creating build\lib.win32-3.6\vibora\schemas\extensions
        copying vibora\schemas\extensions\__init__.py -> build\lib.win32-3.6\vibora\schemas\extensions
        creating build\lib.win32-3.6\vibora\templates\compilers
        copying vibora\templates\compilers\base.py -> build\lib.win32-3.6\vibora\templates\compilers
        copying vibora\templates\compilers\cython.py -> build\lib.win32-3.6\vibora\templates\compilers
        copying vibora\templates\compilers\helpers.py -> build\lib.win32-3.6\vibora\templates\compilers
        copying vibora\templates\compilers\python.py -> build\lib.win32-3.6\vibora\templates\compilers
        copying vibora\templates\compilers\__init__.py -> build\lib.win32-3.6\vibora\templates\compilers
        running build_ext
        building 'vibora.parsers.parser' extension
        creating build\temp.win32-3.6
        creating build\temp.win32-3.6\Release
        creating build\temp.win32-3.6\Release\vibora
        creating build\temp.win32-3.6\Release\vibora\parsers
        creating build\temp.win32-3.6\Release\vendor
        creating build\temp.win32-3.6\Release\vendor\http-parser-2.8.1
        C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.14.26428\bin\HostX86\x86\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD -I. -I/git/vibora/vibora -Ic:\users\jscott35\appdata\local\programs\python\python36-32\include -Ic:\users\jscott35\appdata\local\programs\python\python36-32\include "-IC:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.14.26428\include" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.6.1\include\um" /Tcvibora/parsers/parser.c /Fobuild\temp.win32-3.6\Release\vibora/parsers/parser.obj -O3
        cl : Command line warning D9002 : ignoring unknown option '-O3'
        parser.c
        c:\users\jscott35\appdata\local\programs\python\python36-32\include\pyconfig.h(59): fatal error C1083: Cannot open include file: 'io.h': No such file or directory
        error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Professional\\VC\\Tools\\MSVC\\14.14.26428\\bin\\HostX86\\x86\\cl.exe' failed with exit status 2
    
        ----------------------------------------
    Command "c:\users\jscott35\appdata\local\programs\python\python36-32\python.exe -u -c "import setuptools, tokenize;__file__='C:\\Users\\jscott35\\AppData\\Local\\Temp\\pip-install-y7zh0qbz\\vibora\\setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record C:\Users\jscott35\AppData\Local\Temp\pip-record-2acsp4iy\install-record.txt --single-version-externally-managed --compile" failed with error code 1 in C:\Users\jscott35\AppData\Local\Temp\pip-install-y7zh0qbz\vibora\`
    
    
    opened by ece-jacob-scott 11
  • Can't install: gcc: error: vibora/parsers/parser.c: No such file or directory

    Can't install: gcc: error: vibora/parsers/parser.c: No such file or directory

    Describe the bug Can't install

    To Reproduce Steps to reproduce the behavior:

    1. Clone repository
    2. Run python setup.py install

    Expected behavior package installed.

    Screenshots ` running install running bdist_egg running egg_info writing vibora.egg-info/PKG-INFO writing dependency_links to vibora.egg-info/dependency_links.txt writing requirements to vibora.egg-info/requires.txt writing top-level names to vibora.egg-info/top_level.txt reading manifest file 'vibora.egg-info/SOURCES.txt' reading manifest template 'MANIFEST.in' warning: no files found matching '*.rst' anywhere in distribution warning: manifest_maker: MANIFEST.in, line 2: 'recursive-include' expects

    ...

    writing manifest file 'vibora.egg-info/SOURCES.txt' installing library code to build/bdist.linux-x86_64/egg running install_lib running build_py running build_ext building 'vibora.parsers.parser' extension gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -I/home/torqmo/miniconda3/envs/py36sab/include/python3.6m -c vibora/parsers/parser.c -o build/temp.linux-x86_64-3.6/vibora/parsers/parser.o -O3 gcc: error: vibora/parsers/parser.c: No such file or directory gcc: fatal error: no input files compilation terminated. error: command 'gcc' failed with exit status 1 `

    Additional context

    opened by Sklavit 10
  • Remove

    Remove "sexy" terminology from project

    (@frnkvieira: Congratulations on attracting attention to your project. When folks provide critical feedback, even when said feedback is not conveyed in the most constructive manner, I would encourage you to respond as gracefully and non-defensively as you can. This is not easy, and I am terrible at it. 😄 Nevertheless, I hope you will apply this practice when thinking about how you want to handle this issue.)

    As noted by others in the python community, usage of the word "sexy" to describe this project:

    • is often perceived as juvenile
    • is not welcoming or inclusive
    • can pre-select an undesirable audience (namely, immature dude-bros)

    Here are the references to the word in question: https://github.com/vibora-io/vibora/search?q=sexy&type=Code

    I recommend that these references be removed. They provide no value and are only a detriment to the project.

    discussion 
    opened by justinmayer 10
  • Is it possible to use multiple CPU cores?

    Is it possible to use multiple CPU cores?

    Since the official docs recommend placing Vibora without a proxy or load balancer, I'm curious how Vibora is meant to be used in a multi-core machine to best utilize available resources?

    opened by asfaltboy 10
  • Update started.md for import JsonResponse

    Update started.md for import JsonResponse

    The import JsonResponse problem is not fixed in master branch, therefore this PR.

    Before submitting a pull request, please make sure the following is done:

    1. Fork the repository and create your branch from master.

    2. Run the build.py and test.py scripts.

    3. If you are fixing something, add tests that fail in the current version and pass in yours.

    4. If you're developing a new feature open an issue first to discuss it. Some features may be useful to you but harmful to others be it because of performance, new dependencies or different perspectives.

    5. One more time: Don't forget to add tests.

    6. Ensure the entire test suite is passing and overall performance is not degraded.

    opened by stantonxu 7
  • Change cython call

    Change cython call

    Cython executable can be on different path (Windows Python/Scripts, Linux bin and local/bin). Just make sure it is installed and (in Windows in PATH variable) on the right place.

    Closes #145, closes #129

    opened by danieldaeschle 5
  • Rename vibora suggest

    Rename vibora suggest

    Additional suggest Such a sexy Python web framework should be accompanied by a internationalized, hotter name

    For example, Tornado, Flask, Django, These names are all catchy.

    opened by RanchoCooper 5
  • I hope the author can continue to improve this project.

    I hope the author can continue to improve this project.

    I hope the author can continue to improve this project.

    The author has disappeared for several months. I like this project very much, but I feel uneasy to see that it has not been updated for a long time.

    If you plan to continue improving in the future, expect to be more restful~

    opened by VcrTing 4
  • Add a Chatroom for the community

    Add a Chatroom for the community

    Is your feature request related to a problem? Please describe. Currently there is no way to engage with the community other than Github issues and it is not the right place for non-issue centric discussion.

    Describe the solution you'd like Adding a chatroom on any of the following platforms;

    • Gitter
    • Slack
    • Discourse

    this thread can also serve as a discussion point for the pros/cons of each platform.

    In the readme.md and website a section for community should be detailed where the link to the chatroom is provided.

    Furthermore, whichever option was chosen as the platform should also have its badge added to the top of the Readme.md.

    All of these would ensure that the community has a real time communication channel with each other and that this channel is prominently displayed for the benefit of new users.

    opened by rishavs 4
  • fix docs error

    fix docs error

    if use docs code.will get one error

      schema = await LoginSchema.from_request(request)                                                                                                                           
    AttributeError: type object 'LoginSchema' has no attribute 'from_request' 
    

    change to The correct method form_json

    opened by blue-bird1 4
  • Is this project still alive?

    Is this project still alive?

    Describe the bug A clear and concise description of what the bug is.

    To Reproduce Steps to reproduce the behavior:

    1. Go to '...'
    2. Click on '....'
    3. Scroll down to '....'
    4. See error

    Expected behavior A clear and concise description of what you expected to happen.

    Screenshots If applicable, add screenshots to help explain your problem.

    Additional context Add any other context about the problem here.

    opened by GMYXDS 2
  • The latest version does not compatiable to Python 3.9.x

    The latest version does not compatiable to Python 3.9.x

    Describe the bug Does not support Python 3.9.x I am not sure on Windows platform or MacOS, because now I fall in ubuntu 20.04.2. It's fine with Python 3.8.x

    To Reproduce Steps to reproduce the behavior:

    1. via pip install vibora[fast] or pip install vibora

    Additional context gcc and others raise

    opened by sitthykun 2
  • ImportError: cannot import name 'SO_REUSEPORT' from 'socket' || SyntaxError: invalid syntax in

    ImportError: cannot import name 'SO_REUSEPORT' from 'socket' || SyntaxError: invalid syntax in "self.async = iscoroutinefunction(handler)"

    Environment:

    • Ubuntu 18.04 bionic x86_64 Linux 4.15.0-136-generic
    • Tried on Python 3.7.10 & Python 3.8.8 - using miniconda virtual environments (conda 4.9.2)

    Code snippet used:

    from vibora import Vibora, JsonResponse
    
    app = Vibora()
    
    @app.route('/')
    async def home():
        return JsonResponse({'hello': 'world'})
    
    if __name__ == '__main__':
        app.run(host="0.0.0.0", port=8000)
    

    Steps to reproduce:

    1. pip install vibora[fast]
    $ pip install vibora[fast]
    Collecting vibora[fast]
      Using cached vibora-0.0.6-cp38-cp38-linux_x86_64.whl
    WARNING: vibora 0.0.6 does not provide the extra 'fast'
    Collecting ujson
      Using cached ujson-4.0.2-cp38-cp38-manylinux1_x86_64.whl (181 kB)
    Collecting pendulum
      Using cached pendulum-2.1.2-cp38-cp38-manylinux1_x86_64.whl (155 kB)
    Collecting uvloop
      Using cached uvloop-0.15.2-cp38-cp38-manylinux2010_x86_64.whl (4.7 MB)
    Collecting pytzdata>=2020.1
      Using cached pytzdata-2020.1-py2.py3-none-any.whl (489 kB)
    Collecting python-dateutil<3.0,>=2.6
      Using cached python_dateutil-2.8.1-py2.py3-none-any.whl (227 kB)
    Requirement already satisfied: six>=1.5 in /home/david/.local/lib/python3.8/site-packages (from python-dateutil<3.0,>=2.6->pendulum->vibora[fast]) (1.14.0)
    Installing collected packages: pytzdata, python-dateutil, uvloop, ujson, pendulum, vibora
    Successfully installed pendulum-2.1.2 python-dateutil-2.8.1 pytzdata-2020.1 ujson-4.0.2 uvloop-0.15.2 vibora-0.0.6
    
    1. Run the code snippet
    $ python test_vibora.py
    Traceback (most recent call last):
      File "test_vibora.py", line 1, in <module>
        from vibora import Vibora, JsonResponse
      File "/home/david/.miniconda3/envs/python-vibora/lib/python3.8/site-packages/vibora/__init__.py", line 7, in <module>
        from .server import *
      File "/home/david/.miniconda3/envs/python-vibora/lib/python3.8/site-packages/vibora/server.py", line 11, in <module>
        from .workers.handler import RequestHandler
      File "/home/david/.miniconda3/envs/python-vibora/lib/python3.8/site-packages/vibora/workers/handler.py", line 3, in <module>
        from socket import IPPROTO_TCP, TCP_NODELAY, SO_REUSEADDR, SOL_SOCKET, SO_REUSEPORT, socket
    ImportError: cannot import name 'SO_REUSEPORT' from 'socket' (/home/david/.miniconda3/envs/python-vibora/lib/python3.8/socket.py)
    
    1. Try the workaround proposed in https://github.com/vibora-io/vibora/issues/79#issuecomment-406616861
    import socket
    socket.SO_REUSEPORT = 15
    
    from vibora import Vibora, JsonResponse
    
    app = Vibora()
    
    @app.route('/')
    async def home():
        return JsonResponse({'hello': 'world'})
    
    if __name__ == '__main__':
        app.run(host="0.0.0.0", port=8000)
    
    1. Run the code snippet with the workaround
    $ python test_vibora.py
    Traceback (most recent call last):
      File "test_vibora.py", line 4, in <module>
        from vibora import Vibora, JsonResponse
      File "/home/david/.miniconda3/envs/python-vibora/lib/python3.8/site-packages/vibora/__init__.py", line 7, in <module>
        from .server import *
      File "/home/david/.miniconda3/envs/python-vibora/lib/python3.8/site-packages/vibora/server.py", line 11, in <module>
        from .workers.handler import RequestHandler
      File "/home/david/.miniconda3/envs/python-vibora/lib/python3.8/site-packages/vibora/workers/handler.py", line 7, in <module>
        from ..hooks import Events
      File "/home/david/.miniconda3/envs/python-vibora/lib/python3.8/site-packages/vibora/hooks.py", line 38
        self.async = iscoroutinefunction(handler)
             ^
    SyntaxError: invalid syntax
    

    Related issues: #79 #228 #106

    opened by David-Lor 1
  • docs: fix simple typo, ofuscate -> obfuscate

    docs: fix simple typo, ofuscate -> obfuscate

    There is a small typo in docs/schemas/fields.md.

    Should read obfuscate rather than ofuscate.

    Semi-automated pull request generated by https://github.com/timgates42/meticulous/blob/master/docs/NOTE.md

    opened by timgates42 0
  • 不继续开发了吗

    不继续开发了吗

    Is your feature request related to a problem? Please describe. A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]

    Describe the solution you'd like A clear and concise description of what you want to happen.

    Describe alternatives you've considered A clear and concise description of any alternative solutions or features you've considered.

    Additional context Add any other context or screenshots about the feature request here.

    opened by yxlwfds 2
  • Using pip install vibora[fast]

    Using pip install vibora[fast]

    SYSTEM

    Python 3.6.11 pipenv shell pip install vibora[fast] or pip install vibora Ubuntu 20.04 LTS Windows 10 Linux Subsystem

    pip freeze

    pendulum==2.1.2 python-dateutil==2.8.1 pytzdata==2020.1 six==1.15.0 ujson==3.1.0 uvloop==0.14.0

    CONSOLE

    ` (vibora) $ sudo python3 setup.py install running install running bdist_egg running egg_info writing vibora.egg-info/PKG-INFO writing dependency_links to vibora.egg-info/dependency_links.txt writing requirements to vibora.egg-info/requires.txt writing top-level names to vibora.egg-info/top_level.txt reading manifest file 'vibora.egg-info/SOURCES.txt' reading manifest template 'MANIFEST.in' warning: no files found matching '*.rst' anywhere in distribution warning: manifest_maker: MANIFEST.in, line 2: 'recursive-include' expects

    writing manifest file 'vibora.egg-info/SOURCES.txt' installing library code to build/bdist.linux-x86_64/egg running install_lib running build_py running build_ext building 'vibora.parsers.parser' extension x86_64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -I. -I/git/vibora/vibora -I/usr/include/python3.8 -c vibora/parsers/parser.c -o build/temp.linux-x86_64-3.8/vibora/parsers/parser.o -O3 x86_64-linux-gnu-gcc: error: vibora/parsers/parser.c: No such file or directory x86_64-linux-gnu-gcc: fatal error: no input files compilation terminated. error: command 'x86_64-linux-gnu-gcc' failed with exit status 1 ` TIPS

    Installed all python dev and essential packages.

    opened by barisx 0
cirrina is an opinionated asynchronous web framework based on aiohttp

cirrina cirrina is an opinionated asynchronous web framework based on aiohttp. Features: HTTP Server Websocket Server JSON RPC Server Shared sessions

André Roth 32 Mar 5, 2022
An easy-to-use high-performance asynchronous web framework.

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

Aber 264 Dec 31, 2022
An easy-to-use high-performance asynchronous web framework.

中文 | English 一个易用的高性能异步 web 框架。 Index.py 文档 Index.py 实现了 ASGI3 接口,并使用 Radix Tree 进行路由查找。是最快的 Python web 框架之一。一切特性都服务于快速开发高性能的 Web 服务。 大量正确的类型注释 灵活且高效的

Index.py 264 Dec 31, 2022
Async Python 3.6+ web server/framework | Build fast. Run fast.

Sanic | Build fast. Run fast. Build Docs Package Support Stats Sanic is a Python 3.6+ web server and web framework that's written to go fast. It allow

Sanic Community Organization 16.7k Jan 8, 2023
Async Python 3.6+ web server/framework | Build fast. Run fast.

Sanic | Build fast. Run fast. Build Docs Package Support Stats Sanic is a Python 3.6+ web server and web framework that's written to go fast. It allow

Sanic Community Organization 16.7k Dec 28, 2022
Asynchronous HTTP client/server framework for asyncio and Python

Async http client/server framework Key Features Supports both client and server side of HTTP protocol. Supports both client and server Web-Sockets out

aio-libs 13.2k Jan 5, 2023
Bionic is Python Framework for crafting beautiful, fast user experiences for web and is free and open source

Bionic is fast. It's powered core python without any extra dependencies. Bionic offers stateful hot reload, allowing you to make changes to your code and see the results instantly without restarting your app or losing its state.

 ⚓ 0 Mar 5, 2022
bottle.py is a fast and simple micro-framework for python web-applications.

Bottle: Python Web Framework Bottle is a fast, simple and lightweight WSGI micro web-framework for Python. It is distributed as a single file module a

Bottle Micro Web Framework 7.8k Dec 31, 2022
Fast⚡, simple and light💡weight ASGI micro🔬 web🌏-framework for Python🐍.

NanoASGI Asynchronous Python Web Framework NanoASGI is a fast ⚡ , simple and light ?? weight ASGI micro ?? web ?? -framework for Python ?? . It is dis

Kavindu Santhusa 8 Jun 16, 2022
Appier is an object-oriented Python web framework built for super fast app development.

Joyful Python Web App development Appier is an object-oriented Python web framework built for super fast app development. It's as lightweight as possi

Hive Solutions 122 Dec 22, 2022
FPS, fast pluggable server, is a framework designed to compose and run a web-server based on plugins.

FPS, fast pluggable server, is a framework designed to compose and run a web-server based on plugins. It is based on top of fastAPI, uvicorn, typer, and pluggy.

Adrien Delsalle 1 Nov 16, 2021
web.py is a web framework for python that is as simple as it is powerful.

web.py is a web framework for Python that is as simple as it is powerful. Visit http://webpy.org/ for more information. The latest stable release 0.62

null 5.8k Dec 30, 2022
Asita is a web application framework for python based on express-js framework.

Asita is a web application framework for python. It is designed to be easy to use and be more easy for javascript users to use python frameworks because it is based on express-js framework.

Mattéo 4 Nov 16, 2021
A very simple asynchronous wrapper that allows you to get access to the Oracle database in asyncio programs.

cx_Oracle_async A very simple asynchronous wrapper that allows you to get access to the Oracle database in asyncio programs. Easy to use , buy may not

null 36 Dec 21, 2022
A minimal, extensible, fast and productive API framework for Python 3.

molten A minimal, extensible, fast and productive API framework for Python 3. Changelog: https://moltenframework.com/changelog.html Community: https:/

Bogdan Popa 980 Nov 28, 2022
TinyAPI - 🔹 A fast & easy and lightweight WSGI Framework for Python

TinyAPI - ?? A fast & easy and lightweight WSGI Framework for Python

xArty 3 Apr 8, 2022
The Modern And Developer Centric Python Web Framework. Be sure to read the documentation and join the Slack channel questions: http://slack.masoniteproject.com

NOTE: Masonite 2.3 is no longer compatible with the masonite-cli tool. Please uninstall that by running pip uninstall masonite-cli. If you do not unin

Masonite 1.9k Jan 4, 2023
Free and open source full-stack enterprise framework for agile development of secure database-driven web-based applications, written and programmable in Python.

Readme web2py is a free open source full-stack framework for rapid development of fast, scalable, secure and portable database-driven web-based applic

null 2k Dec 31, 2022
Fully featured framework for fast, easy and documented API development with Flask

Flask RestPlus IMPORTANT NOTICE: This project has been forked to Flask-RESTX and will be maintained by by the python-restx organization. Flask-RESTPlu

Axel H. 2.7k Jan 4, 2023