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中的ConfigParser模块使用详解
May 04 Python
python实现的正则表达式功能入门教程【经典】
Jun 05 Python
使用Python爬了4400条淘宝商品数据,竟发现了这些“潜规则”
Mar 23 Python
基于Python List的赋值方法
Jun 23 Python
使用pandas把某一列的字符值转换为数字的实例
Jan 29 Python
python求最大值,不使用内置函数的实现方法
Jul 09 Python
如何使用pandas读取txt文件中指定的列(有无标题)
Mar 05 Python
Python基于class()实现面向对象原理详解
Mar 26 Python
Django 实现将图片转为Base64,然后使用json传输
Mar 27 Python
python利用xpath爬取网上数据并存储到django模型中
Feb 26 Python
Python爬取科目四考试题库的方法实现
Mar 30 Python
解决pycharm安装scrapy DLL load failed:找不到指定的程序的问题
Jun 08 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
phpMyAdmin2.11.6安装配置方法
2008/08/24 PHP
php遍历数组的方法分享
2012/03/22 PHP
基于session_unset与session_destroy的区别详解
2013/06/03 PHP
在Laravel的Model层做数据缓存的实现
2019/09/26 PHP
javascript打开新窗口同时关闭旧窗口
2009/01/16 Javascript
兼容IE、FireFox、Chrome等浏览器的xml处理函数js代码
2011/11/30 Javascript
JS中setInterval、setTimeout不能传递带参数的函数的解决方案
2013/04/28 Javascript
jquery复选框checkbox实现删除前判断
2014/04/20 Javascript
jQuery插件AjaxFileUpload实现ajax文件上传
2016/05/05 Javascript
总结JavaScript设计模式编程中的享元模式使用
2016/05/21 Javascript
前端 Vue.js 和 MVVM 详细介绍
2016/12/29 Javascript
vue-router:嵌套路由的使用方法
2017/02/21 Javascript
JS实现自定义状态栏动画文字效果示例
2017/10/12 Javascript
微信小程序实现手势图案锁屏功能
2018/01/30 Javascript
vux uploader 图片上传组件的安装使用方法
2018/05/15 Javascript
vue组件开发props验证的实现
2019/02/12 Javascript
layui 上传插件 带预览 非自动上传功能的实例(非常实用)
2019/09/23 Javascript
vue图片上传组件使用详解
2019/12/23 Javascript
JavaScript中数组去重的5种方法
2020/07/04 Javascript
python如何把嵌套列表转变成普通列表
2018/03/20 Python
利用python将json数据转换为csv格式的方法
2018/03/22 Python
python requests爬取高德地图数据的实例
2018/11/10 Python
Python3最长回文子串算法示例
2019/03/04 Python
Python+OpenCV+pyQt5录制双目摄像头视频的实例
2019/06/28 Python
Python(PyS60)实现简单语音整点报时
2019/11/18 Python
python批量修改文件名的示例
2020/09/27 Python
一道SQL存储过程面试题
2016/10/07 面试题
读书之星事迹材料
2014/05/12 职场文书
企业晚会策划方案
2014/05/29 职场文书
公司总经理任命书
2014/06/05 职场文书
党委干部批评与自我批评发言稿
2014/09/28 职场文书
群众路线个人剖析材料及整改措施
2014/11/04 职场文书
2015年国庆节活动总结
2015/03/23 职场文书
谢师宴学生答谢词
2015/09/30 职场文书
jquery插件实现代码雨特效
2021/04/24 jQuery
Redis主从配置和底层实现原理解析(实战记录)
2021/06/30 Redis