(Now finding maintainer) 🐍A Pythonic way to provide JWT authentication for Flask-GraphQL

Overview

Flask-GraphQL-Auth

PyPI PyPI - Python Version Documentation Status Codacy Badge Build StatusDownloads DownloadsPerMonth codecov

What is Flask-GraphQL-Auth?

Flask-GraphQL-Auth is JWT decorator for flask-graphql inspired from Flask-JWT-Extended. all you have to do to protect your mutation and query with JWT is to create unions with AuthInfoField and decorate resolvers with decorators in Flask-GraphQL-Auth

Features

  • Basic validation of JWT
  • Mutation protectors
  • Query protectors
  • Get JWT data from context stack
  • Insert user claim

Installation

pip install Flask-GraphQL-Auth

Usage

View the documentation online

We are finding contributors!

  • TODO
    • test cases
    • CI&coverage intergration

any PR&issues are welcome!!

Comments
  • JWT_SECRET_KEY exception

    JWT_SECRET_KEY exception

    Raises an exception when JWT_SECRET_KEY is not defined in Flask app.config

    If this key is not defined, functions like create_access_token give unexpected errors, for example. TypeError: String is expected.

    opened by ShivanshJ 5
  • 'str' object has no attribute 'decode'

    'str' object has no attribute 'decode'

    When passing a simple string through the create_access_token and create_refresh_token methods, throws the following error:

    image

    I've tried passing in encoded data for the identifier, but that is unable to be processed with the following message:

    image

    opened by PopBot 3
  • Incorrect example in docs (perhaps)

    Incorrect example in docs (perhaps)

    I've tried to use example from here, for instance:

    {
      protected(message: "hello", token: "my access token")
    }
    

    but I've got

    {
      "errors": [
        {
          "message": "Field \"protected\" of type \"ProtectedUnion\" must have a sub selection.",
          "locations": [
            {
              "line": 2,
              "column": 3
            }
          ]
        },
        {
          "message": "Unknown argument \"message\" on field \"protected\" of type \"Query\".",
          "locations": [
            {
              "line": 2,
              "column": 13
            }
          ]
        }
      ]
    }
    

    Working case I was able to achieve only with query:

    {
      protected(token: "my access token") {
        ... on MessageField {
          message
        }
      }
    }
    

    Also I've managed to make the protected mutation with

    mutation {
      protected(token: "my access token") {
        message {
          ... on MessageField {
            message
          }
        }
      }
    }
    

    I don’t know what it is connected with, but if it's now the valid way, it should be reflected in docs. Last case especially :)

    opened by ruslankrivoshein 3
  • Bump jinja2 from 2.10.1 to 2.11.3

    Bump jinja2 from 2.10.1 to 2.11.3

    Bumps jinja2 from 2.10.1 to 2.11.3.

    Release notes

    Sourced from jinja2's releases.

    2.11.3

    This contains a fix for a speed issue with the urlize filter. urlize is likely to be called on untrusted user input. For certain inputs some of the regular expressions used to parse the text could take a very long time due to backtracking. As part of the fix, the email matching became slightly stricter. The various speedups apply to urlize in general, not just the specific input cases.

    2.11.2

    2.11.1

    This fixes an issue in async environment when indexing the result of an attribute lookup, like {{ data.items[1:] }}.

    2.11.0

    This is the last version to support Python 2.7 and 3.5. The next version will be Jinja 3.0 and will support Python 3.6 and newer.

    2.10.3

    2.10.2

    Changelog

    Sourced from jinja2's changelog.

    Version 2.11.3

    Released 2021-01-31

    • Improve the speed of the urlize filter by reducing regex backtracking. Email matching requires a word character at the start of the domain part, and only word characters in the TLD. :pr:1343

    Version 2.11.2

    Released 2020-04-13

    • Fix a bug that caused callable objects with __getattr__, like :class:~unittest.mock.Mock to be treated as a :func:contextfunction. :issue:1145
    • Update wordcount filter to trigger :class:Undefined methods by wrapping the input in :func:soft_str. :pr:1160
    • Fix a hang when displaying tracebacks on Python 32-bit. :issue:1162
    • Showing an undefined error for an object that raises AttributeError on access doesn't cause a recursion error. :issue:1177
    • Revert changes to :class:~loaders.PackageLoader from 2.10 which removed the dependency on setuptools and pkg_resources, and added limited support for namespace packages. The changes caused issues when using Pytest. Due to the difficulty in supporting Python 2 and :pep:451 simultaneously, the changes are reverted until 3.0. :pr:1182
    • Fix line numbers in error messages when newlines are stripped. :pr:1178
    • The special namespace() assignment object in templates works in async environments. :issue:1180
    • Fix whitespace being removed before tags in the middle of lines when lstrip_blocks is enabled. :issue:1138
    • :class:~nativetypes.NativeEnvironment doesn't evaluate intermediate strings during rendering. This prevents early evaluation which could change the value of an expression. :issue:1186

    Version 2.11.1

    Released 2020-01-30

    • Fix a bug that prevented looking up a key after an attribute ({{ data.items[1:] }}) in an async template. :issue:1141

    ... (truncated)

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 1
  • Breaking changes introduced with PyJWT V2.0.0

    Breaking changes introduced with PyJWT V2.0.0

    Creating the JWT tokens would throw graphql.error.located_error.GraphQLLocatedError: 'str' object has no attribute 'decode' The short-term solution I have is to specify your PyJWT version to be PyJWT==1.7.1 in your requirements.txt.

    The change log can be found below.

    https://github.com/jpadilla/pyjwt/releases/tag/2.0.0

    opened by KrishyV 1
  • mutation_jwt_required issue: `Nonetype object not callable`

    mutation_jwt_required issue: `Nonetype object not callable`

    I am having an issue when using the mutation_jwt_required decorator, when taking in the mutate function of graphene.Mutation class as the callback function.

    It's possibly something to do with cls being invoked to call AuthInfoField. Could it be the case that this needs to be omitted and be similar to how the query_jwt_required decorator handles an exception?

    Traceback (most recent call last):
      File "/opt/pattoo-daemon/.python/flask_graphql_auth/decorators.py", line 199, in wrapper
        verify_jwt_in_argument(token)
      File "/opt/pattoo-daemon/.python/flask_graphql_auth/decorators.py", line 66, in verify_jwt_in_argument
        jwt_data = get_jwt_data(token, "access")
      File "/opt/pattoo-daemon/.python/flask_graphql_auth/decorators.py", line 44, in get_jwt_data
        jwt_data = decode_jwt(
      File "/opt/pattoo-daemon/.python/flask_graphql_auth/decorators.py", line 21, in decode_jwt
        data = jwt.decode(encoded_token, secret, algorithms=[algorithm])
      File "/opt/pattoo-daemon/.python/jwt/api_jwt.py", line 104, in decode
        self._validate_claims(payload, merged_options, **kwargs)
      File "/opt/pattoo-daemon/.python/jwt/api_jwt.py", line 134, in _validate_claims
        self._validate_exp(payload, now, leeway)
      File "/opt/pattoo-daemon/.python/jwt/api_jwt.py", line 175, in _validate_exp
        raise ExpiredSignatureError('Signature has expired')
    jwt.exceptions.ExpiredSignatureError: Signature has expired
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "/opt/pattoo-daemon/.python/graphql/execution/executor.py", line 452, in resolve_or_error
        return executor.execute(resolve_fn, source, info, **args)
      File "/opt/pattoo-daemon/.python/graphql/execution/executors/sync.py", line 16, in execute
        return fn(*args, **kwargs)
      File "/opt/pattoo-daemon/.python/flask_graphql_auth/decorators.py", line 201, in wrapper
        return cls(AuthInfoField(message=str(e)))
    TypeError: 'NoneType' object is not callable
    Traceback (most recent call last):
      File "/opt/pattoo-daemon/.python/graphql/execution/executor.py", line 452, in resolve_or_error
        return executor.execute(resolve_fn, source, info, **args)
      File "/opt/pattoo-daemon/.python/graphql/execution/executors/sync.py", line 16, in execute
        return fn(*args, **kwargs)
      File "/opt/pattoo-daemon/.python/flask_graphql_auth/decorators.py", line 201, in wrapper
        return cls(AuthInfoField(message=str(e)))
    graphql.error.located_error.GraphQLLocatedError: 'NoneType' object is not callable
    
    opened by Dev-Dominic 1
  • create_access_token throws TypeError: Expected a string value

    create_access_token throws TypeError: Expected a string value

    I have the following authenticate mutation :

    class AuthMutation(graphene.Mutation):
        access_token = graphene.String()
        refresh_token = graphene.String()
    
        class Arguments:
            username = graphene.String()
            password = graphene.String()
    
        def mutate(self, info, username, password) :
            user = User.query.filter_by(username=username, password=password).first()
            print(user)
            if not user:
                raise Exception('Authenication Failure : User is not registered')
            if not user.verify_password(password):
                raise Exception('Authenication Failure : Incorrect Password')
            return AuthMutation(
                access_token=create_access_token(username),
                refresh_token=create_refresh_token(username)
            )
    

    When the method create_access_token(username) runs, it throws a type error even though the username is a String.

    I even tried to do run the function in debugConsole,create_access_token("random") but the same TypeError was thrown.

    opened by ShivanshJ 1
  • Problem with array queries

    Problem with array queries

    I had a problem while wrapping the following query with @query_jwt_required.

    query{
      returnArrayQuery(token: ""){
        ...
    }
    

    The error was cause GraphQl expects an iterable and the wrapper provides AuthInfoField when theres an error with jwt. I managed to solve it with the following code.

    def query_jwt_required_list(fn):
        @wraps(fn)
        def wrapper(*args, **kwargs):
            token = kwargs.pop(current_app.config["JWT_TOKEN_ARGUMENT_NAME"])
            try:
                verify_jwt_in_argument(token)
            except Exception as e:
                return [AuthInfoField(message=str(e))] # Returns a list
    
            return fn(*args, **kwargs)
    
        return wrapper
    

    I wonder if there's a native solution without need to modify the source code.

    help wanted 
    opened by alex2201 1
  • A request please

    A request please

    Can you please create a video ( a tutorial) describing how a layman like me can implement it ? The reason I am asking is - I tried to follow the doc but I was not sure , I was understanding why I was doing, what I was doing.

    I hope you will take this into consideration.

    Thanks a lot for everything.

    question 
    opened by gj1118 1
  • How are the ACCESS_EXP_LENGTH and REFRESH_EXP_LENGTH values used?

    How are the ACCESS_EXP_LENGTH and REFRESH_EXP_LENGTH values used?

    The docs reference ACCESS_EXP_LENGTH and REFRESH_EXP_LENGTH app config variables, but the only place I can find a reference to them is in the examples and conftest.py. Are these used by a dependency? Or should we use the JWT_ACCESS_TOKEN_EXPIRES and JWT_REFRESH_TOKEN_EXPIRES instead?

    bug 
    opened by grahambeckley 1
  • Persisting jwt information to database?

    Persisting jwt information to database?

    Hello @NovemberOscar ,

    This has been a smooth ride doing auth with graphql with this pip. However, when the flask application restarts, the jwt will no longer be valid. Is there a way to persist this data into a database? Let me know.

    Thanks, Mahesh

    question 
    opened by vangalamaheshh 1
  • Bump pyjwt from 2.0.1 to 2.4.0

    Bump pyjwt from 2.0.1 to 2.4.0

    Bumps pyjwt from 2.0.1 to 2.4.0.

    Release notes

    Sourced from pyjwt's releases.

    2.4.0

    Security

    What's Changed

    New Contributors

    Full Changelog: https://github.com/jpadilla/pyjwt/compare/2.3.0...2.4.0

    2.3.0

    What's Changed

    ... (truncated)

    Changelog

    Sourced from pyjwt's changelog.

    v2.4.0 <https://github.com/jpadilla/pyjwt/compare/2.3.0...2.4.0>__

    Security

    
    - [CVE-2022-29217] Prevent key confusion through non-blocklisted public key formats. https://github.com/jpadilla/pyjwt/security/advisories/GHSA-ffqj-6fqr-9h24
    

    Changed

    
    - Explicit check the key for ECAlgorithm by @estin in https://github.com/jpadilla/pyjwt/pull/713
    - Raise DeprecationWarning for jwt.decode(verify=...) by @akx in https://github.com/jpadilla/pyjwt/pull/742
    

    Fixed

    
    - Don't use implicit optionals by @rekyungmin in https://github.com/jpadilla/pyjwt/pull/705
    - documentation fix: show correct scope for decode_complete() by @sseering in https://github.com/jpadilla/pyjwt/pull/661
    - fix: Update copyright information by @kkirsche in https://github.com/jpadilla/pyjwt/pull/729
    - Don't mutate options dictionary in .decode_complete() by @akx in https://github.com/jpadilla/pyjwt/pull/743
    
    Added
    
    • Add support for Python 3.10 by @hugovk in https://github.com/jpadilla/pyjwt/pull/699
    • api_jwk: Add PyJWKSet.getitem by @woodruffw in https://github.com/jpadilla/pyjwt/pull/725
    • Update usage.rst by @guneybilen in https://github.com/jpadilla/pyjwt/pull/727
    • Docs: mention performance reasons for reusing RSAPrivateKey when encoding by @dmahr1 in https://github.com/jpadilla/pyjwt/pull/734
    • Fixed typo in usage.rst by @israelabraham in https://github.com/jpadilla/pyjwt/pull/738
    • Add detached payload support for JWS encoding and decoding by @fviard in https://github.com/jpadilla/pyjwt/pull/723
    • Replace various string interpolations with f-strings by @akx in https://github.com/jpadilla/pyjwt/pull/744
    • Update CHANGELOG.rst by @hipertracker in https://github.com/jpadilla/pyjwt/pull/751

    v2.3.0 &amp;lt;https://github.com/jpadilla/pyjwt/compare/2.2.0...2.3.0&amp;gt;__

    Fixed

    
    - Revert &amp;quot;Remove arbitrary kwargs.&amp;quot; `[#701](https://github.com/jpadilla/pyjwt/issues/701) &amp;lt;https://github.com/jpadilla/pyjwt/pull/701&amp;gt;`__
    
    Added
    
    • Add exception chaining [#702](https://github.com/jpadilla/pyjwt/issues/702) &amp;lt;https://github.com/jpadilla/pyjwt/pull/702&amp;gt;__

    v2.2.0 &amp;lt;https://github.com/jpadilla/pyjwt/compare/2.1.0...2.2.0&amp;gt;__

    &lt;/tr&gt;&lt;/table&gt; </code></pre> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary>

    <ul> <li><a href="https://github.com/jpadilla/pyjwt/commit/83ff831a4d11190e3a0bed781da43f8d84352653"><code>83ff831</code></a> chore: update changelog</li> <li><a href="https://github.com/jpadilla/pyjwt/commit/4c1ce8fd9019dd312ff257b5141cdb6d897379d9"><code>4c1ce8f</code></a> chore: update changelog</li> <li><a href="https://github.com/jpadilla/pyjwt/commit/96f3f0275745c5a455c019a0d3476a054980e8ea"><code>96f3f02</code></a> fix: failing advisory test</li> <li><a href="https://github.com/jpadilla/pyjwt/commit/9c528670c455b8d948aff95ed50e22940d1ad3fc"><code>9c52867</code></a> Merge pull request from GHSA-ffqj-6fqr-9h24</li> <li><a href="https://github.com/jpadilla/pyjwt/commit/24b29adfebcb4f057a3cef5aaf35653bc0c1c8cc"><code>24b29ad</code></a> Update CHANGELOG.rst (<a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/issues/751">#751</a>)</li> <li><a href="https://github.com/jpadilla/pyjwt/commit/31f5acb8fb3ec6cdfe2b1b0a4a8f329b5f3ca67f"><code>31f5acb</code></a> Replace various string interpolations with f-strings (<a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/issues/744">#744</a>)</li> <li><a href="https://github.com/jpadilla/pyjwt/commit/5581a31c21de70444c1162bcfa29f7e0fc86edda"><code>5581a31</code></a> [pre-commit.ci] pre-commit autoupdate (<a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/issues/748">#748</a>)</li> <li><a href="https://github.com/jpadilla/pyjwt/commit/3d4d82248f1120c87f1f4e0e8793eaa1d54843a6"><code>3d4d822</code></a> Don't mutate options dictionary in .decode_complete() (<a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/issues/743">#743</a>)</li> <li><a href="https://github.com/jpadilla/pyjwt/commit/1f1fe15bb41846c602b3e106176b2c692b93a613"><code>1f1fe15</code></a> Add a deprecation warning when jwt.decode() is called with the legacy verify=...</li> <li><a href="https://github.com/jpadilla/pyjwt/commit/35fa28e59d99b99c6a780d2a029a74d6bbba8b1e"><code>35fa28e</code></a> [pre-commit.ci] pre-commit autoupdate (<a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/issues/740">#740</a>)</li> <li>Additional commits viewable in <a href="https://github.com/jpadilla/pyjwt/compare/2.0.1...2.4.0">compare view</a></li> </ul> </details>

    <br />

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Why include AuthInfoField and not GraphqlError() ?

    Why include AuthInfoField and not GraphqlError() ?

    AuthInfoField makes things complex especially if you use Relay. A lot of errors of the type : Object doesn't match crop up.

    Can the error simply be a graphQLError ? (from the library graphql.error.base import GraphQLError)

    opened by ShivanshJ 1
  • NOTICE: Need maintainers!

    NOTICE: Need maintainers!

    Thanks for everybody use this extension.

    Now I'm focusing on sanic-jwt-extended project and not uses GraphQL now(no time to track graphene lib and GraphQL standards). so I can't maintain this extension actively now.

    It will be great if someone join this project as a maintainer. if you want to, mention me at this issue or mail me.

    Thanks and sorry. Seonghyeon Kim

    opened by NovemberOscar 5
Releases(v1.3.3)
Owner
Seonghyeon Kim
Mostly Harmless
Seonghyeon Kim
GraphQL security auditing script with a focus on performing batch GraphQL queries and mutations

BatchQL BatchQL is a GraphQL security auditing script with a focus on performing batch GraphQL queries and mutations. This script is not complex, and

Assetnote 267 Dec 24, 2022
This is a graphql api build using ariadne python that serves a graphql-endpoint at port 3002 to perform language translation and identification using deep learning in python pytorch.

Language Translation and Identification this machine/deep learning api that will be served as a graphql-api using ariadne, to perform the following ta

crispengari 2 Dec 30, 2021
A Django GraphQL Starter that uses graphene and graphene_django to interface GraphQL.

Django GraphQL Starter GraphQL is a query language for APIs and a runtime for fulfilling those queries with your existing data... According to the doc

0101 Solutions 1 Jan 10, 2022
MGE-GraphQL is a Python library for building GraphQL mutations fast and easily

MGE-GraphQL Introduction MGE-GraphQL is a Python library for building GraphQL mutations fast and easily. Data Validations: A similar data validation w

MGE Software 4 Apr 23, 2022
Django registration and authentication with GraphQL.

Django GraphQL Auth Django registration and authentication with GraphQL. Demo About Abstract all the basic logic of handling user accounts out of your

pedrobern 301 Dec 9, 2022
This is a minimal project using graphene with django and user authentication to expose a graphql endpoint.

Welcome This is a minimal project using graphene with django and user authentication to expose a graphql endpoint. Definitely checkout how I have mana

yosef salmalian 1 Nov 18, 2021
Adds GraphQL support to your Flask application.

Flask-GraphQL Adds GraphQL support to your Flask application. Usage Just use the GraphQLView view from flask_graphql from flask import Flask from flas

GraphQL Python 1.3k Dec 31, 2022
GraphQL framework for Python

Graphene ?? Join the community on Slack We are looking for contributors! Please check the ROADMAP to see how you can help ❤️ The below readme is the d

GraphQL Python 7.5k Jan 1, 2023
tartiflette-aiohttp is a wrapper of aiohttp which includes the Tartiflette GraphQL Engine, do not hesitate to take a look of the Tartiflette project.

tartiflette-aiohttp is a wrapper of aiohttp which includes the Tartiflette GraphQL Engine. You can take a look at the Tartiflette API documentation. U

tartiflette 60 Nov 8, 2022
ASGI support for the Tartiflette GraphQL engine

tartiflette-asgi is a wrapper that provides ASGI support for the Tartiflette Python GraphQL engine. It is ideal for serving a GraphQL API over HTTP, o

tartiflette 99 Dec 27, 2022
GraphQL is a query language and execution engine tied to any backend service.

GraphQL The GraphQL specification is edited in the markdown files found in /spec the latest release of which is published at https://graphql.github.io

GraphQL 14k Jan 1, 2023
GraphQL framework for Python

Graphene ?? Join the community on Slack We are looking for contributors! Please check the ROADMAP to see how you can help ❤️ The below readme is the d

GraphQL Python 7.5k Jan 1, 2023
Integrate GraphQL into your Django project.

Graphene-Django A Django integration for Graphene. ?? Join the community on Slack Documentation Visit the documentation to get started! Quickstart For

GraphQL Python 4k Dec 31, 2022
Ariadne is a Python library for implementing GraphQL servers using schema-first approach.

Ariadne Ariadne is a Python library for implementing GraphQL servers. Schema-first: Ariadne enables Python developers to use schema-first approach to

Mirumee Labs 1.9k Jan 1, 2023
A library to help construct a graphql-py server supporting react-relay

Relay Library for GraphQL Python GraphQL-relay-py is the Relay library for GraphQL-core. It allows the easy creation of Relay-compliant servers using

GraphQL Python 143 Nov 15, 2022
GraphQL Engine built with Python 3.6+ / asyncio

Tartiflette is a GraphQL Server implementation built with Python 3.6+. Summary Motivation Status Usage Installation Installation dependencies Tartifle

tartiflette 839 Dec 31, 2022
A new GraphQL library for Python 🍓

Strawberry GraphQL Python GraphQL library based on dataclasses Installation ( Quick Start ) The quick start method provides a server and CLI to get go

Strawberry GraphQL 2.8k Jan 1, 2023
tartiflette-aiohttp is a wrapper of aiohttp which includes the Tartiflette GraphQL Engine, do not hesitate to take a look of the Tartiflette project.

tartiflette-aiohttp is a wrapper of aiohttp which includes the Tartiflette GraphQL Engine. You can take a look at the Tartiflette API documentation. U

tartiflette 60 Nov 8, 2022
ASGI support for the Tartiflette GraphQL engine

tartiflette-asgi is a wrapper that provides ASGI support for the Tartiflette Python GraphQL engine. It is ideal for serving a GraphQL API over HTTP, o

tartiflette 99 Dec 27, 2022