Simple XML-RPC and JSON-RPC server for modern Django

Overview

django-modern-rpc

Downloads Tests Documentation Status Link to demo

Build an XML-RPC and/or JSON-RPC server as part of your Django project. Major Django and Python versions are supported

Main features

  • XML-RPC and JSON-RPC 2.0 support (JSON-RPC 1.0 is NOT supported)
  • HTTP Basic Auth & custom authentication methods
  • Multiple entry-points: group your RPC methods under different paths to apply specific rules, authentication, protocol support, etc.
  • API docs generation (based on docstring)

Requirements

The following Django / Python version are supported, according to Django requirements (see here and here)

🠗 Django \ Python 🠖 3.5 3.6 3.7 3.8 3.9
2.1 🟩 🟩 🟩 🟥 🟥
2.2 🟩 🟩 🟩 🟩 🟩
3.0 🟥 🟩 🟩 🟩 🟩
3.1 🟥 🟩 🟩 🟩 🟩
3.2 🟥 🟩 🟩 🟩 🟩
4.0 🟥 🟥 🟥 🟩 🟩

Setup

A quick start is available as part of the documentation to help setting up you project: https://django-modern-rpc.readthedocs.io/en/latest/quickstart.html

Code quality

Continuous integration and code analysis is performed automatically to ensure a decent code quality. Project health is publicly available on following apps:

Codacy Badge Codacy Badge Coverage Status

Comments
  • Application import symantics hide errors

    Application import symantics hide errors

    If there is an import error in rpc_methods.py (or whatever it's called in a given instance) then the current import semantics in modernrpc/apps.py mean the error is ignored. Even worse, it fails to pick up any logger so the actual error just creates the text: No handlers could be found for logger "modernrpc.apps" in the django log. It should at least say something like. Perhaps there should be a wrapper round getLogger in case the logging is not configured for such an important non-runtime error.

     except ImportError as er:
                        logger.warning('Unable to load module "{}". Please check MODERNRPC_METHODS_MODULES for invalid'
                                       ' names'.format(module_name))
                        print "Error:", module_name, er
                        continue
    

    to repeat: create and register an rpc_methods.py with the like "import no_such_module" at the top.

    enhancement 
    opened by J-A-M 10
  • No way to catch exception

    No way to catch exception

    Accroding to https://github.com/alorence/django-modern-rpc/blob/master/modernrpc/views.py#L97 and https://github.com/alorence/django-modern-rpc/blob/master/modernrpc/handlers/jsonhandler.py#L176

    Looks like there is no way to raise Exception to top level. So there is no way to log it with django logging module or sentry for instance. In settings.DEBUG=True mode exception must be raised and NOT 'swallowed' or 'silented' by inner try/exception block and returned as normal response output

    enhancement needmoreinfo 
    opened by sergio-bershadsky 6
  • Changes around Django 3

    Changes around Django 3

    @alorence let me know if the changes look good.

    If possible would you make a small release to pick up these changes? We'd like to upgrade to Django 3 as soon as possible (or at least resolve this issue and continue patching other libraries if necessary).

    opened by atodorov 4
  • set_authentication_predicate bug

    set_authentication_predicate bug

    If a user wants to use set_authentication_predicate as decorator, as explained in the tutorial:

    https://django-modern-rpc.readthedocs.io/en/latest/advanced/authentication.html#basics

    then that function should be like this:

    def set_authentication_predicate(predicate, params=None):
        """
        Assign a new authentication predicate to an RPC method.
        This is the most generic decorator used to implement authentication.
        Predicate is a standard function with the following signature:
        .. code:: python
           def my_predicate(request, *params):
               # Inspect request and extract required information
               if <condition>:
                   # The condition to execute the method are met
                   return True
               return False
        :param predicate:
        :param params:
        :return:
        """
        
        def decorator(rpc_method):
            if hasattr(rpc_method, 'modernrpc_auth_predicates'):
                rpc_method.modernrpc_auth_predicates.append(predicate)
                rpc_method.modernrpc_auth_predicates_params.append(params)
    
            else:
                rpc_method.modernrpc_auth_predicates = [predicate]
                rpc_method.modernrpc_auth_predicates_params = [params]
    
            return rpc_method
    
        return  decorator
    
    bug 
    opened by aplicacionamedida 4
  • Convert single newlines into a space in HTML docs.

    Convert single newlines into a space in HTML docs.

    CHANGE SUMMARY

    A single new in a docstring would be converted into a (broken) <br/ string, causing the line to be ignored by some browsers until the next tag. Because a single new line is often used to continue a paragraph without exceeding Python's 72 character docstring length convention, we now convert single newlines into spaces, which allows a paragraph to be formatted to the width of the browser window in plain RPC method documentation.

    SCREENSHOTS

    Given the following docstring:

    image

    In Chrome, the previous HTML rendered as follows:

    image

    After this change, it renders as:

    image

    opened by adamdonahue 4
  • DeprecationWarning somewhere hidden

    DeprecationWarning somewhere hidden

    Hi, I am using your app (love it) for a week or so, however I would really like to get rid of the following message I get as soon as I add the app to my INSTALLED_APPS list:

    DeprecationWarning: __class__ not set defining 'AbstractBaseUser' as <class 'django.contrib.auth.base_user.AbstractBaseUser'>. Was __classcell__ propagated to type.__new__?
      class AbstractBaseUser(models.Model):
    

    I have tried to seek for myself where it's coming from but I cannot seem to find it.

    My requirements.txt:

    appdirs==1.4.0
    Django==1.10.5
    django-modern-rpc==0.4.2
    mysqlclient==1.3.9
    packaging==16.8
    pyparsing==2.1.10
    six==1.10.0
    

    Do you know where it's coming from and how it can be fixed?

    Thanks!

    invalid 
    opened by pvanagtmaal 4
  • XML-RPC: Response to request with pk [xyz] has content type application/json but was unable to parse it

    XML-RPC: Response to request with pk [xyz] has content type application/json but was unable to parse it

    I upgraded to the latest alpha in order to try out my app with Python 3.11, and got this error. It looks like response is being returned with content-type: "application/json" even for xml-rpc endpoints.

    opened by sean-wallace 3
  • Silent warning on load

    Silent warning on load

    I got this

    Warning: Unable to load module "api.rpc_methods" declared in settings.MODERNRPC_METHODS_MODULES. Please ensure it is available and doesn't contain any error

    and no trace with logger configured to handle modernrpc.

    I believe this should be critical error with trace back and exit, as it would be with bug in Django view. Or even better, such exceptions should not be handled by Django-modern-rpc at all. This is not runtime exception like while calling rpc - where it is ok to intercept exception and return error in json-rpm response. This is start up error, so while developing app I have to immediately know where the bug is.

    opened by luzik 3
  • django-modern-rpc not compatible with Django 3.1 (alpha)

    django-modern-rpc not compatible with Django 3.1 (alpha)

    core.py imports trim_docstring which has been removed from Django in https://github.com/django/django/commit/f47ba7e78033f39742c3bf491e9b15365cefd0db#diff-618578d61e31fcaf38482c8853e9c5f5

    opened by washeck 3
  • Expose models via RPC?

    Expose models via RPC?

    Hi folks, I have a decent size project at https://github.com/kiwitcms/Kiwi which does have a custom grown XML-RPC interface (legacy code) pretty much all of which exposes the available models and variations of the filter/get/create and update methods. The underlying methods boil down to performing a query, iterating over it and serializing every object as a dictionary. Then there's a Python API client which duplicates most of this structure in order to read the serialized data and turn it back into something more Pythonic.

    How hard would be to expose models over RPC with modernrpc ? If that is doable I'd rather spend my time contributing a PR to you and dropping all the legacy stuff in Kiwi instead of manually going through each of our exposed RPC methods and figuring out of there are duplicates or not.

    question 
    opened by atodorov 3
  • JSON-RPC batch requests not supported

    JSON-RPC batch requests not supported

    Sending batch requests causes "Invalid request, Payload object must be a struct" error.

    Batch requests feature is part of 2.0 spec, please remove "JSON-RPC 2.0 support" notice in your documentation or implement this feature.

    enhancement 
    opened by sergio-bershadsky 3
  • RFC: rate limit support

    RFC: rate limit support

    I had the impression that this library supported rate limiting but I can't find anything on that topic. Maybe I am wrong.

    In any case has anyone tried other rate-limiting libraries in conjunction with django-modern-rpc?

    If not what do people think about adding such support? Any hints to implementation? I can work on a PR sometime in the future as I will probably need such functionality.

    enhancement question 
    opened by atodorov 1
Releases(1.0.0a4)
  • 1.0.0a4(Nov 30, 2022)

  • 1.0.0a3(Jun 13, 2022)

  • 1.0.0a2(Jun 1, 2022)

  • 1.0.0a1(Mar 3, 2022)

  • 0.12.1(Nov 9, 2020)

  • 0.12.0(Nov 9, 2020)

    Requirements

    • Django 2.1, 2.2 and 3.0 are now officially supported. Thanks to @atodorov for 3.0 compatibility
    • Added Python 3.7 and 3.8 support
    • Dropped Python 3.3 support

    Improvements

    • To ensure compatibility with JSON-RPC 1.2, 2 more "Content-Type" values are supported by JSON-RPC Handler: "application/json-rpc" and "application/jsonrequest" #24). Thanks to @dansan
    Source code(tar.gz)
    Source code(zip)
  • 0.11.1(May 13, 2018)

    Improvements

    Last release introduced some undocumented breaking API changes regarding RPC registry management. Old API has been restored for backward compatibility. The following global functions are now back in the API:

    • modernrpc.core.register_rpc_method()
    • modernrpc.core.get_all_method_names()
    • modernrpc.core.get_all_methods()
    • modernrpc.core.get_method()
    • modernrpc.core.reset_registry()

    In addition, some improvements have been applied to unit tests, to make sure test environment is the same after each test function. In addition, some exclusion patterns have been added in .coveragerc file to increase coverage report accuracy.

    Source code(tar.gz)
    Source code(zip)
  • 0.11.0(Apr 25, 2018)

    Improvements

    • Django 2.0 is now officially supported. Tox and Travis default config have been updated to integrate Django 2.0 in existing tests environements.
    • Method's documentation is generated only if needed and uses Django's @cached_property decorator
    • HTML documentation default template has been updated: Bootstrap 4.1.0 stable is now used, and the rendering has been improved.

    API Changes

    • Class RPCRequest has been removed and replaced by method execute_procedure(name, args, kwargs) in RPCHandler class. This method contains common logic used to retrieve a RPC method, execute authentication predicates to make sure it can be run, execute the concrete method and return the result.
    • HTML documentation content is not anymore marked as "safe" using django.utils.safestring.mark_safe(). You have to use Django decorator safe in your template if you display this value.

    Settings

    • The kwargs dict passed to RPC methods can have customized keys (#18). Set the following values:

      • settings.MODERNRPC_KWARGS_REQUEST_KEY
      • settings.MODERNRPC_KWARGS_ENTRY_POINT_KEY
      • settings.MODERNRPC_KWARGS_PROTOCOL_KEY
      • settings.MODERNRPC_KWARGS_HANDLER_KEY

    to override dict keys and prevent conflicts with your own methods arguments.

    Other updates

    • Many units tests have been improved. Some tests with many calls to LiveServer have been splitted into shorter ones.
    Source code(tar.gz)
    Source code(zip)
  • 0.10.0(Dec 7, 2017)

    Improvements

    • Logging system / error management

      • In case of error, current exception stacktrace is now passed to logger by default. This allows special handler like django.utils.log.AdminEmailHandler or raven.handlers.logging.SentryHandler to use it to report more useful information (#13)
      • Error messages have been rewritten to be consistent across all modules and classes
      • Decrease log verbosity: some INFO log messages now have DEBUG level (startup methods registration)
    • Documentation has been updated

      • Added a page to explain how to configure RPC methods documentation generation, and add a note to explicitly state that markdown or docutils package must be installed if settings.MODERNRPC_DOC_FORMAT is set to non-empty value (#16)
      • Added a page to list implemented system introspection methods
      • Added a bibliography page, to list all references used to write the library
    • Default template for generated RPC methods documentation now uses Bootstrap 4.0.0-beta.2 (previously 4.0.0-alpha.5)

    Source code(tar.gz)
    Source code(zip)
  • 0.9.0(Oct 3, 2017)

    This is a major release, with many improvements, protocol support and bug fixes. This version introduce an API break, please read carefully.

    Improvements:

    • Class RPCException and its subclasses now accept an additional data argument (#10). This is used by JSON-RPC handler to report additional information to user in case of error. This data is ignored in XML-RPC response.
    • JSON-RPC: Batch requests are now supported (#11)
    • JSON-RPC: Named parameters are now supported (#12)
    • JSON-RPC: Notification calls are now supported. Missing id in payload is no longer considered as invalid, but is correectly handled. No HTTP response is returned in such case, according to the standard.
    • XML-RPC: exception raised when serializing data to XML are now catched as InternalError and a clear error message

    API Changes:

    • modernrpc.handlers.JSONRPC and modernrpc.handlers.XMLRPC have been moved and renamed. They become respectively modernrpc.core.JSONRPC_PROTOCOL and modernrpc.core.XMLRPC_PROTOCOL
    • RPCHandler class updated, as well as subclases XMLRPCHandler and JSONRPCHandler. RPCHandler.parse_request() is now RPCHandler.process_request(). The new method does not return a tuple (method_name, params) anymore. Instead, it executes the underlying RPC method using new class RPCRequest. If you customized your handlers, please make sure you updated your code (if needed).

    In addition, this version contains minor updates to prepare future compatibility with Django 2.0

    Source code(tar.gz)
    Source code(zip)
  • 0.8.1(Oct 2, 2017)

    This version is a security fix. Upgrade is highly recommended

    • Security: Authentication backend is correctly checked when executing method using system.multicall()
    Source code(tar.gz)
    Source code(zip)
  • 0.8.0(Jul 12, 2017)

    • Fixed invalid HTML tag rendered from RPC Method documentation. Single new lines are converted to space since they are mostly used to limit docstrings line width. See pull request #7, thanks to @adamdonahue
    • Fixed issue #8: signature of auth.set_authentication_predicate has been fixed so it can be used as decorator. Thanks to @aplicacionamedida
    Source code(tar.gz)
    Source code(zip)
  • 0.7.1(Jun 24, 2017)

    • Removed useless settings variable introduced in last 0.7.0 release. Logging capabilities are now enabled by simply configuring a logger for modernrpc.* modules, using Django variable LOGGING. The documentation has been updated accordingly.
    Source code(tar.gz)
    Source code(zip)
  • 0.7.0(Jun 24, 2017)

  • 0.6.0(Jun 24, 2017)

    • Many performance improvements. The Django cache system was previously used to store the list of available methods in the current project. This was mostly useless, and caused issues with some cache systems (#5). Use of cache system has been completely removed. The list of RPC methods is computed when the application is started and kept in memory until it is stopped.
    Source code(tar.gz)
    Source code(zip)
  • 0.5.2(Apr 18, 2017)

    • User instance is now correctly stored in the current request after successful authentication [#4]
    • Unit testing with Django 1.11 is now performed against release version (Beta and RC are not tested anymore)
    • Documentation has been improved
    Source code(tar.gz)
    Source code(zip)
  • 0.5.1(Mar 25, 2017)

    • When RPC methods are registered, if a module file contains errors, a python warning is produced. This ensure the message will be displayed even if the logging system is not configured in a project (#2)
    • Python 2 strings standardization. Allow to configure an automatic conversion of incoming strings, to ensure they have the same type in RPC method, no matter what protocol was used to call it. Previously, due to different behavior between JSON and XML deserializers, strings were received as str when method was called via XML-RPC and as unicode with JSON-RPC. This standardization process is disabled by default, and can be configured for the whole project or for specific RPC methods.
    • Tests are performed on Django 1.11rc1
    • modernrpc.core.register_method() function was deprecated since version 0.4.0 and has been removed.
    Source code(tar.gz)
    Source code(zip)
  • 0.5.0(Feb 19, 2017)

    • Typo fixes
    • JSON-RPC 2.0 standard explicitly allows requests without 'parmas' member. This doesn't produce error anymore.
    • Setting variable MODERNRPC_XML_USE_BUILTIN_TYPES is now deprecated in favor of MODERNRPC_XMLRPC_USE_BUILTIN_TYPES
    • Unit tests are now performed with python 3.6 and Django 1.11 alpha, in addition to supported environment already tested. This is a first step to full support for these environments.
    • HTTP "Basic Auth" support: it is now possible to define RPC methods available only to specific users. The control can be done on various user attributes: group, permission, superuser status, etc. Authentication backend can be extended to support any method based on incoming request.
    Source code(tar.gz)
    Source code(zip)
  • 0.4.2(Nov 20, 2016)

    • Various performance improvements
    • Better use of logging framework (python builtin) to report errors & exceptions from library and RPC methods
    • Rewritten docstring parser. Markdown and reStructured formatters are still supported to generate HTML documentation for RPC methods. They now have unit tests to validate their behavior.
    • @rpc_method decorator can be used with or without parenthesis (and this feature is tested)
    • System methods have been documented
    Source code(tar.gz)
    Source code(zip)
  • 0.4.1(Nov 17, 2016)

    • Method arguments documentation keep the same order as defined in docstring
    • API change: MODERNRPC_ENTRY_POINTS_MODULES setting have been renamed to MODERNRPC_METHODS_MODULES.
    • A simple warning is displayed when MODERNRPC_METHODS_MODULES is not set, instead of a radical ImproperlyConfigured exception.
    • Some traces have been added to allow debugging in the module easily. It uses the builtin logging framework.
    Source code(tar.gz)
    Source code(zip)
  • 0.4.0(Nov 17, 2016)

    • API change: new unified way to register methods. Documentation in progress
    • API change: XMl-RPC handler will now correctly handle None values by default. This behavior can be configured using MODERNRPC_XMLRPC_ALLOW_NONE setting.
    • Bugfix: when django use a persistent cache (Redis, memcached, etc.), ensure the registry is up-to-date with current sources at startup
    Source code(tar.gz)
    Source code(zip)
  • 0.3.2(Oct 26, 2016)

    • Include missing templates in pypi distribution packages
    • HTML documentation automatically generated for an entry point
    • 'system.multicall' is now supported, only in XML-RPC
    • Many tests added
    Source code(tar.gz)
    Source code(zip)
  • 0.3.0(Oct 18, 2016)

    • Settings variables have been renamed to limit conflicts with other libraries. In the future, all settings will have the same prefix.

      • JSONRPC_DEFAULT_DECODER becomes MODERNRPC_JSON_DECODER
      • JSONRPC_DEFAULT_ENCODER becomes MODERNRPC_JSON_ENCODER

      See https:/alorence/django-modern-rpc/blob/master/modernrpc/modernrpc_settings.py for more details

    • Many other settings added, to make the library more configurable. See http://django-modern-rpc.readthedocs.io/en/latest/basic_usage/settings.html

    • RPC methods can now declare the special **kwargs parameter. The dict will contain information about current context (request, entry point, protocol, etc.)

    • About 12 tests added to increase coverage

    • Many documentation improvements

    • 'system.methodHelp' is now supported

    Source code(tar.gz)
    Source code(zip)
  • 0.2.1(Oct 12, 2016)

    • Project is now configured to report tests coverage. See https://coveralls.io/github/alorence/django-modern-rpc
    • Some documentation have been added, to cover more features of the library. See http://django-modern-rpc.readthedocs.io/en/latest/
    • Many unit tests added to increase coverage
    • RPCEntryPoint class can now be configured to handle only requests from a specific protocol
    Source code(tar.gz)
    Source code(zip)
  • 0.2.0(Oct 5, 2016)

    • Added very basic documentation: http://django-modern-rpc.rtfd.io/
    • 'system.listMethods' is now supported
    • 'system.methodSignature' is now supported
    • Error reporting has been improved. Correct error codes and messages are returned on usual fail cause. See module modernrpc.exceptions for more information.
    • Many unit tests have been added to increase test coverage of the library
    Source code(tar.gz)
    Source code(zip)
  • 0.1.0(Oct 12, 2016)

    • First version with very basic features:
      • Works with Python 2.7, 3.3, 3.4 (Django 1.8 only) and 3.5
      • Works with Django 1.8, 1.9 and 1.10
      • Supports JSON-RPC and XML-RPC simple requests
      • Supports multiple entry-points with defined list of methods and supported protocols
    • Some important features are still missing:
      • No authentication support
      • Unit tests doesn't cover all the code
      • RPC system methods utility (listMethods, methodSignature, etc.) are not implemented
      • There is no way to provide documentation in HTML form
      • The library itself doesn't have any documentation (appart from README.md)
    Source code(tar.gz)
    Source code(zip)
DRF_commands is a Django package that helps you to create django rest framework endpoints faster using manage.py.

DRF_commands is a Django package that helps you to create django rest framework endpoints faster using manage.py.

Mokrani Yacine 2 Sep 28, 2022
Exemplo de biblioteca com Django

Bookstore Exemplo de biblioteca feito com Django. Este projeto foi feito com: Python 3.9.7 Django 3.2.8 Django Rest Framework 3.12.4 Bootstrap 4.0 Vue

Regis Santos 1 Oct 28, 2021
Create a netflix-like service using Django, React.js, & More.

Create a netflix-like service using Django. Learn advanced Django techniques to achieve amazing results like never before.

Coding For Entrepreneurs 67 Dec 08, 2022
Django/Jinja template indenter

DjHTML A pure-Python Django/Jinja template indenter without dependencies. DjHTML is a fully automatic template indenter that works with mixed HTML/CSS

Return to the Source 378 Jan 01, 2023
It's the assignment 1 from the Python 2 course, that requires a ToDoApp with authentication using Django

It's the assignment 1 from the Python 2 course, that requires a ToDoApp with authentication using Django

0 Jan 20, 2022
Projeto onde podes inserir notícias, ver todas as notícias guardas e filtrar por tag. A base de dados usada é o mongoDB.

djangoProject Projeto onde podes inserir notícias, ver todas as notícias guardas e filtrar por tag. A base de dados usada é o mongoDB. packages utiliz

Sofia Rocha 1 Feb 22, 2022
Dashboad Full Stack utilizando o Django.

Dashboard FullStack completa Projeto finalizado | Informações Cadastro de cliente Menu interatico mostrando quantidade de pessoas bloqueadas, liberada

Lucas Silva 1 Dec 15, 2021
Django-gmailapi-json-backend - Email backend for Django which sends email via the Gmail API through a JSON credential

django-gmailapi-json-backend Email backend for Django which sends email via the

Innove 1 Sep 09, 2022
DCM is a set of tools that helps you to keep your data in your Django Models consistent.

Django Consistency Model DCM is a set of tools that helps you to keep your data in your Django Models consistent. Motivation You have a lot of legacy

Occipital 59 Dec 21, 2022
A pickled object field for Django

django-picklefield About django-picklefield provides an implementation of a pickled object field. Such fields can contain any picklable objects. The i

Gintautas Miliauskas 167 Oct 18, 2022
REST API with Django and SQLite3

REST API with Django and SQLite3

Luis Quiñones Requelme 1 Nov 07, 2021
Streamlining Django forms to provide all the wins of single-page-applications without the pain.

nango Streamlining Django forms to provide all the wins of single-page-applications without the pain. Key features Available to all Django deployments

Nick Farrell 107 Dec 12, 2022
Custom Django field for using enumerations of named constants

django-enumfield Provides an enumeration Django model field (using IntegerField) with reusable enums and transition validation. Installation Currently

5 Monkeys 195 Dec 20, 2022
Django Fett is an incomplete code generator used on several projects

Django Fett Django Fett is an incomplete code generator used on several projects. This is an attempt to clean it up and make it public for consumption

Jeff Triplett 6 Dec 31, 2021
Modular search for Django

Haystack Author: Daniel Lindsley Date: 2013/07/28 Haystack provides modular search for Django. It features a unified, familiar API that allows you to

Haystack Search 3.4k Jan 08, 2023
Add infinite scroll to any django app.

django-infinite-scroll Add infinite scroll to any django app. Features - Allows to add infinite scroll to any page.

Gustavo Teixeira 1 Dec 26, 2021
Flashback is an awesome, retro IRC based app built using Django

Flashback Flashback is an awesome, retro IRC based app built using Django (and the Django Rest Framework) for the backend as well as React for the fro

Unloading Gnat 1 Dec 22, 2021
An API was build with Django to store and retrieve information about various musical instruments.

The project is meant to be a starting point, an experimentation or a basic example of a way to develop an API with Django. It is an exercise on using Django and various python technologies and design

Kostas Ziovas 2 Dec 25, 2021
An URL Shortener with Basic Features.

Simple Url Shortener What is that? Yet another url shortener built with Django framework. Preview HOW TO RUN? 1. Virtual Environment First create a vi

Ethem Turgut 6 Jan 25, 2022
Extensions for using Rich with Django.

django-rich Extensions for using Rich with Django. Requirements Python 3.6 to 3.10 supported. Django 2.2 to 4.0 supported. Are your tests slow? Check

Adam Johnson 88 Dec 26, 2022