用于简化石墨烯django的更改的工具箱。
graphene-django-ai的Python项目详细描述
石墨烯django ai
简化石墨烯django的更改工具箱
安装
要安装graphene,只需在shell中运行此命令
pip install "graphene-django-ai>=1.0.0"
设置
请参阅django-graphene
基本包的文档。
https://github.com/graphql-python/graphene-django/blob/master/README.md
很有意思
graphene-django
的一些内部功能在__init__.py
内部被猴子修补。如果你想
看一眼“引擎盖下”,看看这个文件。
示例
基于django modelforms的graphql
这里有一个简单的django模型
fromdjango.dbimportmodelsclassUser(models.Model):first_name=models.CharField(max_length=100)last_name=models.CharField(max_length=100)
现在我们在my_app/forms.py
中创建一个ModelForm
:
fromdjangoimportformsfrom.modelsimportUserclassSpaceForm(forms.ModelForm):classMeta:model=Userexclude=[]
我们需要创建一个ObjectType
,它来自我们的模型。
住在my_apps/schemes/schematypes.py
:
fromgraphene_djangoimportDjangoObjectTypefrom..modelsimportUserclassUserType(DjangoObjectType):classMeta:model=User
这是my_app/schema/mutations.py
的突变。
从ModelForm
(或非模型形式)派生验证规则:
importgraphenefromgraphene_django_ai.forms.mutationsimportLoginRequiredDjangoModelFormMutationfrom.schematypesimportUserTypefrom..formsimportUserFormclassUserCreateUpdateMutation(LoginRequiredDjangoModelFormMutation):space=graphene.Field(UserType)classMeta:form_class=UserForm# Register new mutationclassUserMutation(graphene.ObjectType):spaces=UserCreateUpdateMutation.Field(description='Create and update users')
如果您现在在模式中注册UserMutation
,那么您就拥有了一个基于模型的干api
终点。祝贺你!
django模型对象的deletecontation
如果您想删除一个对象,可以很容易地使用DeleteMutation
这样:
fromgraphene_django_ai.schemes.mutationsimportDeleteMutationfrommy_app.modelsimportMyModelclassMyModelDeleteMutation(DeleteMutation):classMeta:model=MyModel
如果您使用的是django-graphql-jwt
身份验证,那么您可以确保仅登录访问您的delete端点,如下所示:
fromgraphene_django_ai.schemes.mutationsimportLoginRequiredDeleteMutationfrommy_app.modelsimportMyModelclassMyModelDeleteMutation(LoginRequiredDeleteMutation):classMeta:model=MyModel
如果需要自定义验证或基本查询集,可以重写如下方法:
fromgraphene_django_ai.schemes.mutationsimportLoginRequiredDeleteMutationfromgraphqlimportGraphQLErrorfrommy_app.modelsimportMyModelclassMyModelDeleteMutation(LoginRequiredDeleteMutation):classMeta:model=MyModeldefvalidate(self,request):ifnotrequest.user.is_superuser:raiseGraphQLError("This is only allowed for superusers!")defget_queryset(self,request):returnself.model.objects.filter(created_by=request.user)
jwt安全突变
如果你的突变源于LoginRequiredDjangoModelFormMutation
,你就不必手动接受
注意确保与装饰器的登录安全。
fromgraphene_django_ai.forms.mutationsimportLoginRequiredDjangoModelFormMutationclassMyMutation(LoginRequiredDjangoModelFormMutation):...
测试graphql调用
如果您想要unittest您的api调用,请从类GraphQLTestCase
派生您的测试用例。
用法:
importjsonfromgraphene_django.tests.base_testimportGraphQLTestCasefrommy_project.config.schemaimportschemaclassMyFancyTestCase(GraphQLTestCase):# Here you need to inject your test case's schemaGRAPHQL_SCHEMA=schemadeftest_some_query(self):response=self.query(''' query { myModel { id name } } ''',op_name='myModel')content=json.loads(response.content)# This validates the status code and if you get errorsself.assertResponseNoErrors(response)# Add some more asserts if you like...deftest_some_mutation(self):response=self.query(''' mutation myMutation($input: MyMutationInput!) { myMutation(input: $input) { my-model { id name } } } ''',op_name='myMutation',input_data={'my_field':'foo','other_field':'bar'})# This validates the status code and if you get errorsself.assertResponseNoErrors(response)# Add some more asserts if you like...deftest_failing_call(self):response=self.query(''' mutation myMutation($input: MyMutationInput!) { myMutation(input: $badInput) { my-model { id name } } } ''',op_name='myMutation',input_data={'my_field':'foo','other_field':'bar'})# This assert tests if the call raised some errors# For example if you want to test if invalid input is handled correctly by your endpointself.assertResponseHasErrors(response)# Add some more asserts if you like...
在本地运行测试
仍然是w.i.p.!
python -m unittest discover -v
重新发布新版本
在
Readme.md
中更新Changelog
创建拉取请求/合并到主控形状
运行:
- 确保已安装所有必需的软件包
pip install twine wheel
- 在主目录中创建文件:
~/.pypirc
[distutils] index-servers= pypi testpypi [pypi] repository: https://upload.pypi.org/legacy/ username: ambient-innovation [testpypi] repository: https://test.pypi.org/legacy/ username: ambient-innovation
- 创建分布
python setup.py sdist bdist_wheel
- 上传到测试pypi
twine upload --repository testpypi dist/*
- 检查测试pypi是否美观
- 上传到真实的pypi
twine upload dist/*
- 确保已安装所有必需的软件包
更改日志
1.0.4(2019-04-05)
- 修正了Django表单中始终需要布尔字段的错误
1.0.3(2019-04-05)
- 为django模型对象添加了删除变异
DeleteMutation
- 添加了确保jwt身份验证的删除变异
- 为django模型对象添加了删除变异
1.0.2(2019-04-05)
- 更新的部署文档
- 向自述文件添加了降价支持
1.0.1(2019-04-05)
- 添加了有关
GraphQLTestCase
的文档
- 将版本放入变量
__init__.py
- 添加了有关
1.0.0(2019-04-04)
- 初始包已发布