Vereisten
Voordat u het script in deze zelfstudie oefent, moet u de volgende taken uitvoeren:.
- Installeer Django versie 3+ op Ubuntu 20+ (bij voorkeur)
- Een Django-project maken
- Voer de Django-server uit om te controleren of de server goed werkt
Een Django-app instellen
Voer de volgende opdracht uit om een Django-app met de naam te maken socketapp:
$ python3 beheren.py startapp socketappVoer de volgende opdracht uit om het kanaal te installeren:
$ pip installatiekanalenVoeg de kanalen en app-naam toe aan de INSTALLED_APP deel van de instellingen.py het dossier:
INSTALLED_APPS = […
'kanalen',
'socketapp'
]
Definieer de waarde van ASGI_APPLICATION in de instellingen.py het dossier:
ASGI_APPLICATION = 'channel_pro'.asgi.toepassing'Maak een map met de naam Sjablonen binnen in de socketapp map en stel de locatie van de app voor de sjabloon in de SJABLONEN deel van de instellingen.py het dossier:
SJABLONEN = [… .
'DIRS': ['/home/fahmida/channel_pro/socketapp/templates'],
… .
,
]
De volgende uitvoer verschijnt in de terminal na het uitvoeren van de Django-server:. De output laat zien dat ASGI/Channels versie 3.0.3 loopt.
Maak een sjabloonbestand met de naam inhoudsopgave.html op de gedefinieerde sjabloonlocatie om de gegevens weer te geven die door de WebSocket zijn verzonden. Het socket-object dat is gemaakt met JavaScript, leest de gegevens met behulp van de JSON.parse() methode, geef dan de waarde door aan de inhoud van de
tag die de ID-waarde bevat, 'msg.'
inhoudsopgave.html
tekst
Wijzig de keer bekeken.py bestand van de socketapp met de volgende inhoud:. De inhoudsopgave.html sjabloonbestand wordt weergegeven in de browser met de tekst variabel wanneer de inhoudsopgave() methode van dit script wordt aangeroepen vanuit de URL's.py het dossier. Als er geen bericht wordt verzonden vanuit de socket, dan wordt de tekst 'LinuxHint' wordt weergegeven in de browser.
keer bekeken.py
# Importeer de rendermodule van Djangovan django.sneltoetsen import render
# Maak een indexfunctie om het HTML-bestand in de browser weer te geven
def index(verzoek):
return render(verzoek, "index.html", context='text': 'LinuxHint')
Wijzig de URL's.py bestand van de socketapp met de volgende inhoud:. In het script zijn twee paden gedefinieerd: de 'beheerder/' pad wordt gebruikt om het Django Administration Dashboard te openen, en de 'bericht/' pad wordt gebruikt om het WebSocket-bericht te lezen.
URL's.py
van django.bijdrage import beheerdervan django.URL-importpad
van socketapp importweergaven
urlpatronen = [
pad('admin/', beheerder.website.URL's),
pad('msg/', weergaven.inhoudsopgave)
]
Wanneer de volgende URL wordt uitgevoerd zonder de consumenten- en routeringsbestanden te definiëren, werkt het HTTP-protocol en verschijnt de volgende uitvoer:.
http://localhost:8000/msg
Maak nu een consumenten.py bestand in de socketapp map met het volgende script. De aansluiten() methode van ws_consumer wordt gebruikt om de socketverbinding te accepteren, de huidige tijdwaarde elke seconde te lezen en de huidige tijd in JSON-indeling te verzenden via WebSocket wanneer deze methode wordt aangeroepen vanuit het routeringsbestand.
consumenten.py
# JSON-module importerenimport json
# WebsocketConsumer importeren
van kanalen.algemeen.websocket importeren WebsocketConsumer
# Datum/tijd-module importeren
van datetime import datetime
# Slaapmodule importeren
van tijd import slaap
# Definieer de consumentenklasse om de gegevens via WebsocketConsumer te verzenden
class ws_consumer(WebsocketConsumer):
def verbinden (zelf):
zelf.aanvaarden()
terwijl (waar):
nu = datumtijd.nu()
zelf.verzenden (json.dumps('timeValue': nu.strftime("%H:%M:%S")))
slapen(1)
Maak de routering.py binnen in de socketapp map met het volgende script. De 'bericht/' pad is gedefinieerd in het script om de consument te bellen voor het verzenden van de gegevens naar de socket.
routering.py
van django.URL-importpadvan .consumenten importeren ws_consumer
# Stel het pad in om de consument te bellen
ws_urlpatterns = [
pad('msg/', ws_consumer.as_asgi())
]
Wijzig de asgi.py bestand met het volgende script. De modules die nodig zijn om HTTP- en WebSocket-verzoeken af te handelen, worden geïmporteerd in het script.
asgi.py
# Importeer os-moduleimporteer os
# Importeer get_asgi_application om het http-protocol te verwerken
van django.kern.asgi import get_asgi_application
# Importeer ProtocolTypeRouter en URLRouter om de websocket-routering in te stellen
van kanalen.routering importeren ProtocolTypeRouter, URLRouter
# AuthMiddlewareStack importeren om websocket af te handelen
van kanalen.auth importeren AuthMiddlewareStack
# Websocket-routing importeren
van socketapp.routering importeren ws_urlpatterns
# Waarde toewijzen voor DJANGO_SETTINGS_MODULE
os.omgeving.setdefault('DJANGO_SETTINGS_MODULE', 'channel_pro'.instellingen')
# Definieer applicatievariabele om http en websocket te verwerken
applicatie = ProtocolTypeRouter(
'http': get_asgi_application(),
'websocket': AuthMiddlewareStack(URLRouter(ws_urlpatterns))
)
Voer nu de volgende URL opnieuw uit vanuit de browser om de gegevens van de WebSocket te lezen:.
http://localhost:8000/msg/
Als de consument en router goed werken, wordt de volgende digitale klok in de browser weergegeven:. Hier heeft de router het WebSocket-verzoek verzonden met de 'bericht/' pad naar de consument die het verzoek heeft geaccepteerd en de gegevens naar de sjabloon heeft verzonden om de digitale klok in de browser te tonen waar de tweede waarde van de huidige tijd elke seconde wordt bijgewerkt.
Conclusie
Deze tutorial liet je zien hoe je een realtime applicatie implementeert met behulp van het Django-framework en kanalen door een eenvoudige digitale klok te maken. Andere soorten realtime applicaties kunnen ook worden geïmplementeerd met behulp van Django en kanalen, zoals online chatsystemen. De scripts die in deze tutorial worden gebruikt, werken alleen voor Django-versies 3+ en Channel-versies 3+. Dus als je een eerdere Django- of Channel-versie gebruikt, moet je de versie upgraden voordat je het script in deze tutorial test.