Skip to main content

Easy Django based gRPC service

Project description

django-grpc

CircleCI

Easy way to launch gRPC server with access to Django ORM and other handy stuff. gRPC calls are much faster that traditional HTTP requests because communicate over persistent connection and are compressed. Underlying gRPC library is written in C which makes it work faster than any RESTful framework where a lot of time is spent on serialization/deserialization.

Note that you need this project only if you want to use Django functionality in gRPC service. For pure python implementation read this

  • Supported Python: 3.4+
  • Supported Django: 2.X (let me know if you need Django 3 support)

Installation

pip install django-grpc

Update settings.py

INSTALLED_APPS = [
    # ...
    'django_grpc',
]

GRPCSERVER = {
    'servicers': ['dotted.path.to.callback.eg.grpc_hook'],  # see `grpc_hook()` below
    'interceptors': ['dotted.path.to.interceptor_class',],  # optional, interceprots are similar to middleware in Django
    'maximum_concurrent_rpcs': None,
}

The callback that initializes "servicer" must look like following:

import my_pb2
import my_pb2_grpc

def grpc_hook(server):
    my_pb2_grpc.add_MYServicer_to_server(MYServicer(), server)

...
class MYServicer(my_pb2_grpc.MYServicer):

    def GetPage(self, request, context):
        response = my_pb2.PageResponse(title="Demo object")
        return response

Usage

python manage.py grpcserver

For developer's convenience add --autoreload flag during development.

Signals

The package uses Django signals to allow decoupled applications get notified when some actions occur:

  • django_grpc.signals.grpc_request_started - sent before gRPC server begins processing a request
  • django_grpc.signals.grpc_request_finished - sent when gRPC server finishes delivering response to the client
  • django_grpc.signals.grpc_got_request_exception - this signal is sent whenever RPC encounters an exception while processing an incoming request.

Note that signal names are similar to Django's built-in signals, but have "grpc_" prefix.

Serializers

There is an easy way to serialize django model to gRPC message using django_grpc.serializers.serialize_model.

Testing

Test your RPCs just like regular python methods which return some structure or generator. You need to provide them with only 2 parameters: request (protobuf structure or generator) and context (use FakeServicerContext from the example below).

Fake Context

You can pass instance of django_grpc_testtools.FakeServicerContext to your gRPC method to verify how it works with context (aborts, metadata and etc.).

import grpc
from django_grpc_testtools import FakeServicerContext
from tests.sampleapp.servicer import Greeter
from tests.sampleapp.helloworld_pb2 import HelloRequest

servicer = Greeter()
context = FakeServicerContext()
request = HelloRequest(name='Tester')

# To check metadata set by RPC 
response = servicer.SayHello(request, context)
assert context.get_trailing_metadata("Header1") == '...'

# To check status code
try:
    servicer.SayHello(request, context) 
except Exception:
    pass

assert context.abort_status == grpc.StatusCode.INVALID_ARGUMENT
assert context.abort_message == 'Cannot say hello to John'

In addition to standard gRPC context methods, FakeServicerContext provides:

  • .set_invocation_metadata() allows to simulate metadata from client to server.
  • .get_trailing_metadata() to get metadata set by your server
  • .abort_status and .abort_message to check if .abort() was called

History

1.0.1 (2019-12-09)

  • First stable release on PyPI.

0.1.0 (2019-01-18)

  • First release on PyPI.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django-grpc-1.0.5.tar.gz (10.6 kB view details)

Uploaded Source

Built Distribution

django_grpc-1.0.5-py2.py3-none-any.whl (12.1 kB view details)

Uploaded Python 2Python 3

File details

Details for the file django-grpc-1.0.5.tar.gz.

File metadata

  • Download URL: django-grpc-1.0.5.tar.gz
  • Upload date:
  • Size: 10.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.18.4 setuptools/40.7.0 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.6.9

File hashes

Hashes for django-grpc-1.0.5.tar.gz
Algorithm Hash digest
SHA256 074a3f29fdf4b358a1d0868b47879f6982e9ea23c9d60a86897db67321f7b8ab
MD5 cf859000faf16bfeaa25c52ed9825ac2
BLAKE2b-256 a64708ec9f93154c22d7bd20f0ade28542621925635f20997e8ef09c8cd0f42d

See more details on using hashes here.

File details

Details for the file django_grpc-1.0.5-py2.py3-none-any.whl.

File metadata

  • Download URL: django_grpc-1.0.5-py2.py3-none-any.whl
  • Upload date:
  • Size: 12.1 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.18.4 setuptools/40.7.0 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.6.9

File hashes

Hashes for django_grpc-1.0.5-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 0a71cec990c80a608472a857f8f4561f69c78cdc5c652f15fe7f232dd7f2e65b
MD5 25e2a29a9a70f10e3358a042cd38b217
BLAKE2b-256 fa4b9bcfb226bbcd4d82710e62af22cd5a72461b22741303eb5b9b680ce8de46

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page