2023年9月8日金曜日

Django/PythonでのWEBアプリ開発を更に勉強ーその4

 この前のところで、大枠はcanvasjsによる表示が出来そうなところまで来て、最後に残った2つの問題について、検討(検索?)

1)djangoで使用している変数の値を表示される方法

  context[xxx]=abcとしてhtml に{{xxx}}とすれば表示が出来るとあったので、

  context= { 'year' : d.year(), 'month':d.month(),.....  (d=datetime.datetime.now())

としてみたら、TypeError: 'int' object is not callable と出てくるので、

  context={'date': d.date()......}としたら、正しく表示されるようになりました。

 なんで二重中括弧でくくるの?とか、型の取り扱い(数値、文字、リスト、辞書等)が今一よく分かっていませんが、 取り敢えずは、問題の一つは解決。

2)canvasjsでの空のデータを渡されたときの対応 (未解決)

  DBからのデータが無かった場合に、当該のobjectが生成されないために、以下のようなエラーが出る。 因みにlocal variable referenced before assignmentはググると結構出てくるので、嵌りやすい問題かも(C等と違い、variableを事前に宣言しないで使えちゃうので些かキモイ言語だと思っていますが、これは典型的なエラーですね)

  :         :          :           :         :

 File "/home/Users/ken/application_environment/mysite2/wxmonitor/views.py", line 240, in dailydata
    'MR2data': MR2tempdata,
UnboundLocalError: local variable 'MR2tempdata' referenced before assignment
[08/Sep/2023 11:35:45] "GET /dailydata/ HTTP/1.1" 500 66299

で、views.pyの中で、objectが出来ていなかった場合には空のリストを生成して渡すようにした。 これで、canvasjsも当該のデータの欠落を無視して表示されるようになった。 

<これって配列を使用する前に、空の配列を作ってから使用するようにすれば、条件のif文を一つ省略できるし、Argol系の使用する前に宣言と同じことなので、此方で行くことにしました。 これデコードが大分スッキリしました。


左は、改良後の表示のの状態(下が正常な状態で、上が欠落データがある状態)


 

 後学のために改良したviews.pyの一部を下に示しておきます

 

初めから空の辞書リストを宣言しておけば、シンプルに書けるので、そういうふうに書き直しました。

 

 

 

 


 

2023年9月7日木曜日

Django/PythonでのWEBアプリ開発を更に勉強ーその3

 canvasjsのpython関連のサンプルソースで、簡単にDBの抽出データをserializers.serialize('jason', xxx.object.all())で渡していたので、ズボラにそのまま踏襲していたのが間違いでした。  

1)canvasjsのサンプルソースから、index.html(pythonに依存しない物)に直接データを埋め込んでpython manage.py runserver で実行してみると、まったく問題なく表示することが出来ました。

2) serializers.serialize('json',xxxx)でどのようなデータが作られるのか、python manage.py shellで手入力して確認してみました。(左図) うーん、これでは、無理ですよね。python manage.py shellはpython初心者にとっては、色々と試して見れるので極めて便利ですね。

if !flag:はダメでif flag=False:なんですね。 (何でもCっぽく理解しているのが悪いんですけど、、、)



3) 1)の場合の受け渡されるデータの形を確認すると、dictionary型のリスト?となっていたので、そのような形式でデータが送られるように、views.pyを改造することにしました。  夫々の、抽出データを加工して、dictionary型のリストを作り、これを渡してみましたところ、無事表示させることが出来ました。  


データの量が多いので、夫々のデータをcontextにdictionary型として入れ、htmlに送って動作することが確認できました。 (送出するデータの種類が増えても対応できるようにするため。)


   

 

ここまでは、無事に進んだのですが、対応するデータが存在しない時にエラーが発生するようなので、この対応を考えなくては、、、。  

 

 

更にhtmlでpythonで使用している変数を表示する方法が??

 


 

2023年9月5日火曜日

Django/PythonでのWEBアプリ開発を更に勉強ーその2

取り敢えず、動かして色々弄ってみるベンチが出来たいので、現在PHPで作って使用している、自宅の環境モニターの表示アプリ(定期的に何か所かの温度、湿度を自動的にサーバー


のDBにあげておき、必要に応じてDBから抽出、aggregationして時間毎、日毎、月毎のデータとしてグラフで表示させる)をDjangoに移行させてみました。  

 

1)DBのVIEWの扱い  DjangoではDB派のアクセスとしてORM(object-relational-mapping)が提供されていますが、これが今一使い難い。 例えば、夫々の地点から、温度、湿度、気圧を定期的に送っているので、データは、(場所、時間、温度、湿度、気圧)がひとまとまりのデータしてDBに存在しています。 従って、時間毎の最高、最低、平均等の所謂aggregationはDBのVIEWの様に一気に計算して欲しいのですが、ORMではこれはちょっと無理みたい。 なので、DBのVIEWでaggregationのビューを作って、これを参照するmodelを作る方法を取りました。 

class Meta: managed=FalseでDBのVIEWを参照できるみたいです。

>adminで表示されるこのテーブルの内容を弄るとどうなるのかは未確認

2)抽出したデータの表示 直近の場所毎の温度、湿度を表示するテーブルへのデータの送信は直近のデータを表示するDBのVIEW(Up2dateData.sql)を呼ぶclassでwxmonitor_testpage.htmlをtemplateに指定して、表示させてみました。 これは問題なくすんなりOK

models.py


3)aggregareデータのグラフ  取り敢えず、一日の時間毎の最高、最低、平均温度、平均湿度をDB VIEWのdailydatatoday.sqlから参照するclassをTodayData(models.Model)を作成。 これから、場所のフィルタを噛ませて、特定の場所のデータ(最高、最低、平均)を取得して、templateに送るviewを def dailydata(request)を作成

 wxmonitor_test.htmlで送られたデータをテーブルに表示することはできましたが、phpで使用しているcanvasjsで表示させようとすると、全く何も表示されずここで頓挫。

 

views.py  
 

 

 

canvasjsとdjangoの組み合わせでサンプルアプリをググって、ココココなど見ながら、canvasjsでグラフが表示できるか確認してみますが、何故かどれもダメ。  現時点でDjangoとcanvasjsとの組み合わせをうまく動作させることが出来ずに、頭を抱えています。

因みに、index.htmlに適当なグラフのサンプルのソースをcanvasjsのページから持って来て表示させるとちゃんと表示してくれます。 例えば、JavaScript Dynamic / Live Multi Series Chart をindex.htmlにして、djangoで呼び出してやると問題なく表示されているので、ここら辺から、問題点を探し出してゆくことにしようと思います。

ちょっと長期戦の予感、、、、

 

 

php のインストールの確認

phpって最初のfacebook書くときに使われたみたいで、それなりに歴史のある言語で、私も2006年位から使っていますが、CLIで使う事はあまり無いので、apacheとの連携のトラブル(mod_phpのバージョンの齟齬)などは気になりますが、拡張モジュールのインストールの問題に...