用于简化石墨烯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身份验证的删除变异
  • 1.0.2(2019-04-05)

    • 更新的部署文档
    • 向自述文件添加了降价支持
  • 1.0.1(2019-04-05)

    • 添加了有关GraphQLTestCase
    • 的文档
    • 将版本放入变量__init__.py
  • 1.0.0(2019-04-04)

    • 初始包已发布

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
选项卡内的java 安卓工具栏   java接口VS API VS公共类   无法解析java。lang.ClassNotFoundException:在安卓 studio中找不到类“com.example.安卓.camera2basic.AutoFitTextureView”?   java等待线程正常完成   java在JTable中的prepareRenderer方法中编辑单元格数据是否可行?   java SessionNotCreatedException selenium webdriver   java Android Studio Gradle CreateProcess错误=2   java找不到适用于异常(int)的构造函数   javascript如何在不使用正则表达式的情况下检查输入是否为表情符号?   从JAVA运行ant时,JAVA_HOME变量不正确   long的java min值引发异常   java如何在这段代码中实现侦听器?   带有透明文本的java Android按钮   图像Java扫描仪问题(JFrame)   java模拟输入蒸汽似乎在Junit测试的第一次输入中就被吃掉了   压缩Java Deflater,现在和将来的结果相同(确定性)   java JTable getModel()。setValueAt从数组中删除第一个元素   java我有不同于编译器和计算器的价值   使用C#客户端调用基本身份验证java webservice   java相同类型的多个@Embedded字段在持久化后始终为空