A screamingly fast Python 2/3 WSGI server written in C.

Related tags

WSGI Servers bjoern
Overview

bjoern: Fast And Ultra-Lightweight HTTP/1.1 WSGI Server

Join the chat at https://gitter.im/jonashaag/bjoern

A screamingly fast, ultra-lightweight WSGI server for CPython 2 and CPython 3, written in C using Marc Lehmann's high performance libev event loop and Ryan Dahl's http-parser.

Why It's Cool

bjoern is the fastest, smallest and most lightweight WSGI server out there, featuring

  • ~ 1000 lines of C code
  • Memory footprint ~ 600KB
  • Python 2 and Python 3 support (thanks @yanghao!)
  • Single-threaded and without coroutines or other crap
  • Can bind to TCP host:port addresses and Unix sockets (thanks @k3d3!)
  • Full persistent connection ("keep-alive") support in both HTTP/1.0 and 1.1, including support for HTTP/1.1 chunked responses

Installation

pip install bjoern. See wiki for details.

Usage

Flask example

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello_world():
    return "Hello, World!"

if __name__ == "__main__":
    import bjoern

    bjoern.run(app, "127.0.0.1", 8000)

Advanced usage

# Bind to TCP host/port pair:
bjoern.run(wsgi_application, host, port)

# TCP host/port pair, enabling SO_REUSEPORT if available.
bjoern.run(wsgi_application, host, port, reuse_port=True)

# Bind to Unix socket:
bjoern.run(wsgi_application, 'unix:/path/to/socket')

# Bind to abstract Unix socket: (Linux only)
bjoern.run(wsgi_application, 'unix:@socket_name')

# Enable statsd metrics. See instrumentation.md for details.
bjoern.run(wsgi_application, host, port, statsd=...)

Alternatively, the mainloop can be run separately:

bjoern.listen(wsgi_application, host, port)
bjoern.run()

# With metrics. See instrumentation.md for details.
bjoern.listen(wsgi_application, host, port)
bjoern.run(statsd=...)

You can also simply pass a Python socket(-like) object. Note that you are responsible for initializing and cleaning up the socket in that case.

bjoern.server_run(socket_object, wsgi_application)
bjoern.server_run(filedescriptor_as_integer, wsgi_application)

# This needs manual compilation with `WANT_STATSD=yes`
bjoern.server_run(socket_object, wsgi_application, enable_statsd=True)
Comments
  • bjoern Python3 Port (tests/hello.py working)

    bjoern Python3 Port (tests/hello.py working)

    Introduced a single header file "py2py3.h" to handle python2/3 difference in bjoern and enable full python3 support on top of python2 support.

    This port heavily referenced the existing bjoern-py3 implementation: https://github.com/isaiah/bjoern-py3

    but removed the bytesio.c/h completely.

    opened by yanghao 25
  • *BSD support?

    *BSD support?

    I trid to build this server from source on my FreeBSD8.2 system, but found a problem make this impossible. Error happened in the "server.c" file. Because BSD use libc as default, so the <sys/sendfile.h> include will go wrong( this file is a linux feature by glibc). In BSD,there is a sendfile() function works just the same as in the Linux but has few more parameters. The do_sendfile() function wrapped the sendfile() function in your code, so I think this make its easier to port to BSD. Thanks for your excellent job!!

    Needs patch 
    opened by ghost 23
  • #162: naïve implementation of 100-continue

    #162: naïve implementation of 100-continue

    This is my first Python C extension development experience, and frankly I don't work with C very often, but I thought this would be a fun way to practice.

    So if you have time and don't mind reviewing this, I would love to know what could be improved, etc.

    I didn't see a good way to implement option 2 in the PEP 3333 suggested mechanisms for handling Expect/Continue, so I went with option 1 (i.e., if Expect is encountered and the value is "100-continue", just go ahead and write it). It would probably be better to allow the client code to make this determination, but, although we could pass the client_fd as a PyFile to the client, it doesn't really have access to the header until the entire request is parsed, and by that time, it's too late. Please correct me if I'm wrong.

    Thanks!

    opened by tjb1982 22
  • Small step toward wheel

    Small step toward wheel

    Hi @jonashaag ,

    Here is a first step to build wheels as requested by #121. This PR is a small step : it does not change release process, does not change tests, does not add CI, does not support every binary platform.

    To upload wheel, you need docker-compose and twine. Then, simply run make upload. There is two new Make targets : distclean (just cleaning dist dir) and packages to build without uploading.

    $ make distclean packages
    ...
    $ tree dist/
    dist/
    ├── bjoern-3.1.0-cp27-cp27mu-manylinux1_x86_64.whl
    ├── bjoern-3.1.0-cp27-cp27mu-manylinux2010_x86_64.whl
    ├── bjoern-3.1.0-cp35-cp35m-manylinux1_x86_64.whl
    ├── bjoern-3.1.0-cp35-cp35m-manylinux2010_x86_64.whl
    ├── bjoern-3.1.0-cp35-cp35m-manylinux2014_x86_64.whl
    ├── bjoern-3.1.0-cp36-cp36m-manylinux1_x86_64.whl
    ├── bjoern-3.1.0-cp36-cp36m-manylinux2010_x86_64.whl
    ├── bjoern-3.1.0-cp36-cp36m-manylinux2014_x86_64.whl
    ├── bjoern-3.1.0-cp37-cp37m-manylinux1_x86_64.whl
    ├── bjoern-3.1.0-cp37-cp37m-manylinux2010_x86_64.whl
    ├── bjoern-3.1.0-cp37-cp37m-manylinux2014_x86_64.whl
    ├── bjoern-3.1.0-cp38-cp38-manylinux1_x86_64.whl
    ├── bjoern-3.1.0-cp38-cp38-manylinux2010_x86_64.whl
    ├── bjoern-3.1.0-cp38-cp38-manylinux2014_x86_64.whl
    └── bjoern-3.1.0.tar.gz
    
    0 directories, 15 files
    $
    

    libev IS embedded in wheel. I'm wondering if this will trigger issue like with psycopg2 and libpq. The workaround is to use source tarball rather than wheel.

    Each wheel is pen tested in a virtualenv with test_wsgi_compliance.py.

    I hit a bug with cp27m. Instead of fighting this, I choose to blacklist it for now. Users will still use sources.

    The docker-compose.yml should be easy to translate to a CI job matrix, using either CircleCI, GitHub Action, Travis, Azure pipelines and/or appveyor.

    @jonashaag what do you think of this ?

    cc @hoefling

    opened by bersace 21
  • cpu 100% endless active loop on bjoern 1.4.2

    cpu 100% endless active loop on bjoern 1.4.2

    First of all - thanks for making this code - I find it really good approach to wsgi gateway. I wanted to give it a shot on pre-production new kind of service that I've launched recently - it's low latency rest endpoint.

    After some tests we find out that bjoern falls in active wait on epool (monitored with strace), but still handling requests right. I assume it's a bug because falling back to uwsgi solved this problem.

    launched with reuse_port, like this: bjoern.run(wsgi.application, 'localhost', 8000, reuse_port=True)

    My question is what kind of input do You need to debug?

    opened by dPeS 20
  • Create a Chaussette Backend

    Create a Chaussette Backend

    Is it possible to create a bjoern backend for chaussette ?

    I doesn't look that complicated but I don't know where to start.

    Refs mozilla-services/chaussette#26

    opened by Natim 20
  • Fixed client accepting flow

    Fixed client accepting flow

    I am currently working on a platform that uses the microservice architecture and I am testing the use of bjoern as http server for our microservices. Our microservices are behind envoy proxy and under high stress I get timeouts for about 5% of the connections.

    It seems to be a bjoern issue with the "keep-alive" flow.

    Current behavior in bjoern:

    • From time to time, after a request is served on a keep-alive connection, the new request triggers the accept_watcher/ev_io_on_request which puts bjoern in "accept mode", therefore the previous connection is terminated.

    Implemented behavior:

    • After a new client is accepted, the accept_watcher is disabled. The watcher is enabled again only on the close_connection use case.

    This has been tested with the version 3.0.1.

    opened by BlackJohnny 15
  • Poor performance on Linux

    Poor performance on Linux

    Hello, I'm assembling some performance results and found that Bjoern is much faster on macOS than on Linux.

    I get one eighth the performance on Linux benchmarking with wrk. Is this by design? Is macOS the preferred platform or is something wrong?

    opened by ghost 14
  • Bjoern Installation Fails on Mac OS X 10.6 w/ Homebrew, Xcode 4

    Bjoern Installation Fails on Mac OS X 10.6 w/ Homebrew, Xcode 4

    Interestingly enough, a fresh install still produces errors. The process:

    1. Install Mac OS X 10.6.
    2. Install Xcode 4 Build 4A225.
    3. Install latest Python 2.7 from .pkg installer.
    4. Install homebrew and run: brew install libev
    5. Install virtualenv for 2.7, create a new environment, and enter it.
    6. Run: pip install bjoern

    The pip.log is: http://dpaste.de/wDGo/

    Again it seems like I'm dealing with architecture (x86 vs. x64) issues. I'll have to see if there's a way to make brew install universal (dual 32-bit and 64-bit) versions.

    opened by amcgregor 14
  • Add statsd metrics on server events

    Add statsd metrics on server events

    I've added metrics wherever they made sense to me, these are all simple increment metrics counting the number of times an event happened.

    There is scope for gauge and timer too but I'm not sure those will be as helpful inside bjoern, almost all of these can also be exposed from the WSGI app.

    I don't write C a lot so please feel free to suggest code design changes.

    closes #167

    opened by Gufran 13
  • Installation fails on Mac OS X 10.6.

    Installation fails on Mac OS X 10.6.

    Python 2.7, latest Snow Leopard, libev 3.9 installed via ports. Installed via:

    sudo port install libev virtualenv --no-site-packages --distribute sandbox cd sandbox ; . bin/activate pip install bjoern

    The result is that ev.h can't be found and thus a whole slew of errors and warnings are displayed. The version of Python, operating system, and the exact errors/warnings I believe are irrelevant to this problem; ports likely installed libev in /usr/local instead of /usr.

    How would I tell pip (or, if I clone the repo, setup.py) to check a different location for includes/libraries?

    opened by amcgregor 13
  • Implement graceful shutdown

    Implement graceful shutdown

    Hi! This PR attempts to implement per the recommendation in this comment https://github.com/jonashaag/bjoern/issues/91#issuecomment-493710529. The commit message provides more detail on exactly

    Note that one distinct difference from the suggested implementation is that the listener socket is closed after the backlog is drained. For my use case (running many instances of my HTTP server using SO_REUSEPORT) this works better, as it will ensure that any new connections will go to other instances ASAP and ensure this given instance can shutdown relatively quickly. Based on further discussion on the issue, I think this would be the most beneficial behavior for others too. If you'd like that behavior to be configurable as well, just let me know and I can add another config flag for it.

    (hopefully) fixes #91.

    opened by nhoad 1
  • calling from command line like gunicorn in Profcfile

    calling from command line like gunicorn in Profcfile

    How we can call from command line like gunicorn... web: gunicorn main:application --workers=13 --threads=2 --worker-connections=1000 --keep-alive=1800 --worker-class=uvicorn.workers.UvicornWorker --timeout 3600 --log-level=debug this how we are using to call your application inside aws elastic bean stack inside the Procfile..

    I am new to this, Please guide me.

    opened by gudipudipradeep 1
  • unix sockets aren't released on SIGHUP

    unix sockets aren't released on SIGHUP

    I'm on macOS 11.5.2. After stopping the server via SIGHUP and then starting again on the same Unix socket I get the following error:

    OSError: [Errno 48] Address already in use

    Is this expected? I currently have to keep changing the Unix socket path every time I restart the server from my IDE.

    opened by slayerjain 3
  • Installation Fails On Repl.it

    Installation Fails On Repl.it

    Traceback:

    `Repl.it: Updating package configuration

    --> python3 -m poetry add Bjoern Using version ^3.1.0 for Bjoern

    Updating dependencies Resolving dependencies...

    Package operations: 1 install, 0 updates, 0 removals

    • Installing Bjoern (3.1.0)

    [EnvCommandError] Command ['/opt/virtualenvs/python3/bin/pip', 'install', '--no-deps', 'bjoern==3.1.0'] errored with the following return code 1, and output: Collecting bjoern==3.1.0 Using cached https://files.pythonhosted.org/packages/8f/d9/729bed4f535574bd2ca7d541e88f94f5ae678c341f4df153a70a3ff3a695/bjoern-3.1.0.tar.gz Building wheels for collected packages: Bjoern Building wheel for Bjoern (setup.py): started Building wheel for bjoern (setup.py): finished with status 'error' ERROR: Command errored out with exit status 1: command: /opt/virtualenvs/python3/bin/python3 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-sntn21hu/bjoern/setup.py'"'"'; file='"'"'/tmp/pip-install-sntn21hu/bjoern/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(file);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, file, '"'"'exec'"'"'))' bdist_wheel -d /tmp/pip-wheel-rsvbklsv --python-tag cp38 cwd: /tmp/pip-install-sntn21hu/bjoern/ Complete output (20 lines): running bdist_wheel running build running build_py creating build creating build/lib.linux-x86_64-3.8 copying bjoern.py -> build/lib.linux-x86_64-3.8 running build_ext building '_bjoern' extension creating build/temp.linux-x86_64-3.8 creating build/temp.linux-x86_64-3.8/http-parser creating build/temp.linux-x86_64-3.8/bjoern 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 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -DSIGNAL_CHECK_INTERVAL=0.1 -DWANT_SIGNAL_HANDLING=yes -DWANT_SIGINT_HANDLING=yes -Ihttp-parser -Istatsd-c-client -I/usr/include/libev -I/opt/local/include -I/opt/virtualenvs/python3/include -I/usr/include/python3.8 -c http-parser/http_parser.c -o build/temp.linux-x86_64-3.8/http-parser/http_parser.o -std=c99 -fno-strict-aliasing -fcommon -fPIC -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -g 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 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -DSIGNAL_CHECK_INTERVAL=0.1 -DWANT_SIGNAL_HANDLING=yes -DWANT_SIGINT_HANDLING=yes -Ihttp-parser -Istatsd-c-client -I/usr/include/libev -I/opt/local/include -I/opt/virtualenvs/python3/include -I/usr/include/python3.8 -c bjoern/_bjoernmodule.c -o build/temp.linux-x86_64-3.8/bjoern/_bjoernmodule.o -std=c99 -fno-strict-aliasing -fcommon -fPIC -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -g In file included from bjoern/wsgi.h:2:0, from bjoern/_bjoernmodule.c:3: bjoern/request.h:4:10: fatal error: ev.h: No such file or directory #include <ev.h> ^~~~~~ compilation terminated. error: command 'x86_64-linux-gnu-gcc' failed with exit status 1

    ERROR: Failed building wheel for Bjoern Running setup.py clean for bjoern Failed to build bjoern Installing collected packages: bjoern Running setup.py install for bjoern: started Running setup.py install for bjoern: finished with status 'error' ERROR: Command errored out with exit status 1: command: /opt/virtualenvs/python3/bin/python3 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-sntn21hu/bjoern/setup.py'"'"'; file='"'"'/tmp/pip-install-sntn21hu/bjoern/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(file);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, file, '"'"'exec'"'"'))' install --record /tmp/pip-record-kbxfyffj/install-record.txt --single-version-externally-managed --compile --install-headers /opt/virtualenvs/python3/include/site/python3.8/bjoern cwd: /tmp/pip-install-sntn21hu/bjoern/ Complete output (20 lines): running install running build running build_py creating build creating build/lib.linux-x86_64-3.8 copying bjoern.py -> build/lib.linux-x86_64-3.8 running build_ext building '_bjoern' extension creating build/temp.linux-x86_64-3.8 creating build/temp.linux-x86_64-3.8/http-parser creating build/temp.linux-x86_64-3.8/bjoern 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 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -DSIGNAL_CHECK_INTERVAL=0.1 -DWANT_SIGNAL_HANDLING=yes -DWANT_SIGINT_HANDLING=yes -Ihttp-parser -Istatsd-c-client -I/usr/include/libev -I/opt/local/include -I/opt/virtualenvs/python3/include -I/usr/include/python3.8 -c http-parser/http_parser.c -o build/temp.linux-x86_64-3.8/http-parser/http_parser.o -std=c99 -fno-strict-aliasing -fcommon -fPIC -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -g 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 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -DSIGNAL_CHECK_INTERVAL=0.1 -DWANT_SIGNAL_HANDLING=yes -DWANT_SIGINT_HANDLING=yes -Ihttp-parser -Istatsd-c-client -I/usr/include/libev -I/opt/local/include -I/opt/virtualenvs/python3/include -I/usr/include/python3.8 -c bjoern/_bjoernmodule.c -o build/temp.linux-x86_64-3.8/bjoern/_bjoernmodule.o -std=c99 -fno-strict-aliasing -fcommon -fPIC -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -g In file included from bjoern/wsgi.h:2:0, from bjoern/_bjoernmodule.c:3: bjoern/request.h:4:10: fatal error: ev.h: No such file or directory #include <ev.h> ^~~~~~ compilation terminated. error: command 'x86_64-linux-gnu-gcc' failed with exit status 1 ---------------------------------------- ERROR: Command errored out with exit status 1: /opt/virtualenvs/python3/bin/python3 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-sntn21hu/bjoern/setup.py'"'"'; file='"'"'/tmp/pip-install-sntn21hu/bjoern/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(file);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, file, '"'"'exec'"'"'))' install --record /tmp/pip-record-kbxfyffj/install-record.txt --single-version-externally-managed --compile --install-headers /opt/virtualenvs/python3/include/site/python3.8/bjoern Check the logs for full command output. WARNING: You are using pip version 19.3.1; however, version 21.0.1 is available. You should consider upgrading via the 'pip install --upgrade pip' command.

    exit status 1

    Repl.it: Package operation failed.`

    opened by Black-Blaze 3
  • Is there a way to set timeouts?

    Is there a way to set timeouts?

    I just started using bjoern on my project and it's been going great so far. What I'd like to know is if there's a way to globally set a timeout for requests.

    My project is a very simple API with a few endpoints, but sometimes the request will take too long and I'd like to set a timeout for all endpoints

    the code looks something like this:

    from flask import Flask
    
    app = Flask(__name__)
    host = "0.0.0.0"
    port = 5000
    
    @app.route("/up", methods=["POST"])
    def up():
        res = doSomething()
        return(res)
    
    @app.route("/down", methods=["POST"])
    def down():
        res = doSomethingElse()
        return(res)
    
    if __name__ == "__main__":
        import bjoern
        bjoern.run(app, host, port)
    

    what I'd like to happen is to end the connection if either /up or /down takes more than 20s. is that possible?

    opened by pfortini 2
  • Is there a way to limit or actively close connections?

    Is there a way to limit or actively close connections?

    bjoern seems to keep the connection alive as long as possible and doesn't have a limitation of how many connections to keep. And I didn't find a way to disable, control or limit the keep-alive behavior (without editing and recompile the code) image

    It become an issue when there are tons of clients trying keeping the connection alive, since that's the default behavior, but it's a burden to the server since most connection are just idling.

    opened by mayli 7
Owner
Jonas Haag
Freelancer available for hire. Founder looking for new challenges. Previously CTO @cashlink
Jonas Haag
Waitress - A WSGI server for Python 2 and 3

Waitress Waitress is a production-quality pure-Python WSGI server with very acceptable performance. It has no dependencies except ones which live in t

Pylons Project 1.2k Dec 30, 2022
Meinheld is a high performance asynchronous WSGI Web Server (based on picoev)

What's this This is a high performance python wsgi web server. And Meinheld is a WSGI compliant web server. (PEP333 and PEP3333 supported) You can als

Yutaka Matsubara 1.4k Jan 1, 2023
Robyn is an async Python backend server with a runtime written in Rust, btw.

Robyn is an async Python backend server with a runtime written in Rust, btw. Python server running on top of of Rust Async RunTime. Installation

Sanskar Jethi 1.8k Dec 30, 2022
The lightning-fast ASGI server. 🦄

The lightning-fast ASGI server. Documentation: https://www.uvicorn.org Community: https://discuss.encode.io/c/uvicorn Requirements: Python 3.6+ (For P

Encode 6k Jan 3, 2023
livereload server in python (MAINTAINERS NEEDED)

LiveReload Reload webpages on changes, without hitting refresh in your browser. Installation python-livereload is for web developers who know Python,

Hsiaoming Yang 977 Dec 14, 2022
Python HTTP Server

Python HTTP Server Preview Languange and Code Editor: How to run? Download the zip first. Open the http.py and wait 1-2 seconds. You will see __pycach

SonLyte 16 Oct 21, 2021
Green is a clean, colorful, fast python test runner.

Green -- A clean, colorful, fast python test runner. Features Clean - Low redundancy in output. Result statistics for each test is vertically aligned.

Nathan Stocks 756 Dec 22, 2022
An HTTP server to easily download and upload files.

httpsweet An HTTP server to easily download and upload files. It was created with flexibility in mind, allowing be used in many different situations,

Eloy 17 Dec 23, 2022
Scalable user load testing tool written in Python

Locust Locust is an easy to use, scriptable and scalable performance testing tool. You define the behaviour of your users in regular Python code, inst

Locust.io 20.4k Jan 8, 2023
A cross-platform GUI automation Python module for human beings. Used to programmatically control the mouse & keyboard.

PyAutoGUI PyAutoGUI is a cross-platform GUI automation Python module for human beings. Used to programmatically control the mouse & keyboard. pip inst

Al Sweigart 7.6k Jan 1, 2023
splinter - python test framework for web applications

splinter - python tool for testing web applications splinter is an open source tool for testing web applications using Python. It lets you automate br

Cobra Team 2.6k Dec 27, 2022
Let your Python tests travel through time

FreezeGun: Let your Python tests travel through time FreezeGun is a library that allows your Python tests to travel through time by mocking the dateti

Steve Pulec 3.5k Jan 9, 2023
HTTP client mocking tool for Python - inspired by Fakeweb for Ruby

HTTPretty 1.0.5 HTTP Client mocking tool for Python created by Gabriel Falcão . It provides a full fake TCP socket module. Inspired by FakeWeb Github

Gabriel Falcão 2k Jan 6, 2023
A utility for mocking out the Python Requests library.

Responses A utility library for mocking out the requests Python library. Note Responses requires Python 2.7 or newer, and requests >= 2.0 Installing p

Sentry 3.8k Jan 2, 2023
A test fixtures replacement for Python

factory_boy factory_boy is a fixtures replacement based on thoughtbot's factory_bot. As a fixtures replacement tool, it aims to replace static, hard t

FactoryBoy project 3k Jan 5, 2023
Mixer -- Is a fixtures replacement. Supported Django, Flask, SqlAlchemy and custom python objects.

The Mixer is a helper to generate instances of Django or SQLAlchemy models. It's useful for testing and fixture replacement. Fast and convenient test-

Kirill Klenov 871 Dec 25, 2022
Faker is a Python package that generates fake data for you.

Faker is a Python package that generates fake data for you. Whether you need to bootstrap your database, create good-looking XML documents, fill-in yo

Daniele Faraglia 15.2k Jan 1, 2023
Mimesis is a high-performance fake data generator for Python, which provides data for a variety of purposes in a variety of languages.

Mimesis - Fake Data Generator Description Mimesis is a high-performance fake data generator for Python, which provides data for a variety of purposes

Isaak Uchakaev 3.8k Jan 1, 2023
Coroutine-based concurrency library for Python

gevent Read the documentation online at http://www.gevent.org. Post issues on the bug tracker, discuss and ask open ended questions on the mailing lis

gevent 5.9k Dec 28, 2022