在Django App中初始化GraphQL客户端的位置

时间:2020-06-15 11:11:39

标签: python django graphql

我正在使用Django构建API,我想查询Github GraphQL API,然后找到了GraphQL client个适合我需求的python。

但是现在,我想知道,在我的Django应用程序中初始化此类客户端的适当位置在哪里?里面的要求?在apps.py中?在views.py中?任何指导方针将不胜感激!这是我当前的Django Project文件夹结构:

.
├── 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

谢谢!

3 个答案:

答案 0 :(得分:1)

根据定义,graphql客户端需要它自己的配置,模块和错误处理,我建议您创建一个与其他项目相邻的名称空间。 Django使用Applications的概念,它为这种情况提供了单独的配置,日志记录和错误处理。您可以在settings.pyDocs)的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

答案 1 :(得分:1)

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


要视情况而定。

如果没有客户端的请求/用户选项(=每个请求/用户的客户端相同 ):

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

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

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

  1. 使用查看方法实例化新客户端

选项1-每个工作人员视图实例化一次客户端。尽管它提供了一些性能优势,但它们却微妙而模糊:

  • 您可能不知道这是什么意思:共享客户端=>可能会使用修改客户端状态的方法,以针对依赖状态的不同请求/用户
  • 工人的寿命实际上应该没有那么长
  • 难以评估绩效收益而难以评估正确实施

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

答案 2 :(得分:0)

我最终在名为/api的{​​{1}}应用程序中创建了一个python模块,该模块初始化了graphql客户端。从这里,它很容易导入。

我决定不为此创建一个单独的Django应用程序,因为由于代码的简单性,在这种情况下这会显得过高:

graphql.py中:

graphql.py