在Django应用程序中初始化GraphQL客户端的位置在哪里?

3

我正在使用Django构建API,我想查询Github GraphQL API,并找到了适合我的需要的Python语言的GraphQL客户端

但现在,我想知道在我的Django应用程序中初始化这样一个客户端的适当位置是什么?在请求内部?在apps.py中?在views.py中?任何指导都将不胜感激!这是我当前的Django项目文件夹结构:

.
├── LICENSE
├── README.md
├── api
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── db.sqlite3
├── manage.py
├── portfolio
│   ├── __init__.py
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── requirements.txt
└── setup.py

提前感谢您!


2
参考此文章。 https://medium.com/swlh/introduction-to-graphql-using-django-ca7058006574 - Anurag Misra
1
嘿!谢谢你的建议!但我觉得这不是我想要的。如果你仔细阅读,我并不是在构建一个GraphQL API,而是从Django请求中查询一个(Github v4 API)。我提到的库是Python的一个GraphQL客户端,它必须被初始化,但每次请求进来时都初始化一个新的客户端实例似乎是不必要的,所以我觉得应该有更好的地方来初始化这个库,并且稍后将已经初始化的客户端导入到视图中。 - ElPapi42
1
不能说这是最Django风格的方式,但我会把它放在views.py中。如果你只在一个视图中使用客户端,那么我会在该视图的函数/类中同时导入和初始化客户端。 - Azer
你好!我在思考这个问题,但是我在外面看到views.py每次请求都会被导入到工作进程中,也许我理解错了?如果是这样的话,可能和在请求本身上初始化没有什么区别。 - ElPapi42
1
为什么需要在服务器端进行查询? - martin
我想对查询结果进行预处理,以便更容易使用,也许这有点过头了,但我意识到这一点。 - ElPapi42
3个回答

1
TLDR: 在视图方法中实例化新客户端=每个请求的新客户端。(好的选择-覆盖initial视图方法)。稍后再改进。

这要看情况。

如果客户端没有请求/用户选项(即客户端对于每个请求/用户都是相同的):

  1. 像@ElPapi42建议的那样从子模块导入一个(与在views.py全局实例化新客户端相同,而不是作为方法逻辑的一部分)

  2. 或者在视图方法中直接实例化新客户端-每个请求一个新客户端

如果存在请求/用户特定选项(即客户端需要具有request.user特定选项/凭据):

  1. 在视图方法中实例化新客户端

选项1 - 每个工作视图只实例化一次客户端。虽然它提供了一些性能优势,但它们是微妙且不明显的:

  • 您可能不知道它的含义:共享客户端 => 可能使用修改客户端状态的方法进行不同请求/用户的依赖状态
  • 工作生命周期(应该)实际上并不长
  • 很难评估性能优势,并且很难评估适当的实现

实际上,您可能希望使用某些当前request.user特定选项连接到github,执行多个请求(=可能涉及cookies,并在后续请求中自动添加=>客户端不能与多个用户共享)=至少为每个用户单独设置客户端。


1
根据定义,GraphQL客户端需要拥有自己的配置、模块和错误处理。我建议您在其他项目旁创建一个命名空间。Django使用应用的概念为此提供了分离的配置、日志记录和错误处理。您可以在settings.py中的INSTALLED_APPS文档)中定义其他应用程序来扩展您的项目。您的项目结构看起来会像这样:
.
├── LICENSE
├── README.md
├── graphql-client
│   ├── __init__.py
│   ├── main.py
│   ├── client.py
│   ├── ressources
│   │   ├── __init__.py
│   ├── ├── repository.py
│   │   └── user.py
│   ├── settings.py
│   └── views.py
├── api
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── db.sqlite3
├── manage.py
├── portfolio
│   ├── __init__.py
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── requirements.txt
└── setup.py

你好!我将在我的/api Django应用程序中使用GraphQL客户端,你能建议一些完全独立于我的/api应用程序的替代方案吗?这样,它可以在项目之间轻松移动。 - ElPapi42
项目结构中的位置取决于您的偏好。然后,您可以通过在命名空间中初始化它来坚持使用Django的“应用程序”概念。 (api.graphql-client) - sebastian-ruehmann

0

我最终在/api应用程序中创建了一个名为graphql.py的Python模块,它初始化了GraphQL客户端。从这里开始,它可以轻松地被导入。

我决定不为此创建一个单独的Django应用程序,因为在这种情况下这将是过度设计,由于代码的简洁性:

在graphql.py中:

from gql import Client
from gql.transport.requests import RequestsHTTPTransport
from django.conf import settings

# Instaciate a graphql client
client = Client(
    transport=RequestsHTTPTransport(
        url='https://api.github.com/graphql',
        headers={'Authorization': 'bearer {token}'.format(token=settings.GITHUB_TOKEN)},
        verify=False,
        retries=3,
    ),
    fetch_schema_from_transport=True,
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接