django使用graphql的实例


Posted in Python onSeptember 02, 2020

一、开发环境

1、python3.6

2、django2.0

3、window10

二、项目搭建

1、创建一个虚拟空间mkvirtualenv 空间名

2、创建一个django项目

3、安装graphql的依赖包

pip install graphene-django

4、创建一个组件blog

5、把组件blog及graphene_django注入到app中

6、在settings.py中配置mysql数据库连接

三、书写blog的内容

1、在models.py中写上数据模型

from django.db import models

# Create your models here.
class User(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='创建时间')

class Blog(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/env python
# encoding: utf-8

import graphene
from graphene_django.types import DjangoObjectType
from .models import User, Blog

class UserType(DjangoObjectType):
 class Meta:
  model = User

class BlogType(DjangoObjectType):
 class Meta:
  model = Blog

# 定义动作约素输入类型
class UserInput(graphene.InputObjectType):
 name = graphene.String(required=True)
 gender = graphene.String(required=True)

class BlogInput(graphene.InputObjectType):
 title = graphene.String(required=True)
 user = graphene.Int(required=True)
 content = graphene.String(required=True)

# 定义一个创建user的mutation
class CreateUser(graphene.Mutation):
 # api的输入参数
 class Arguments:
  user_data = UserInput(required=True)

 # api的响应参数
 ok = graphene.Boolean()
 user = graphene.Field(UserType)

 # api的相应操作,这里是create
 def mutate(self, info, user_data):
  user = User.objects.create(name=user_data['name'], gender=user_data['gender'])
  ok = True
  return CreateUser(user=user, ok=ok)


# 定义一个创建博客的mutation
class CreateBlog(graphene.Mutation):
 class Arguments:
  blog_data = BlogInput(required=True)

 blog = graphene.Field(BlogType)

 def mutate(self, info, blog_data):
  # 插入到数据库中
  blog = Blog.objects.create(title=blog_data['title'], user_id=blog_data['user'], content=blog_data['content'])
  return CreateBlog(blog=blog)

# 定义一个查询语句
class Query(object):
 all_user = graphene.List(UserType)
 all_blog = graphene.List(BlogType)

 def resolve_all_user(self, info, **kwargs):
  # 查询所有book的逻辑
  return User.objects.all()

 def resolve_all_blog(self, info, **kwargs):
  # 查询所有title的逻辑
  return Blog.objects.all()

3、在跟目录(和settings.py同级)创建一个项目的总schema.py

import graphene
import book.schema, blog.schema

class Query(blog.schema.Query, graphene.ObjectType):
 # 总的Schema的query入口
 pass

class Mutations(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地址

from django.contrib import admin
from django.urls import path
from graphene_django.views import GraphQLView
from .schema import schema
urlpatterns = [
 path('admin/', admin.site.urls),
 path('graphql/', GraphQLView.as_view(graphiql=True, schema=schema)),
]

5、生成数据库映射及启动项目,直接在浏览器上访问

四、可以对上面的代码调整

1、把Mutations也单独定义在各自的schema.py中

# 定义一个总的mutation出口
class Mutation(graphene.AbstractType):
 create_user = CreateUser.Field()
 create_blog = CreateBlog.Field()

2、在总的schema.py中引入类型Query一样的操作

class Mutations(blog.schema.Mutation, graphene.ObjectType):
 # 总的Schema的mutations入口
 pass

3、输入数据类型可以直接定义在mutation里面

class CreateUser(graphene.Mutation):
 # api的输入参数(类名可以随便定义)
 class Arguments:
  name = graphene.String(required=True)
  gender = graphene.String(required=True)

 # api的响应参数
 ok = graphene.Boolean()
 user = graphene.Field(UserType)

 # api的相应操作,这里是create
 def mutate(self, info, name, gender):
  user = User.objects.create(name=name, gender=gender)
  ok = True
  return CreateUser(user=user, ok=ok)

五、Query语句中使用条件查询

1、app的schema(官方案例)

import graphene
from graphene_django.types import DjangoObjectType
from .models import Category, Ingredient

class CategoryType(DjangoObjectType):
 class Meta:
  model = Category

class IngredientType(DjangoObjectType):
 class Meta:
  model = Ingredient

# 定义一个查询
class Query(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)

 def resolve_all_categories(self, info, **kwargs):
  return Category.objects.all()

 def resolve_all_ingredients(self, info, **kwargs):
  # We can easily optimize query count in the resolve method
  return Ingredient.objects.select_related('category').all()

 # 定义查询语句
 def resolve_category(self, info, **kwargs):
  id = kwargs.get('id')
  name = kwargs.get('name')

  if id is not None:
   return Category.objects.get(pk=id)

  if name is not None:
   return Category.objects.get(name=name)

  return None

 def resolve_ingredient(self, info, **kwargs):
  id = kwargs.get('id')
  name = kwargs.get('name')

  if id is not None:
   return Ingredient.objects.get(pk=id)

  if name is not None:
   return Ingredient.objects.get(name=name)

  return None

官网地址

补充知识:记录下python中使用定时器的几种方法

方式一、直接使用while循环的方式

from datetime import datetime
import time

# 每n秒执行一次
def timer(n):
  while True:
    print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
    time.sleep(n)

timer(5)

方式二、使用threading模块中的Timer

from datetime import datetime
from threading import Timer

# 打印时间函数
def print_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模块

import time
import sched
from datetime import datetime

# 初始化 sched 模块的 scheduler 类
# 第一个参数是一个可以返回时间戳的函数,第二个参数可以在定时未到达之前阻塞。
schedule = sched.scheduler(time.time, time.sleep)

# 被周期性调度触发的函数
def print_time(inc):
  print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
  schedule.enter(inc, 0, print_time, (inc,))

# 默认参数 60 s
def start(inc=60):
  # enter四个参数分别为:间隔事件、优先级(用于同时间到达的两个事件同时执行时定序)、被调用触发的函数、给触发函数的参数(tuple形式)
  schedule.enter(0, 0, print_time, (inc,))
  schedule.run()

if __name__ == "__main__":
  start(10)

方式四、使用apscheduler

from apscheduler.schedulers.blocking import BlockingScheduler
from datetime import datetime


def job():
  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的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
在Django框架中编写Contact表单的教程
Jul 17 Python
Python 中的with关键字使用详解
Sep 11 Python
Python 中迭代器与生成器实例详解
Mar 29 Python
TensorFlow模型保存和提取的方法
Mar 08 Python
解决python nohup linux 后台运行输出的问题
May 11 Python
深入分析python中整型不会溢出问题
Jun 18 Python
python实现弹窗祝福效果
Apr 07 Python
网易有道2017内推编程题 洗牌(python)
Jun 19 Python
python GUI库图形界面开发之PyQt5 UI主线程与耗时线程分离详细方法实例
Feb 26 Python
python中元组的用法整理
Jun 15 Python
pandas之分组groupby()的使用整理与总结
Jun 18 Python
Python字符串split及rsplit方法原理详解
Jun 29 Python
django数据模型中null和blank的区别说明
Sep 02 #Python
sqlalchemy实现时间列自动更新教程
Sep 02 #Python
解决Python 函数声明先后顺序出现的问题
Sep 02 #Python
解决Python3.8运行tornado项目报NotImplementedError错误
Sep 02 #Python
详解python with 上下文管理器
Sep 02 #Python
Python 的 __str__ 和 __repr__ 方法对比
Sep 02 #Python
Python datetime 如何处理时区信息
Sep 02 #Python
You might like
使用eAccelerator加密PHP程序
2008/10/03 PHP
几种有用的变型 PHP中循环语句的用法介绍
2012/01/30 PHP
PHP中异常处理的一些方法整理
2015/07/03 PHP
php解析url并得到url中的参数及获取url参数的四种方式
2015/10/26 PHP
php 中phar包的使用教程详解
2018/10/26 PHP
JS操作XML中DTD介绍及使用方法分析
2019/07/04 PHP
javascript实现的在当前窗口中漂浮框的代码
2010/03/15 Javascript
使用js检测浏览器的实现代码
2013/05/14 Javascript
JS Map 和 List 的简单实现代码
2013/07/08 Javascript
jQuery中Form相关知识汇总
2015/01/06 Javascript
JavaScript取得WEB安全颜色列表的方法
2015/07/14 Javascript
Vue服务端渲染和Vue浏览器端渲染的性能对比(实例PK )
2017/03/31 Javascript
jQuery中map函数的两种方式
2017/04/07 jQuery
js实现网页的两个input标签内的数值加减(示例代码)
2017/08/15 Javascript
基于DOM节点删除之empty和remove的区别(详解)
2017/09/11 Javascript
微信小程序 数据绑定及运算的简单实例
2017/09/20 Javascript
从vue基础开始创建一个简单的增删改查的实例代码(推荐)
2018/02/11 Javascript
使用json-server简单完成CRUD模拟后台数据的方法
2018/07/12 Javascript
深度了解vue.js中hooks的相关知识
2019/06/14 Javascript
如何基于JavaScript判断图片是否加载完成
2019/12/28 Javascript
借助云开发实现小程序短信验证码的发送
2020/01/06 Javascript
基于js判断浏览器是否支持webGL
2020/04/18 Javascript
jQuery cookie的公共方法封装和使用示例
2020/06/01 jQuery
Angular+Ionic使用queryParams实现跳转页传值的方法
2020/09/05 Javascript
[38:23]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第一场
2014/05/24 DOTA
python八大排序算法速度实例对比
2017/12/06 Python
python写入已存在的excel数据实例
2018/05/03 Python
python查看模块,对象的函数方法
2018/10/16 Python
Python turtle库绘制菱形的3种方式小结
2019/11/23 Python
Python如何实现爬取B站视频
2020/05/20 Python
美国在线购买和出售礼品卡网站:EJ Gift Cards
2019/06/09 全球购物
linux面试题参考答案(10)
2016/10/26 面试题
家具商场的活动方案
2014/08/16 职场文书
励志演讲稿800字
2014/08/21 职场文书
六一儿童节园长致辞
2015/07/31 职场文书
公司要求试用期员工提交“述职报告”,该怎么写?
2019/07/17 职场文书