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)
Radically simplified static file serving for Python web apps

WhiteNoise Radically simplified static file serving for Python web apps With a couple of lines of config WhiteNoise allows your web app to serve its o

Dave Evans 2.1k Dec 15, 2022
Django API without Django REST framework.

Django API without DRF This is a API project made with Django, and without Django REST framework. This project was done with: Python 3.9.8 Django 3.2.

Regis Santos 3 Jan 19, 2022
Compresses linked and inline javascript or CSS into a single cached file.

Django Compressor Django Compressor processes, combines and minifies linked and inline Javascript or CSS in a Django template into cacheable static fi

2.6k Jan 03, 2023
Use heroicons in your Django and Jinja templates.

heroicons Use heroicons in your Django and Jinja templates. Requirements Python 3.6 to 3.9 supported. Django 2.2 to 3.2 supported. Are your tests slow

Adam Johnson 52 Dec 14, 2022
A reusable Django app that configures your project for deployment

django-simple-deploy This app gives you a management command that configures your project for an initial deployment. It targets Heroku at the moment,

Eric Matthes 205 Dec 26, 2022
Store model history and view/revert changes from admin site.

django-simple-history django-simple-history stores Django model state on every create/update/delete. This app supports the following combinations of D

Jazzband 1.8k Jan 06, 2023
📝 Sticky Notes in Django admin

django-admin-sticky-notes Share notes between superusers. Installation Install via pip: pip install django_admin_sticky_notes Put django_admin_sticky_

Dariusz Choruży 7 Oct 06, 2021
Forward and backwards compatibility layer for Django 1.4, 1.7, 1.8, 1.9, 1.10, and 1.11

django-compat Forward and backwards compatibility layer for Django 1.4 , 1.7 , 1.8, 1.9, 1.10 and 1.11 Consider django-compat as an experiment based o

arteria GmbH 106 Mar 28, 2022
Location field and widget for Django. It supports Google Maps, OpenStreetMap and Mapbox

django-location-field Let users pick locations using a map widget and store its latitude and longitude. Stable version: django-location-field==2.1.0 D

Caio Ariede 481 Dec 29, 2022
django+bootstrap5 实现的 个人博客

项目状态: 正在开发中【目前已基本可用】 项目地址: https://github.com/find456789/django_blog django_blog django+bootstrap5 实现的 个人博客 特点 文章的历史版本管理(随时回退) rss、atom markdown 评论功能

名字 3 Nov 16, 2021
Template for Django Project Using Docker

You want a Django project who use Docker and Docker-compose for Development and for Production ? It's for you !

1 Dec 17, 2021
WeatherApp - Simple Python Weather App

Weather App Please star this repo if you like ⭐ It's motivates me a lot! Stack A

Ruslan Shvetsov 3 Apr 18, 2022
Django React - Purity Dashboard (Open-Source) | AppSeed

Django React Purity Dashboard Start your Development with an Innovative Admin Template for Chakra UI and React. Purity UI Dashboard is built with over

App Generator 19 Sep 19, 2022
Bootstrap 3 integration with Django.

django-bootstrap3 Bootstrap 3 integration for Django. Goal The goal of this project is to seamlessly blend Django and Bootstrap 3. Want to use Bootstr

Zostera B.V. 2.3k Jan 02, 2023
Updates redisearch instance with igdb data used for kimosabe

igdb-pdt Update RediSearch with IGDB games data in the following Format: { "game_slug": { "name": "game_name", "cover": "igdb_coverart_url",

6rotoms 0 Jul 30, 2021
Django project starter on steroids: quickly create a Django app AND generate source code for data models + REST/GraphQL APIs (the generated code is auto-linted and has 100% test coverage).

Create Django App 💛 We're a Django project starter on steroids! One-line command to create a Django app with all the dependencies auto-installed AND

imagine.ai 68 Oct 19, 2022
Django GUID attaches a unique correlation ID/request ID to all your log outputs for every request.

Django GUID Now with ASGI support! Django GUID attaches a unique correlation ID/request ID to all your log outputs for every request. In other words,

snok 300 Dec 29, 2022
Django Phyton Web Apps template themes

Django Phyton Web Apps template themes Free download source code project for build a modern website using django phyton web apps. Documentation instal

Mesin Kasir 4 Dec 15, 2022
Source code for Django for Beginners 3.2

The official source code for https://djangoforbeginners.com/. Available as an ebook or in Paperback. If you have the 3.1 version, please refer to this

William Vincent 10 Jan 03, 2023
Plug and play continuous integration with django and jenkins

django-jenkins Plug and play continuous integration with Django and Jenkins Installation From PyPI: $ pip install django-jenkins Or by downloading th

Mikhail Podgurskiy 941 Oct 22, 2022