Rumah >pembangunan bahagian belakang >Tutorial Python >Bina Sistem Penjejakan Lokasi Dinamik di Django dengan Redis Pub/Sub dan Pulsetracker

Bina Sistem Penjejakan Lokasi Dinamik di Django dengan Redis Pub/Sub dan Pulsetracker

Linda Hamilton
Linda Hamiltonasal
2024-12-15 02:30:10269semak imbas

Build Dynamic Location Tracking Systems in Django with Redis Pub/Sub and Pulsetracker

Dalam artikel ini, kami akan menunjukkan cara untuk menyepadukan Pub/Sub Redis Pulsetracker ke dalam aplikasi Django untuk mendengar kemas kini lokasi masa nyata. Selain itu, kami akan membina klien WebSocket JavaScript yang mudah untuk menghantar kemas kini lokasi setiap saat kepada Pulsetracker, mempamerkan cara perkhidmatan itu boleh digunakan dalam aplikasi dunia sebenar.


Kenapa Django?

Django ialah rangka kerja web Python peringkat tinggi yang menggalakkan pembangunan pesat dan reka bentuk yang bersih dan pragmatik. Ia terkenal dengan kebolehskalaan, keselamatan dan ekosistem alatan yang kaya yang menjadikan membina aplikasi web yang teguh lebih pantas dan mudah.

Ciri Redis Pub/Sub Pulsetracker disepadukan dengan lancar dengan Django, membolehkan pembangun menerima dan memproses data lokasi masa nyata dengan cekap.


Menyediakan Redis Pub/Sub dalam Django

1. Pasang Pakej Yang Diperlukan

Mula-mula, pasang sokongan Redis untuk Django:

pip install django-redis
pip install redis

2. Konfigurasikan Redis dalam Django

Kemas kini fail settings.py anda untuk memasukkan sambungan Pulsetracker Redis:

# settings.py

from decouple import config  # Recommended for managing environment variables

# Redis settings
PULSETRACKER_REDIS_URL = config('PULSETRACKER_REDIS_URL', default='redis://redis-sub.pulsestracker.com:6378')

3. Buat Perintah Pengurusan untuk Pelanggan

Arahan pengurusan Django ialah cara terbaik untuk mengendalikan tugas latar belakang yang telah lama dijalankan.

Buat perintah tersuai baharu dalam apl Django anda:

python manage.py startapp tracker

Di dalam apl anda, cipta folder dan struktur fail berikut:

tracker/
    management/
        commands/
            subscribe_pulsetracker.py

Berikut ialah kod untuk subscribe_pulsetracker.py:

import redis
import hashlib
import hmac
from django.core.management.base import BaseCommand

class Command(BaseCommand):
    help = "Subscribe to Pulsetracker Redis Pub/Sub server"

    def generate_signature(self, app_key, token):
        if "|" not in token:
            raise ValueError("Invalid token format")

        token_hash = hashlib.sha256(token.split("|")[1].encode()).hexdigest()
        return hmac.new(token_hash.encode(), app_key.encode(), hashlib.sha256).hexdigest()

    def handle(self, *args, **options):
        app_key = 'your_app_key_here'
        token = 'your_token_here'
        signature = self.generate_signature(app_key, token)

        channel = f"app:{app_key}.{signature}"
        redis_connection = redis.StrictRedis.from_url('redis://redis-sub.pulsestracker.com:6378')

        print(f"Subscribed to {channel}")
        pubsub = redis_connection.pubsub()
        pubsub.subscribe(channel)

        for message in pubsub.listen():
            if message['type'] == 'message':
                print(f"Received: {message['data'].decode('utf-8')}")

Jalankan pelanggan dengan:

python manage.py subscribe_pulsetracker

Untuk memastikan pelanggan berjalan secara berterusan dalam pengeluaran, gunakan pengurus proses seperti Penyelia atau Django-Q.


Menggunakan Django-Q untuk Tugasan Latar Belakang

Pasang Django-Q:

pip install django-q

Kemas kini tetapan.py:

# settings.py

Q_CLUSTER = {
    'name': 'Django-Q',
    'workers': 4,
    'recycle': 500,
    'timeout': 60,
    'redis': {
        'host': 'redis-sub.pulsestracker.com',
        'port': 6378,
        'db': 0,
    }
}

Buat tugasan untuk mendengar kemas kini Pulsetracker dalam tasks.py:

from django_q.tasks import async_task
import redis

def pulsetracker_subscribe():
    app_key = 'your_app_key_here'
    token = 'your_token_here'
    channel = f"app:{app_key}.{generate_signature(app_key, token)}"

    redis_connection = redis.StrictRedis.from_url('redis://redis-sub.pulsestracker.com:6378')
    pubsub = redis_connection.pubsub()
    pubsub.subscribe(channel)

    for message in pubsub.listen():
        if message['type'] == 'message':
            print(f"Received: {message['data'].decode('utf-8')}")

Contoh WebSocket Client

Berikut ialah klien JavaScript mudah yang mensimulasikan kemas kini lokasi peranti yang dihantar kepada Pulsetracker melalui WebSockets:

var wsServer = 'wss://ws-tracking.pulsestracker.com';
var websocket = new WebSocket(wsServer);
const appId = 'YOUR_APP_KEY';
const clientId = 'YOUR_CLIENT_KEY';

websocket.onopen = function(evt) {
    console.log("Connected to WebSocket server.");
    // Send location every 2 seconds
    setInterval(() => {
        if (websocket.readyState === WebSocket.OPEN) {
            navigator.geolocation.getCurrentPosition((position) => {
                console.log(position);
                const locationData = {
                    appId: appId,
                    clientId: clientId,
                    data: {
                        type: "Point",
                        coordinates: [position.coords.longitude, position.coords.latitude]
                    },
                    extra: {
                        key: "value"
                    }
                };


                // Send location data as JSON
                websocket.send(JSON.stringify(locationData));
                console.log('Location sent:', locationData);
            }, (error) => {
                console.error('Error getting location:', error);
            });
        }
    }, 3000); // Every 2 seconds
};

websocket.onclose = function(evt) {
    console.log("Disconnected");
};

websocket.onmessage = function(evt) {
    if (event.data === 'Pong') {
        console.log('Received Pong from server');
    } else {
        // Handle other messages
        console.log('Received:', event.data);
    }
};

websocket.onerror = function(evt, e) {
    console.log('Error occurred: ' + evt.data);
};

Kesimpulan

Pulsetracker, digabungkan dengan Django dan Redis Pub/Sub, menawarkan penyelesaian yang mantap untuk penjejakan lokasi masa nyata. Penyepaduan ini membolehkan pembangun membina sistem berskala, sedia pengeluaran yang cekap mengendalikan data lokasi langsung. Penambahan pelanggan WebSocket menunjukkan betapa mudahnya Pulsetracker boleh disepadukan ke dalam aplikasi bahagian hadapan, meningkatkan pengalaman pengguna.

Cuba laksanakan Pulsetracker dalam projek Django anda hari ini dan kongsi pengalaman anda! Untuk maklumat lanjut, lawati dokumentasi Pulsetracker.

Atas ialah kandungan terperinci Bina Sistem Penjejakan Lokasi Dinamik di Django dengan Redis Pub/Sub dan Pulsetracker. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn