(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
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 09, 2022
Integrate GraphQL with your Pydantic models

graphene-pydantic A Pydantic integration for Graphene. Installation pip install "graphene-pydantic" Examples Here is a simple Pydantic model: import u

GraphQL Python 179 Jan 02, 2023
Django Project with Rest and Graphql API's

Django-Rest-and-Graphql # 1. Django Project Setup With virtual environment: mkdir {project_name}. To install virtual Environment sudo apt-get install

Shubham Agrawal 5 Nov 22, 2022
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
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 08, 2022
A real time webchat made in graphql

Graphql Chat. This is a real time webchat made in graphql. Description Welcome to my webchat api, here i put my knowledge in graphql to work. Requirem

Nathan André 1 Jan 03, 2022
RPyC (Remote Python Call) - A transparent and symmetric RPC library for python

RPyC (pronounced like are-pie-see), or Remote Python Call, is a transparent library for symmetrical remote procedure calls, clustering, and distribute

1.3k Jan 05, 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 01, 2023
UltraGraphQL - a GraphQL interface for querying and modifying RDF data on the Web.

UltraGraphQL - cloned from https://git.rwth-aachen.de/i5/ultragraphql Updated or extended files: build.gradle: updated maven to use maven {url "https:

DrSnowbird 1 Jan 07, 2023
Django GraphQL User Management

Django GraphQL User Management An app that explores User management with GraphQL using Graphene in Django. Topics covered: Login. Log Out. Authenticat

0101 Solutions 4 Feb 22, 2022
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
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 08, 2022
A Python dependency resolver

python-resolver A Python dependency resolver. Issues Only supports wheels (no sdists!) Usage Python library import packaging.requirements import resol

Filipe Laíns 19 Jun 29, 2022
Generate daily updated visualizations of user and repository statistics from the GitHub API using GitHub Actions

Generate daily updated visualizations of user and repository statistics from the GitHub API using GitHub Actions for any combination of private and public repositories - dark mode supported

Adam Ross 15 Dec 31, 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
A python graphql api, which serves ECB currency rates from last 90 days.

Exchange Rate Api using GraphQL Get Code git pull https://github.com/alaturqua/exchangerate-graphql.git Create .env file with following content and s

Isa 1 Nov 04, 2021
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 01, 2023
This is a simple Python that will parse instanceStats GraphQL Query into a CSV

GraphQL Python Labs - by Gabs the CSE Table of Contents About The Project Getting Started Prerequisites Installation and Usage Roadmap Contributing Li

Gabriel (Gabs) Cerioni 1 Oct 27, 2021
Graphene MongoEngine integration

Graphene-Mongo A Mongoengine integration for Graphene. Installation For installing graphene-mongo, just run this command in your shell pip install gra

GraphQL Python 261 Dec 31, 2022
Getting the ip of a fivem server with a cfx.re link

Dark Utilities - FIVEM-IP-RESOLVER Our Website https://omega-project.cz/ ! Install the app on the server Inplex-sys 12 Oct 25, 2022