# django-grpc
[![CircleCI](https://circleci.com/gh/gluk-w/django-grpc.svg?style=svg)](https://circleci.com/gh/gluk-w/django-grpc)
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](https://grpc.io/docs/languages/python/quickstart/)
* Supported Python: 3.4+
* Supported Django: 2.X and 3.X
## Installation
```bash
pip install django-grpc
```
Update settings.py
```python
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,
'options': [("grpc.max_receive_message_length", 1024 * 1024 * 100)], # optional, list of key-value pairs to configure the channel. The full list of available channel arguments: https://grpc.github.io/grpc/core/group__grpc__arg__keys.html
}
```
The callback that initializes "servicer" must look like following:
```python
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
```bash
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.context.FakeServicerContext` to your gRPC method
to verify how it works with context (aborts, metadata and etc.).
```python
import grpc
from django_grpc_testtools.context 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
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
django-grpc 启动gRPC服务器的简单方法,可以访问Django ORM和其他方便的东西。 gRPC调用比传统的HTTP请求要快得多,因为它通过持久连接进行通信并被压缩。 底层gRPC库是用C编写的,这使其比任何需要花费大量时间进行序列化/反序列化的RESTful框架都要快。 请注意,仅当您想在gRPC服务中使用Django功能时才需要该项目。 对于纯python实现, 受支持的Python:3.4+ 支持的Django:2.X和3.X 安装 pip install django-grpc 更新settings.py INSTALLED_APPS = [ # ...
资源详情
资源评论
资源推荐
收起资源包目录
django-grpc-master.zip (58个子文件)
django-grpc-master
MANIFEST.in 174B
.github
ISSUE_TEMPLATE.md 340B
manage.py 329B
django_grpc_testtools
executor.py 834B
__init__.py 0B
context.py 1KB
.circleci
config.yml 258B
requirements.txt 72B
requirements_test.txt 144B
CONTRIBUTING.md 3KB
.travis.yml 397B
tox.ini 712B
LICENSE 1KB
requirements_dev.txt 34B
AUTHORS.md 120B
setup.cfg 301B
setup.py 2KB
README.md 4KB
Makefile 2KB
django_grpc
apps.py 156B
serializers
base.py 3KB
__init__.py 314B
utils.py 2KB
__init__.py 37B
models.py 25B
signals
__init__.py 631B
wrapper.py 3KB
management
commands
grpcserver.py 2KB
__init__.py 0B
__version__.py 23B
docs
authors.rst 28B
make.bat 6KB
readme.rst 27B
contributing.rst 33B
conf.py 8KB
usage.rst 417B
installation.rst 203B
history.rst 28B
index.rst 442B
Makefile 7KB
.editorconfig 331B
tests
settings.py 786B
helpers.py 340B
urls.py 215B
manage.py 248B
__init__.py 0B
test_signals.py 1KB
conftest.py 661B
test_server.py 1KB
test_utils.py 278B
sampleapp
utils.py 236B
__init__.py 0B
servicer.py 328B
helloworld_pb2.py 4KB
helloworld_pb2_grpc.py 1KB
.gitignore 419B
runtests.py 575B
.coveragerc 146B
共 58 条
- 1
MaDaniel
- 粉丝: 688
- 资源: 4571
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0