簡體   English   中英

Flask-RESTful 和 Kivy

[英]Flask-RESTful and Kivy

我正在將 Flask-RESTful 與 Kivy 一起使用。 用於資源路由的 Flask-RESTful api 和用於 TFT GUI 的 Kivy。 兩者都是基於類的:Kivy 的主應用程序class Touch(App)和 restful api 的class Load(Resource)

class Load(Resource):
    @auth.login_required
    def post(self):
        data = request.json
        # call handle(data)


class Touch(App):
    api.add_resource(Load, '/load')
    def handle(data):
        # do something with data  

我想在class Touch(App)使用一個方法來進行路由。 我已經檢查了flask-restful 文檔這篇文章,但沒有找到基於方法的資源示例。 它必須是基於類的資源嗎?

Flask-RESTful 和 Kivy 可以作為兩個獨立的進程一起工作。 路由保留在 Flask 進程下,該進程使用Queue將請求傳遞給 Kivy 進程。

腳本:在此腳本中,FLASK 進程以 json 格式獲取“加載”請求並將其傳遞給 KIVY 進程。 該腳本適用於 Python2.7 和 Kivy 1.10.0。

#!/usr/bin/python2.7 python2.7
# -*- coding: utf-8 -*-

# kivy modules first, if not Kivy may cause problems
import kivy
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.label import Label
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import StringProperty
kivy.require('1.10.0')

# common modules
import sys
import os
import time
import signal
from multiprocessing import Process
from multiprocessing import Queue

# Flask modules
from flask import Flask
from flask import request
from flask_restful import reqparse, abort, Api, Resource

# wsgi (Web Server Gateway Interface) modules
import eventlet
from eventlet import wsgi

# json modules
import json, ast

# async server setup
app = Flask(__name__)
api = Api(app)

# global variables
data_json = None

def start_Flask(q):
    print("Starting Flask...")
    q.put([42, None, 'hello'])      # some random initial value
    wsgi.server(eventlet.listen(('', 5000)), app)   # deploy server

def signal_handler(signal, frame):  # process terminator
    print " CTRL + C detected, exiting ... "
    exit(0)

# api resource classes ###############################################
class Load(Resource):
    def post(self):
        data = request.json
        package = ("Load", data)    # create tuple
        q.put(package)  # put tuple into queue

# setup the Api resource routing here ################################
api.add_resource(Load, '/load')

# kivy gui classes ###################################################
# main screen        
class MainScreen(Screen):
    def __init__(self, **kwargs):
        self.name="MAIN SCREEN"
        super(Screen, self).__init__(**kwargs)

class My_Gui(App):
    MainScreenTitle = "MainScreen title"
    MainScreenLabel = "MainScreen label"
    MessageButtonEnter = "GO"
    MessageButtonExit = "EXIT"

    def cancel(self):
        print "load cancelled by user"

    def exit(self):
        print "exiting..."
        p1.terminate()
        exit(1)

    def enter(self):
        print "getting a queue element"
        try:
            if q.empty() == False:
                package = q.get()   # retrieve package from queue
                print("got the package")
                print(package)
        except:
            print "the queue is empty"  

    def build(self):
        sm = Builder.load_string("""

ScreenManager
    MainScreen:
        size_hint: 1, .7
        auto_dismiss: False
        title: app.MainScreenTitle       
        title_align: "center"

        BoxLayout:
            orientation: "vertical"
            Label:
                text: app.MainScreenLabel
            BoxLayout:
                orientation: "horizontal"
                spacing: 10
                size_hint: 1, .5
                Button:
                    text: app.MessageButtonEnter  # start app
                    on_press:
                        app.enter()
                Button:
                    text: app.MessageButtonExit  # exit app
                    on_press:
                        app.exit()
        """)

        return sm


# main #################################################################
if __name__ == '__main__':

    #CTRL+C signal handler
    signal.signal(signal.SIGINT, signal_handler)
    signal.signal(signal.SIGTERM, signal_handler)

    q = Queue()

    global p1
    p1 = Process(target=start_Flask, args=(q,)) # assign Flask to a process
    p1.daemon = True
    p1.start()  #launch Flask as separate process
    My_Gui().run()   # run Kivy app

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM