LoginSignup
1
0

More than 1 year has passed since last update.

【お店探しのWebAR】DjangoでWebSocket編

Posted at

どんなアプリ?

おおもとの記事です。
【Django,A-frame】お店探しのWebARを作りました。

対象の読者

一応、下記前提で記事を書いていきますが、難しいことは書いてないので分からない用語があれば調べてください。

  • pythonの初歩的な用語、文法を知っている人向け
  • Djangoを使ったことがある人向け

今回の内容

websocketでサーバ・ブラウザ間の送受信

ブラウザ側

WebSocketのインスタンスを生成します。

aframe_ctrl.js
var ws = new WebSocket('wss://' + window.location.host + '/ws/');

JSON形式でサーバからデータを受け取ります。
受信するごとに更新されます。

aframe_ctrl.js
ws.onmessage = function(e) {
  var data = JSON.parse(e.data);
}

JSON形式でサーバにデータを送信します。
末尾の10000[ms]で10秒に一回送信するよう設定しています。送信データは緯度経度です。
(端末の緯度経度の取得がサーバーからだと複雑な処理になりそうだったため)

aframe_ctrl.js
  $(function() {
    setInterval(function(){
      const sendData = {
        message : my_latitude + "," + my_longitude
      }
      ws.send(JSON.stringify(sendData));
      },10000);
  });

サーバ側

基本的な設定は下記サイトを参考にさせていただきました。
http://engmng.blog.fc2.com/blog-entry-110.html

一個注意することがあります。
Websocketのルーティングを設定する時、末尾にASGIとして使いますよって明示する必要があります。

routing.py
websocket_urlpatterns = [
    path('ws/', consumers.TestConsumer.as_asgi()),
]

ここではブラウザからJSONでデータを受け取り、緯度経度を抽出してHotPepperAPIを介してお店情報を取得します。
取得したお店情報をJSON形式にしてsendでブラウザに送ります。

consurmers.py
    def receive(self, text_data=None):
        if text_data != None:
            text_data_json = json.loads(text_data)

            _location = text_data_json['message']
            if "," in _location:
                shop_num = 5
               # ブラウザから受信した緯度経度からお店情報を取得する
                _array_location = _location.split(",")
                lat = _array_location[0]
                lng = _array_location[1]
                HP_data = HotpepperAPI(lat_st=lat,lng_st=lng )
          ・・・

                shop_array[2] = "お店を検索中…"
                for i in range(0,shop_num):
                    try:
                        shop_array[i] = HP_data['name'][i]
                        lat_array[i] = HP_data["lat"][i]
                        lng_array[i] = HP_data["lng"][i]
                        ・・・
                    except:
                        pass

            else:
                self.name = 'Failed:location'

            self.send(text_data=json.dumps({
                'message0':shop_array[0],
                "shop_lat0":lat_array[0],
                "shop_lng0":lng_array[0],
                "shop_dis0":dis_array[0],
                "catch0":appeal[0],
                "urls0":shop_urls[0],
   ・・・
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0