django使用graphql的实例
一、开发环境
1、python3.6
2、django2.0
3、window10
二、项目搭建
1、创建一个虚拟空间mkvirtualenv空间名
2、创建一个django项目
3、安装graphql的依赖包
pipinstallgraphene-django
4、创建一个组件blog
5、把组件blog及graphene_django注入到app中
6、在settings.py中配置mysql数据库连接
三、书写blog的内容
1、在models.py中写上数据模型
fromdjango.dbimportmodels #Createyourmodelshere. classUser(models.Model): name=models.CharField(max_length=100,verbose_name="博主名字") gender=models.CharField(max_length=6,choices=(('male',u'男'),('female','女')),default='female', verbose_name='性别') create_at=models.DateTimeField(auto_now_add=True,verbose_name='创建时间') classBlog(models.Model): title=models.CharField(max_length=100,verbose_name='标题') user=models.ForeignKey(User,null=True,blank=True,on_delete=models.SET_NULL,verbose_name='博主名字') content=models.TextField(verbose_name='博客内容') create_at=models.DateTimeField(auto_now_add=True,verbose_name='创建时间') update_at=models.DateTimeField(auto_now=True,verbose_name='更新时间')
2、新建一个schema.py文件
#!/usr/bin/envpython #encoding:utf-8 importgraphene fromgraphene_django.typesimportDjangoObjectType from.modelsimportUser,Blog classUserType(DjangoObjectType): classMeta: model=User classBlogType(DjangoObjectType): classMeta: model=Blog #定义动作约素输入类型 classUserInput(graphene.InputObjectType): name=graphene.String(required=True) gender=graphene.String(required=True) classBlogInput(graphene.InputObjectType): title=graphene.String(required=True) user=graphene.Int(required=True) content=graphene.String(required=True) #定义一个创建user的mutation classCreateUser(graphene.Mutation): #api的输入参数 classArguments: user_data=UserInput(required=True) #api的响应参数 ok=graphene.Boolean() user=graphene.Field(UserType) #api的相应操作,这里是create defmutate(self,info,user_data): user=User.objects.create(name=user_data['name'],gender=user_data['gender']) ok=True returnCreateUser(user=user,ok=ok) #定义一个创建博客的mutation classCreateBlog(graphene.Mutation): classArguments: blog_data=BlogInput(required=True) blog=graphene.Field(BlogType) defmutate(self,info,blog_data): #插入到数据库中 blog=Blog.objects.create(title=blog_data['title'],user_id=blog_data['user'],content=blog_data['content']) returnCreateBlog(blog=blog) #定义一个查询语句 classQuery(object): all_user=graphene.List(UserType) all_blog=graphene.List(BlogType) defresolve_all_user(self,info,**kwargs): #查询所有book的逻辑 returnUser.objects.all() defresolve_all_blog(self,info,**kwargs): #查询所有title的逻辑 returnBlog.objects.all()
3、在跟目录(和settings.py同级)创建一个项目的总schema.py
importgraphene importbook.schema,blog.schema classQuery(blog.schema.Query,graphene.ObjectType): #总的Schema的query入口 pass classMutations(graphene.ObjectType): #总的Schema的mutations入口 create_user=blog.schema.CreateUser.Field() create_blog=blog.schema.CreateBlog.Field() schema=graphene.Schema(query=Query,mutation=Mutations)
4、配置url地址
fromdjango.contribimportadmin fromdjango.urlsimportpath fromgraphene_django.viewsimportGraphQLView from.schemaimportschema urlpatterns=[ path('admin/',admin.site.urls), path('graphql/',GraphQLView.as_view(graphiql=True,schema=schema)), ]
5、生成数据库映射及启动项目,直接在浏览器上访问
四、可以对上面的代码调整
1、把Mutations也单独定义在各自的schema.py中
#定义一个总的mutation出口 classMutation(graphene.AbstractType): create_user=CreateUser.Field() create_blog=CreateBlog.Field()
2、在总的schema.py中引入类型Query一样的操作
classMutations(blog.schema.Mutation,graphene.ObjectType): #总的Schema的mutations入口 pass
3、输入数据类型可以直接定义在mutation里面
classCreateUser(graphene.Mutation): #api的输入参数(类名可以随便定义) classArguments: name=graphene.String(required=True) gender=graphene.String(required=True) #api的响应参数 ok=graphene.Boolean() user=graphene.Field(UserType) #api的相应操作,这里是create defmutate(self,info,name,gender): user=User.objects.create(name=name,gender=gender) ok=True returnCreateUser(user=user,ok=ok)
五、Query语句中使用条件查询
1、app的schema(官方案例)
importgraphene fromgraphene_django.typesimportDjangoObjectType from.modelsimportCategory,Ingredient classCategoryType(DjangoObjectType): classMeta: model=Category classIngredientType(DjangoObjectType): classMeta: model=Ingredient #定义一个查询 classQuery(object): #定义一个根据id或者name查询的 category=graphene.Field(CategoryType, id=graphene.Int(), name=graphene.String()) #查询全部的 all_categories=graphene.List(CategoryType) #根据条件查询 ingredient=graphene.Field(IngredientType, id=graphene.Int(), name=graphene.String()) #查询全部的 all_ingredients=graphene.List(IngredientType) defresolve_all_categories(self,info,**kwargs): returnCategory.objects.all() defresolve_all_ingredients(self,info,**kwargs): #Wecaneasilyoptimizequerycountintheresolvemethod returnIngredient.objects.select_related('category').all() #定义查询语句 defresolve_category(self,info,**kwargs): id=kwargs.get('id') name=kwargs.get('name') ifidisnotNone: returnCategory.objects.get(pk=id) ifnameisnotNone: returnCategory.objects.get(name=name) returnNone defresolve_ingredient(self,info,**kwargs): id=kwargs.get('id') name=kwargs.get('name') ifidisnotNone: returnIngredient.objects.get(pk=id) ifnameisnotNone: returnIngredient.objects.get(name=name) returnNone
官网地址
补充知识:记录下python中使用定时器的几种方法
方式一、直接使用while循环的方式
fromdatetimeimportdatetime importtime #每n秒执行一次 deftimer(n): whileTrue: print(datetime.now().strftime("%Y-%m-%d%H:%M:%S")) time.sleep(n) timer(5)
方式二、使用threading模块中的Timer
fromdatetimeimportdatetime fromthreadingimportTimer #打印时间函数 defprint_time(inc): print(datetime.now().strftime("%Y-%m-%d%H:%M:%S")) """ Timer的参数说明 inc:表示时间间隔 print_time:执行的函数 (inc,):传递给执行函数的参数 """ t=Timer(inc,print_time,(inc,)) t.start() print_time(2)
方式三、使用sched模块
importtime importsched fromdatetimeimportdatetime #初始化sched模块的scheduler类 #第一个参数是一个可以返回时间戳的函数,第二个参数可以在定时未到达之前阻塞。 schedule=sched.scheduler(time.time,time.sleep) #被周期性调度触发的函数 defprint_time(inc): print(datetime.now().strftime("%Y-%m-%d%H:%M:%S")) schedule.enter(inc,0,print_time,(inc,)) #默认参数60s defstart(inc=60): #enter四个参数分别为:间隔事件、优先级(用于同时间到达的两个事件同时执行时定序)、被调用触发的函数、给触发函数的参数(tuple形式) schedule.enter(0,0,print_time,(inc,)) schedule.run() if__name__=="__main__": start(10)
方式四、使用apscheduler
fromapscheduler.schedulers.blockingimportBlockingScheduler fromdatetimeimportdatetime defjob(): print(datetime.now().strftime('%Y-%m-%d%H:%M:%S')) if__name__=="__main__": scheduler=BlockingScheduler() scheduler.add_job(job,'interval',seconds=5) scheduler.start()
以上这篇django使用graphql的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。