1. ホーム
  2. パイソン

Python ウェブサイト実行 Django経由のLuaスクリプト(データ解析用)

2022-03-02 11:55:44
<パス

目次


PythonによるWebサイト構築 Django経由のLuaスクリプト実行 (データ解析の実装)

PythonやLuaをエレガントに操作する方法についてですが、もちろんいろいろな方法がありますが、純粋なScript操作だけではあまりカッコよくないものが多いので、この記事ではWebフォームで実装し、現実的にはWeb UIで操作してもらう方が楽です。

I. 問題の背景と解決策

  • 背景 IoTプロジェクト、デバイス側とクラウド/アプリ側のデータ通信プロトコルは、バイナリ、Json形式、すべてLuaで解析(バイナリとjson形式の間の実際の変換は、デバイスのシリーズが原因で唯一のバイナリを使用することができます)、バグのLuaスクリプトは、トラブルシューティングは容易ではない、特にアプリ しかしLuaスクリプトはトラブルシューティングは容易ではない、特にアプリ/クラウド/デバイス三者通話は多くのメッセージをチェックしなければならず、間違った記号はパースが失敗する原因となります。

  • 質問 Device側の開発者として書いたLuaスクリプトをCloudのPaasにデプロイする必要があり、クラスDeviceの上流と下流のデータを正しく処理するためにはLuaを通してBinary - Jsonに転送しなければならず、Luaには問題がある、App/Cloudチームは我々のローカル実行luaにメッセージを送る必要があり、それをチェックする。 もちろん私は怠け者で、そんな面倒は耐えられないのです。

  • 解決する Django を使って Bin-Json メッセージ変換サイトを構築し、App/Cloud/Device の三者がこのサイトを利用してメッセージデータの lua パース変換を行い、すべての関係者が正しいデータを持っていることをチェックするのです。

プロジェクトで使用しているluaスクリプトはlinuxでしか実行できないのでexeにはできず、webで開発者に公開するのが一番早くて便利です。

II. Lua実行プレビュー

- JsonからBinaryへ。(メッセージタイプを自動認識して変換します)

- バイナリからJsonへ。

パースに失敗した場合、エラーログは Django のコンソールで次のように表示され ます。

  • ログイン画面


Djangoのログインページより。 Liu Jiang氏によるDjangoチュートリアル

...

III. メインコードの説明

翻訳.py

translate.pyは、Bin-Json変換ページの入力ボックスから変換するメッセージを受け取り、それをmsgInput.txtに書き込みます。
次に、サブプロセスからcheck_outputを呼び出して、luaParser.luaを実行します。 (メッセージ解析スクリプト)を使って変換し、変換後のメッセージを msgOutput.txt に書き込んで、最後に変換結果をページに戻して表示します。

# -*- coding: utf-8 -*-
 
from django.shortcuts import render
from django.views.decorators import csrf
from django.shortcuts import redirect

#from translator import translator
import subprocess as ss
import sys
import traceback

msgInput_FileName = "msgInput.txt"
msgOutput_FileName = "msgOutput.txt"


def WritetoFile(FileName,Data):
    # fileName= 'record.txt'
    with open(FileName,'w') as record:
        strr = ""
        content = strr.join(Data)
        record.write(content+'\n')
        
def ReadFile(FileName):
    fileName = FileName
    with open(fileName) as record:
        lines = record.read().splitlines()
        #print(lines)
        return lines
 
# handle POST request data
def translate_post(request):
    if not request.session.get('is_login', None):
        return redirect('/login/')
    
    ctx = {}
    if request.POST:
        #Get input from post
        MsgInput = request.POST['q']
        print('Input from WebPage is:'+MsgInput)
        WritetoFile(msgInput_FileName, MsgInput)
        message = 'Input is empty, please check the content!
        
        #input check
        if MsgInput.strip():
            try:
                luaPrint = ss.check_output(['lua luaParser.lua'],shell=True)
                #print (luaPrint)
                Msgoutput = ReadFile(msgOutput_FileName)
                #print (Msgoutput)
            except ss.CalledProcessError as exc:  
                print(exc.returncode)
                print(exc.output)
                #Error log
                tblog = traceback.format_exc()
                Msgoutput = 'Error in Lua:'+str(exc.output)
                Msgoutput+= '.................... ErrorCode is:'+ str(exc.returncode)
                Msgoutput+= '.................... .ErrorLog is:'+ tblog
        
            ctx['rlt'] = Msgoutput
            ctx['msgInput'] = MsgInput
            
            #return a dictionary
            return render(request, "login/index.html", ctx)
        else:
            return render(request, "login/index.html", {'message': message})

    return render(request, 'login/index.html', locals())


if __name__ == '__main__':
    if(sys.argv[1:] == []):
        print('Not input parameter , Use latest Data in msgInput.txt...')
    else:
        MsgInput = sys.argv[1]
        WritetoFile(msgInput_FileName, MsgInput)
        


msgInput.txt と msgOutput.txt ファイルは、メッセージ・データのキャッ シュとして使用されます。

LuaParser.lua

luaParser.luaはmsgInput.txtを読んで入力メッセージがバイナリデータかjsonデータかを判断し、対応するスクリプトを呼び出して変換し、変換後のデータをmsgOutput.txtに書き込んでページ上に表示します。

--Howard Xue , 20190322

launch = require'decode_launch'
code = launch'xxxchinaxxx.lua'

msgInput_FileName = "msgInput.txt"
msgOutput_FileName = "msgOutput.txt"

-- File Operation
function readMsgfile(filename)  
	file = io.open(filename, "r")

	MsgRead = file:read()
	--print(MsgRead)

	file:close()
end 


function writeMsgfile(path, content)
   mode = "w+"
   local file = io.open(path, mode)
   if file then
     if file:write(content) == nil then return false end
     io.close(file)
     return true
   else
     return false
 end
end


-- Main begin

isBin2Json = isMsgData_Binary(msgInput_FileName)

readMsgfile(msgInput_FileName)

if isBin2Json == true then
-- Hex to Json
	print(" Bin --> Json :")
	outputData = code.convertFromDevice(code.hex(MsgRead))
	writeMsgfile(msgOutput_FileName, outputData)
	print(outputData)
else
--Json to Hex
	print(" Json --> Bin :")
	--print(code.hexDump(code.convertToDevice(MsgRead)))
	outputData = code.hexDump(code.convertToDevice(MsgRead))
	writeMsgfile(msgOutput_FileName, outputData)
	print(outputData)
end


--readMsgfile(msgOutput_FileName)
--print(MsgRead)

--hex to Json
--print("Msg Output is:")
--print(code.convertFromDevice(code.hex(MsgRead)))




Bin-Json変換ページ

login/index.htmlにログインし、入力ボックスに変換するデータを入力し、one-click convertをクリックし、translate.pyにデータを投入し、変換結果(rltすなわちmsgOutput)を表示します。

{% load static %}
<!DOCTYPE html>
<html lang="en">
  <head>
    <! -- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <! -- Bootstrap CSS -->
      <link href="https://cdn.bootcss.com/twitter-bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet">
      <link href="{% static 'login/css/login.css' %}" rel="stylesheet" />

    <title>Bin-Json conversion</title>
  </head>
<body>


<br><br />

  <div class="container">
  
  <h1 style="color:#FFFFF0">{{ request.session.user_name }}!  Welcome back! </h1>
  
  <p>
    <a style="color:#F08080" href="/logout/">Logout login</a>
  </p>
<br> <br />
            <div class="col">
			  
			   <form action="/translate/" method="post">
					{% csrf_token %}
					{% if message %}
                      <div class="alert alert-warning">{{ message }}</div>
					{% endif %}
					
					<input type="text" name="q" style="width:800px;height:50px;font-size:15px" placeholder="Enter binary or json message" autofocus >
					<! -- <input type="submit" value="Submit"> -->
					 <button type="submit" class="btn btn-primary">One-click conversion</button>
			   </form>
			   
			   <div style="color:#FFFF00;word-break:break-all">Note: If the conversion result is Error, please check the correctness of the input data, and whether the script reports an error</div>
            </div>
			
			
				<div style="font-family:verdana;padding:20px;border-radius:10px;border:5px solid #EE872A;">
				
						<h3>Result:</h3>

						<div style="color:#000000;word-break:break-all">{{ rlt }}</div>

				</div>
				<br><br/>
				<div style="font-family:verdana;padding:20px;border-radius:10px;border:5px solid #EE872A;">
				
						<h3>Input:</h3>

						<div style="color:#000000;word-break:break-all">{{ msgInput }}</div>

				</div>
  </div> <! -- /container -->

    <! -- Optional JavaScript -->
    <! -- jQuery first, then Popper.js, then Bootstrap JS -->

    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
    <script src="https://cdn.bootcss.com/popper.js/1.15.0/umd/popper.min.js"></script>
    <script src="https://cdn.bootcss.com/twitter-bootstrap/4.3.1/js/bootstrap.min.js"></script>

</body>
</html>



urls.py

翻訳URLの対応を追加

from django.contrib import admin
from django.conf.urls import url
from django.urls import path
from django.urls import include
from login import views, translate

urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/', views.index),
    path('login/', views.login),
    path('register/', views.register),
    path('login/', views.login), path('register/', views.register), path('logout/', views.logout),
    path('confirm/', views.user_confirm),
    path('captcha/', include('captcha.urls')),
  
    path('translate/', translate.translate_post),
]



その他の楽しいPythonスクリプト

自動メール送信のPython実装 - 自動的にブログ/ウェブサイトをクロールしてメッセージメールを探し、対応するメールを送信します。
Python 自動コード生成 - tkinter によるコードフレームのグラフィカルな操作と生成
Python Parsing CSV Data - ロジックアナライザからエクスポートされたCSVデータをPandasでパースする。
Python DjangoでLuaスクリプトを実行するWebサイトを構築(データパースを実装)


ブロガーがおすすめする人気記事

一気読みシリーズ。

LoRa Meshシリーズ。

サイバーセキュリティシリーズ。

エンベデッド開発シリーズ。

AI / 機械学習シリーズ。