GithubHelp home page GithubHelp logo

adrf's Introduction

Async Django REST framework

Async support for Django REST framework

Requirements

  • Python 3.8+
  • Django 4.1+

We highly recommend and only officially support the latest patch release of each Python and Django series.

Installation

Install using pip...

pip install adrf

Add 'adrf' to your INSTALLED_APPS setting.

INSTALLED_APPS = [
    ...
    'adrf',
]

Examples

Async Views

When using Django 4.1 and above, this package allows you to work with async class and function based views.

For class based views, all handler methods must be async, otherwise Django will raise an exception. For function based views, the function itself must be async.

For example:

from adrf.views import APIView

class AsyncAuthentication(BaseAuthentication):
    async def authenticate(self, request) -> tuple[User, None]:
        return user, None

class AsyncPermission:
    async def has_permission(self, request, view) -> bool:
        if random.random() < 0.7:
            return False

        return True

    async def has_object_permission(self, request, view, obj):
        if obj.user == request.user or request.user.is_superuser:
            return True

        return False

class AsyncThrottle(BaseThrottle):
    async def allow_request(self, request, view) -> bool:
        if random.random() < 0.7:
            return False

        return True

    def wait(self):
        return 3

class AsyncView(APIView):
    authentication_classes = [AsyncAuthentication]
    permission_classes = [AsyncPermission]
    throttle_classes = [AsyncThrottle]

    async def get(self, request):
        return Response({"message": "This is an async class based view."})

from adrf.decorators import api_view

@api_view(['GET'])
async def async_view(request):
    return Response({"message": "This is an async function based view."})

Async ViewSets

For viewsets, all handler methods must be async too.

views.py

from django.contrib.auth import get_user_model
from rest_framework.response import Response

from adrf.viewsets import ViewSet


User = get_user_model()


class AsyncViewSet(ViewSet):

    async def list(self, request):
        return Response(
            {"message": "This is the async `list` method of the viewset."}
        )

    async def retrieve(self, request, pk):
        user = await User.objects.filter(pk=pk).afirst()
        return Response({"user_pk": user and user.pk})

urls.py

from django.urls import path, include
from rest_framework import routers

from . import views

router = routers.DefaultRouter()
router.register(r"async_viewset", views.AsyncViewSet, basename="async")

urlpatterns = [
    path("", include(router.urls)),
]

Async Serializers

serializers.py

from adrf.serializers import Serializer
from rest_framework import serializers

class AsyncSerializer(Serializer):
    username = serializers.CharField()
    password = serializers.CharField()
    age = serializers.IntegerField()

views.py

from .serializers import AsyncSerializer
from adrf.views import APIView

class AsyncView(APIView):
    async def get(self, request):
        data = {
            "username": "test",
            "password": "test",
            "age": 10,
        }
        serializer = AsyncSerializer(data=data)
        serializer.is_valid()
        return await serializer.adata

Async Generics

models.py

from django.db import models

class Order(models.Model):
    name = models.TextField()

serializers.py

from adrf.serializers import ModelSerializer
from .models import Order

class OrderSerializer(ModelSerializer):
    class Meta:
        model = Order
        fields = ('name', )

views.py

from adrf.generics import ListCreateAPIView
from .models import Order
from .serializers import OrderSerializer

class ListCreateOrderView(ListCreateAPIView):
    queryset = Order.objects.all()
    serializer_class = OrderSerializer

adrf's People

Contributors

cfra avatar cyx2000 avatar em1208 avatar johnthagen avatar kartava avatar realsama avatar spanishpy avatar stephanelatil avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

adrf's Issues

serializer using ForeignKey causes SynchronousOnlyOperation error

hi.
i try to serialize a model that has a relation to another model with a ForeignKey field, and i get an error message about django.core.exceptions.SynchronousOnlyOperation

here is an example of my code,

# models.py
from django.db import models


class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField("date published")


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)
# test.py
import asyncio
import os
import sys
from pathlib import Path

import django
from django.utils import timezone
from rest_framework import serializers
from adrf.serializers import Serializer

sys.path.append(str(Path.cwd()))

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
django.setup()

from polls.models import Choice, Question

"""
q = Question(
    question_text="how many legs does an elephant have?",
    pub_date=timezone.now(),
)
q.save()

c1 = Choice.objects.create(question=q, choice_text="four legs", votes=4)
c2 = Choice.objects.create(question=q, choice_text="five legs", votes=1)
c3 = Choice.objects.create(question=q, choice_text="three legs", votes=1)
"""


class ChoiceSerializer(Serializer):
    question = serializers.CharField(source="question.question_text")
    choice_text = serializers.CharField()
    votes = serializers.IntegerField()


async def main() -> None:
    query = Choice.objects.filter(question__id=1)
    serializer_data = ChoiceSerializer(query, many=True)
    result = await serializer_data.adata
    print(result)


if __name__ == "__main__":
    asyncio.run(main())

log,

(testing) ▲ /t/testing python test.py
Traceback (most recent call last):
  File "/tmp/testing/.venv/lib/python3.12/site-packages/django/db/models/fields/related_descriptors.py", line 239, in __get__
    rel_obj = self.field.get_cached_value(instance)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/testing/.venv/lib/python3.12/site-packages/django/db/models/fields/mixins.py", line 36, in get_cached_value
    return instance._state.fields_cache[self.cache_name]
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
KeyError: 'question'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/tmp/testing/test.py", line 45, in <module>
    asyncio.run(main())
  File "/usr/lib/python3.12/asyncio/runners.py", line 194, in run
    return runner.run(main)
           ^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/asyncio/runners.py", line 118, in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/asyncio/base_events.py", line 687, in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
  File "/tmp/testing/test.py", line 40, in main
    result = await serializer_data.adata
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/testing/.venv/lib/python3.12/site-packages/async_property/base.py", line 37, in get_value
    return await self._fget(instance)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/testing/.venv/lib/python3.12/site-packages/adrf/serializers.py", line 228, in adata
    ret = await super().adata
          ^^^^^^^^^^^^^^^^^^^
  File "/tmp/testing/.venv/lib/python3.12/site-packages/async_property/base.py", line 37, in get_value
    return await self._fget(instance)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/testing/.venv/lib/python3.12/site-packages/adrf/serializers.py", line 72, in adata
    self._data = await self.ato_representation(self.instance)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/testing/.venv/lib/python3.12/site-packages/adrf/serializers.py", line 184, in ato_representation
    return [await self.child.ato_representation(item) async for item in data]
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/testing/.venv/lib/python3.12/site-packages/adrf/serializers.py", line 152, in ato_representation
    attribute = field.get_attribute(instance)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/testing/.venv/lib/python3.12/site-packages/rest_framework/fields.py", line 437, in get_attribute
    return get_attribute(instance, self.source_attrs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/testing/.venv/lib/python3.12/site-packages/rest_framework/fields.py", line 104, in get_attribute
    instance = getattr(instance, attr)
               ^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/testing/.venv/lib/python3.12/site-packages/django/db/models/fields/related_descriptors.py", line 257, in __get__
    rel_obj = self.get_object(instance)
              ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/testing/.venv/lib/python3.12/site-packages/django/db/models/fields/related_descriptors.py", line 220, in get_object
    return qs.get(self.field.get_reverse_related_filter(instance))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/testing/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 645, in get
    num = len(clone)
          ^^^^^^^^^^
  File "/tmp/testing/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 382, in __len__
    self._fetch_all()
  File "/tmp/testing/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 1928, in _fetch_all
    self._result_cache = list(self._iterable_class(self))
                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/testing/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 91, in __iter__
    results = compiler.execute_sql(
              ^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/testing/.venv/lib/python3.12/site-packages/django/db/models/sql/compiler.py", line 1572, in execute_sql
    cursor = self.connection.cursor()
             ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/testing/.venv/lib/python3.12/site-packages/django/utils/asyncio.py", line 24, in inner
    raise SynchronousOnlyOperation(message)
django.core.exceptions.SynchronousOnlyOperation: You cannot call this from an async context - use a thread or sync_to_async.
(testing) ▲ /t/testing 

error will be gone if i remove question = serializers.CharField(source="question.question_text") from serializer class

(testing) ▲ /t/testing python test.py
[OrderedDict({'choice_text': 'four legs', 'votes': 4}), OrderedDict({'choice_text': 'five legs', 'votes': 1}), OrderedDict({'choice_text': 'three legs
', 'votes': 1})]
(testing) ▲ /t/testing 

Synchronous Exception when using ModelSerializer

I am trying this extension for the first time. I have executed the examples in the ReadMe successfully. Currently I am trying to create a sample async CRUD API but this time instead of Using Serializer I am using ModelSerializer. When I call

serializer.is_valid(raise_exeception=True) inside my API I receive the below exception

django.core.exceptions.SynchronousOnlyOperation: You cannot call this from an async context - use a thread or sync_to_async.
Here is my API code

class OyCreateRubricAPIView(APIView):
    async def post(self, request):
        data = request.data
        print(data)
        serializer = CreateSerializer(data=data)
        serializer.is_valid(raise_exception=True)
        await serializer.asave()
        return Response({"message": "Success"})

ModelSerializer with SerializerMethodField and overriding to_representation

I have a ModelSerializer that contains some SerializerMethodFields and I need to override the to_representation method as well.
for instance:

from adrf.serializers import ModelSerializer as AsyncModelSerializer

class SampleSerializer(AsyncModelSerializer):
    remaining = serializers.SerializerMethodField(read_only=True)
    class Meta:
        model = MyModel
        fields = "__all__"
    def to_representation(self, instance):
        representation = super().to_representation(instance)
        # do some stuff here
        return representation

this is the APIView I have:

from adrf.views import APIView as AsyncAPIView

class SampleView(AsyncAPIView):
    permission_classes = [IsAuthenticated]
    user = request.user
        myObj = MyModel.objects.filter(
            userpackage_package__user=user,
            purchase_start_time__lte=timezone.localtime(),
            end_date__gte=timezone.localdate(),
        )
        serializer = SampleSerializer(
            myObj, many=True, context={"user": user}
        )
        return Response({"data": await serializer.adata}, status=status.HTTP_200_OK)

but I get this error: 'SerializerMethodField' object has no attribute 'ato_representation'

ViewSet incorrectly checks if ordinary properties and members on a class are async

I configured a viewset to include a content_negotiation_class, as follows:

from adrf.viewsets import ViewSet as AsyncViewSet

class MyViewSet(AsyncViewSet):
    content_negotiation_class = MyContentNegotiation
    
    ...

And the viewset fails with:

django.core.exceptions.ImproperlyConfigured: MyViewSet action handlers must either be all sync or all async.

I confirmed it's because this check is too coarse and including non-callable members.

if callable(function) and not name.startswith("__")

I quickly attempted to override and perform a more precise check to no avail. I think checking isinstance(function, types.FunctionType) is promising but adding it on it's own was not enough.

My workaround is to override view_is_async in the viewset to return True and just be very careful.

caching issue

the traditional caching feature on django/ drf is not compatible with adrf

Serializer Bug with 'PrimaryKeyRelatedField'

Hello, I've encountered an error while using the serializer in my project.
my code is from adrf.serializers import ModelSerializer, Serializer
class AsyncOrderSerializer(ModelSerializer):
class Meta:
model = Order
fields = 'all'
# read_only_fields = ('user','goods') res = await AsyncOrderSerializer(instance = orders, many=True).adata

the error messages: Traceback (most recent call last):
File "d:\programfiles3\Python\venvs\Py39WebDevelop\lib\site-packages\asgiref\sync.py", line 534, in thread_handler
raise exc_info[1]
File "d:\programfiles3\Python\venvs\Py39WebDevelop\lib\site-packages\django\core\handlers\exception.py", line 42, in inner
response = await get_response(request)
File "d:\programfiles3\Python\venvs\Py39WebDevelop\lib\site-packages\django\core\handlers\base.py", line 253, in _get_response_async
response = await wrapped_callback(
File "d:\programfiles3\Python\venvs\Py39WebDevelop\lib\site-packages\adrf\viewsets.py", line 121, in async_view
return await self.dispatch(request, *args, **kwargs)
File "d:\programfiles3\Python\venvs\Py39WebDevelop\lib\site-packages\adrf\views.py", line 77, in async_dispatch
response = self.handle_exception(exc)
File "d:\programfiles3\Python\venvs\Py39WebDevelop\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
self.raise_uncaught_exception(exc)
File "d:\programfiles3\Python\venvs\Py39WebDevelop\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
raise exc
File "d:\programfiles3\Python\venvs\Py39WebDevelop\lib\site-packages\adrf\views.py", line 70, in async_dispatch
response = await handler(request, *args, **kwargs)
File "d:@pythonLearning@Projects@maasbackend\apps\orders\views.py", line 164, in list
res = await AsyncOrderSerializer(instance = orders, many=True).adata
File "d:\programfiles3\Python\venvs\Py39WebDevelop\lib\site-packages\async_property\base.py", line 37, in get_value
return await self._fget(instance)
File "d:\programfiles3\Python\venvs\Py39WebDevelop\lib\site-packages\adrf\serializers.py", line 244, in adata
ret = await super().adata
File "d:\programfiles3\Python\venvs\Py39WebDevelop\lib\site-packages\async_property\base.py", line 37, in get_value
return await self._fget(instance)
File "d:\programfiles3\Python\venvs\Py39WebDevelop\lib\site-packages\adrf\serializers.py", line 70, in adata
self._data = await self.ato_representation(self.instance)
File "d:\programfiles3\Python\venvs\Py39WebDevelop\lib\site-packages\adrf\serializers.py", line 197, in ato_representation
return [
File "d:\programfiles3\Python\venvs\Py39WebDevelop\lib\site-packages\adrf\serializers.py", line 198, in
await self.child.ato_representation(item)
File "d:\programfiles3\Python\venvs\Py39WebDevelop\lib\site-packages\adrf\serializers.py", line 178, in ato_representation
repr = await field.ato_representation(attribute)
AttributeError: 'PrimaryKeyRelatedField' object has no attribute 'ato_representation'

I resolved the issue by modifying adrf/serializers.py at line 178 to use field.to_representation(attribute) instead of the non-existent ato_representation method.

Best practices for partial async implementation in DRF

I have currently a Django API project built with DRF.
I would like to use async for some endpoints to optimize long API calls.
What are the best practices in terms of performance ?
I suppose that I have to change my server for Uvicorn ?
Will the normal sync views still work correctly ?
Thanks.

Performing actual queries in `get_queryset` method

I need to call the following url: users/:user_pk/photos/:photo_pk/

To get only the photos related to the user having id=user_pk if the user exists, I have to extend the get_queryset method to be able to raise NotFound exception if no user with id=user_pk exists.

Which is the best way to manage it since I'm performing a query on the DB and the get_queryset method is only sync in GenericAPIView, GenericViewSet, etc?

Does `adrf` support `django`(version 4.2)?

According to README.md, the Requirements are Python 3.8+ and Django 4.1.

However, the Async Views section says:

When using Django 4.1 and above, this package allows you to work with async class and function based views.

So, I have a question about:

Does adrf support django(version 4.2)?

Make inheriting methods in ViewSet work

I'm trying to build a quick POC but it currently fails because I'm inheriting the views methods from a Mixin. The fix would be something like #36, but it is still failing after teaching View.view_is_async (that comes from django) about viewsets methods. Any hint?

Writing tests for async views

Currently, I'm using rest_framework.test.APIClient for tests on my sync viewes. Is there a way I can easily adopt this for the async views I have thanks to this package?

Require CSRF when api_view(('POST')) on 0.1.5, but not in 0.1.4

https://github.com/Artasov/xlartas
My project work correctly in version 0.1.4. In 0.1.5 csrf is required for any post requests. Why?. What has changed in these versions.
An example of a controller... 1 of... I checked several times, changed the versions, and everything breaks on 0.1.5.
In apps/shop/controllers/software/software_test_activate_current_user.

@api_view(('POST',))
@permission_classes([IsAuthenticated])
async def software_test_activate_current_user(request) -> Response:
     pass

If you are interested in testing, then it is enough to start the project:

python --version
> python 3.11.6
python -m vev venv
venv/Scripts/activate
git clone https://github.com/Artasov/xlartas

rename THE TEMPLATE .env.prod > .env.prod
change
DEBUG=1
DEV=1
HTTPS=0


cd xlartas
cd frontend
npm install
npm run build
cd ..
cd backend
pip install -r requirements.txt
python manage.py migrate
python manage.py runserver

Authentication error with 0.1.3 release

REST API interface GET access as "GET /services/p/p/" got complain :

{
    "detail": "Authentication credentials were not provided."
}

Here is the setup of view and URL conf

from adrf.views import APIView as AsyncAPIView
@authentication_classes([authentication.SessionAuthentication, ExpiringTokenAuthentication])
@permission_classes([permissions.IsAuthenticated])
class DummyView(AsyncAPIView):
    async def get(self, request, category, slug): pass 
path('services/<str:category>/<str:slug>/', DummyView.as_view()

It's fine with 0.1.2, but starts fail with 0.1.3.

Add license file

Currently, no license is attached to this repo.

If this repo ever gets merged back into DRF, having no license would make this fairly hard.

how can i write async serializers to go with my async ViewSet?

this framework looks very interesting in the sense of turning my DRF application to async. the snag i am running into right now is how to serialize the data.

the example on the README use direct fields from the models. is there a way to make a serializer in, that would not through an error about not being sync or corotines not being serializable, or is it necessary to manually serialize every model?

something along:

class AsyncViewSet(ViewSet):

    async def list(self, request):
        users_list = []
        async for user in User.objects.all():
            s = await UserSerializer(user, many=False)
            users_list.append(s.data)
        return Response(user_list)

    async def retrieve(self, request, pk):
        user = await User.objects.filter(pk=pk).afirst()
        s = await UserSerializer(user, many=False)
        return Response(user)

Generics support

Is there any support for Generics View like ListCreateAPIView/UpdateAPIView etc ?
Is support, how can i use that? i cannot see any example to use on online.

About Async Relational Fields

Defining relational fields in a serializer may incur additional database queries, but Django does not natively support asynchronous many-to-one or one-to-one queries. Django will report an error if you try to do many-to-one or one-to-one queries in an async context.

In fact, the best practice is to use select_related or prefetch_related to query all the data that needs to be used at once when defining the queryset, so as to avoid additional database queries in the future.

I want to try to implement a simple asynchronous serializer, but my confusion is that when the user does a many-to-one or one-to-one query and does not use select_related or prefetch_related, should Django report an error or take some way to achieve async many-to-one or one-to-one queries?

I would like to ask what is your take on this matter? Thank you.

ModelViewSet implementation

Are there any plans, technical designs, or research for add support for ModelViewSets?

I can take a crack at it if not, just wanted to check!

ViewSets

@em1208 thanks for the great effort on this so far.
is there any examples or thoughts on how the ViewSets should be created / updated?
have you had any success with this or are any calls to the database out of the question currently

Handle review comments from DRF

There's a few review comments on the DRF PR that never got marked as completed. For example, support for async fields on serializers.

Mark them as completed over there if needed, or create issues on this repo to handle those tasks.

Question ? 🙋🏼‍♂️

Hello,

I actively participate as a contributor in the development of the django eventstream module, and I developed the DRF part of the module. My question is: what could be the benefit of adding ADRF support to this module? What can the async APIView bring, given that SSE is asynchronous?

Thank you.

Error with decorators in method

I am using this ViewSet:

from adrf.viewsets import ViewSet
from drf_yasg.utils import swagger_auto_schema
from rest_framework.response import Response

def user_permission(permission: str, status: int = 403):
    def int_permission(func):
        def function(self, request, **kwargs):
            if permission == "superuser" and not request.user.is_superuser:
                return Response([_("You don't have access to the resource")], status=status)
            if not request.user.has_perm(permission):
                return Response([_("You don't have access to the resource")], status=status)
            return func(self, request, **kwargs)

        return function

    return int_permission

class Testing(ViewSet):
    @swagger_auto_schema(request_body=AcceptRequestDTO, responses={"200": ResponseShortDTO()})
    @user_permission("orders.change_requests")
    async def accept(self, request):
        return Response({"complete": , "message": "", "data": ""}, status=200)

And the error is:

assert isinstance(response, HttpResponseBase), (
AssertionError: Expected a `Response`, `HttpResponse` or `HttpStreamingResponse` to be returned from the view, but received a `<class 'coroutine'>`

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.