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 相关文章推荐
Python实现的RSS阅读器实例
Jul 25 Python
python导入时小括号大作用
Jan 10 Python
Scrapy爬虫实例讲解_校花网
Oct 23 Python
Python进程间通信Queue实例解析
Jan 25 Python
Python中列表与元组的乘法操作示例
Feb 10 Python
树莓派用python中的OpenCV输出USB摄像头画面
Jun 22 Python
python判断单向链表是否包括环,若包含则计算环入口的节点实例分析
Oct 23 Python
python实现七段数码管和倒计时效果
Nov 23 Python
Django websocket原理及功能实现代码
Nov 14 Python
Python快速优雅的批量修改Word文档样式
May 20 Python
TensorFlow的自动求导原理分析
May 26 Python
pytorch 权重weight 与 梯度grad 可视化操作
Jun 05 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
《PHP编程最快明白》第二讲 数字、浮点、布尔型、字符串和数组
2010/11/01 PHP
php中函数前加&符号的作用分解
2014/07/08 PHP
ThinkPHP中自定义错误页面和提示页面实例
2014/11/22 PHP
PHP ob缓存以及ob函数原理实例解析
2020/11/13 PHP
node.js使用cluster实现多进程
2016/03/17 Javascript
基于JQuery实现图片上传预览与删除操作
2016/05/24 Javascript
Three.js学习之网格
2016/08/10 Javascript
jQuery动态生成Bootstrap表格
2016/11/01 Javascript
关于vue的语法规则检测报错问题的解决
2018/05/21 Javascript
React 项目迁移 Webpack Babel7的实现
2018/09/12 Javascript
jQuery操作元素追加内容示例
2020/01/10 jQuery
vue使用require.context实现动态注册路由
2020/12/25 Vue.js
JavaScript中layim之整合右键菜单的示例代码
2021/02/06 Javascript
[45:25]OG vs EG 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.22
2019/09/05 DOTA
Python迭代和迭代器详解
2016/11/10 Python
Python中Django 后台自定义表单控件
2017/03/28 Python
python 计算两个日期相差多少个月实例代码
2017/05/24 Python
Numpy中stack(),hstack(),vstack()函数用法介绍及实例
2018/01/09 Python
python编程使用selenium模拟登陆淘宝实例代码
2018/01/25 Python
python3安装pip3(install pip3 for python 3.x)
2018/04/03 Python
解决python写入mysql中datetime类型遇到的问题
2018/06/21 Python
python3+PyQt5 数据库编程--增删改实例
2019/06/17 Python
Pytorch 实现权重初始化
2019/12/31 Python
15行Python代码实现免费发送手机短信推送消息功能
2020/02/27 Python
python开发一个解析protobuf文件的简单编译器
2020/11/17 Python
Python爬虫爬取有道实现翻译功能
2020/11/27 Python
python中remove函数的踩坑记录
2021/01/04 Python
洛杉矶健身中心女性专用运动服饰品牌:Marika
2018/05/09 全球购物
法律专业推荐信范文
2013/11/29 职场文书
优秀员工自荐书
2013/12/19 职场文书
创业大赛策划书
2014/03/01 职场文书
小学优秀教育工作者事迹材料
2014/05/09 职场文书
学校食品安全实施方案
2014/06/14 职场文书
创先争优活动心得体会
2014/09/04 职场文书
离职证明范本(5篇)
2014/09/19 职场文书
优秀党员主要事迹范文
2015/11/05 职场文书