django使用graphql的例項
阿新 • • 發佈:2020-09-03
一、開發環境
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,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,**kwargs): # 查詢所有book的邏輯 return User.objects.all() def resolve_all_blog(self,**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,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,name=graphene.String()) # 查詢全部的 all_ingredients = graphene.List(IngredientType) def resolve_all_categories(self,**kwargs): return Category.objects.all() def resolve_all_ingredients(self,**kwargs): # We can easily optimize query count in the resolve method return Ingredient.objects.select_related('category').all() # 定義查詢語句 def resolve_category(self,**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,**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,)) # 預設引數 60 s def start(inc=60): # enter四個引數分別為:間隔事件、優先順序(用於同時間到達的兩個事件同時執行時定序)、被呼叫觸發的函式、給觸發函式的引數(tuple形式) schedule.enter(0,)) 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的例項就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。