Guten Tag, Freunde. Im Vorgriff auf den Start des 
Python Web Developer- Kurses teilen 
wir Ihnen traditionell eine nützliche Übersetzung mit.

Vor Ihnen sehen Sie eine Anleitung, die Ihnen erklärt, wie Sie eine Chat-Anwendung in Python, Django und React erstellen.Im Gegensatz zu anderen Handbüchern verwende ich Python und Django nicht für WebSocket-Verbindungen. Obwohl es aus technischer Sicht cool klingt, funktioniert es ziemlich träge und ist an sich teuer, insbesondere wenn Sie eine anständige Anzahl von Benutzern haben. Sprachen wie C ++, Go und Elixir machen den Chatkern viel besser. 
In diesem Tutorial werden wir Stream verwenden, eine 
Chat-API , die sich mit Go, Raft und RocksDB um WebSocket-Verbindungen und andere wichtige Aspekte kümmert.
Inhalt:
- Demo-Chat-Oberfläche reagieren
- Installieren Sie Django / Python
- Benutzerberechtigung
- Django Rest Framework
- Token-Generierung für den Zugriff auf den Chat-Stream-Server
- Integration der Reaktionsberechtigung
- Senden von Nachrichten von einem Python-Server
- Letzte Gedanken
Github-Repository mit Code aus einem Artikel
Fangen wir an!
Schritt 1: Reagieren Sie auf die Demo-Chat-Oberfläche
Bevor wir uns mit dem Python-Teil befassen, wollen wir eine einfache Oberfläche für React bereitstellen, damit wir etwas Schönes und Visuelles haben:
$ yarn global add create-react-app $ brew install node && brew install yarn  
Ersetzen Sie den Code in 
src/App.js durch den folgenden Code:
 import React from "react"; import { Chat, Channel, ChannelHeader, Thread, Window } from "stream-chat-react"; import { MessageList, MessageInput } from "stream-chat-react"; import { StreamChat } from "stream-chat"; import "stream-chat-react/dist/css/index.css"; const chatClient = new StreamChat("qk4nn7rpcn75"); // Demo Stream Key const userToken = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiY29vbC1za3ktOSJ9.mhikC6HPqPKoCP4aHHfuH9dFgPQ2Fth5QoRAfolJjC4"; // Demo Stream Token chatClient.setUser( { id: "cool-sky-9", name: "Cool sky", image: "https://getstream.io/random_svg/?id=cool-sky-9&name=Cool+sky" }, userToken ); const channel = chatClient.channel("messaging", "godevs", { // image and name are required, however, you can add custom fields image: "https://cdn.chrisshort.net/testing-certificate-chains-in-go/GOPHER_MIC_DROP.png", name: "Talk about Go" }); const App = () => ( <Chat client={chatClient} theme={"messaging light"}> <Channel channel={channel}> <Window> <ChannelHeader /> <MessageList /> <MessageInput /> </Window> <Thread /> </Channel> </Chat> ); export default App; 
Verwenden Sie jetzt den Befehl 
yarn start , um den Chat in Aktion zu sehen!
Schritt 2: Django / Python installieren (überspringen Sie diesen Schritt, wenn Sie bereits alles haben, was Sie brauchen)
Stellen Sie sicher, dass Sie Python 3.7 verwenden und es ausgeführt wird:
 $ brew install python3 $ pip install virtualenv virtualenvwrapper $ export WORKON_HOME=~/Envs $ source /usr/local/bin/virtualenvwrapper.sh $ mkvirtualenv chatexample -p `which python3` $ workon chatexample 
Wenn es nicht funktioniert, probieren Sie den folgenden Code:
 $ python3 -m venv chatexample $ source chatexample/bin/activate 
Jetzt, da Sie sich in Ihrer virtuellen Umgebung befinden, sollten Sie Python 3 beim Start sehen:
 $ python --version 
Verwenden Sie den folgenden Code, um ein neues Projekt in Django zu erstellen:
 $ pip install django $ django-admin startproject mychat 
Führen Sie die Anwendung aus:
 $ cd mychat $ python manage.py runserver 
Wenn Sie nun 
http://localhost:8000 öffnen, sehen Sie Folgendes:

Schritt 3: Benutzerautorisierung
Der nächste Schritt ist die Konfiguration der Benutzerautorisierung in Django.
 $ python manage.py migrate $ python manage.py createsuperuser $ python manage.py runserver 
Gehen Sie zu 
http://localhost:8000/admin/ und melden Sie sich an. Voila!
Sie sehen eine Administratorregisterkarte ähnlich der folgenden:

Schritt 4: Django Rest Framework
Eines meiner Lieblingspakete für die Integration von React in Django ist das Django Rest Framework. Damit es funktioniert, müssen Sie Endpunkte erstellen für:
- Benutzerregistrierung
- Benutzeranmeldung.
Wir könnten sie selbst herstellen, aber es gibt ein Paket namens 
Djoser , das dieses Problem löst. Es werden die erforderlichen API-Endpunkte für die Benutzerregistrierung, die Anmeldung, das Zurücksetzen des Kennworts usw. konfiguriert.
Verwenden Sie zum Installieren von Djoser Folgendes:
 $ pip install djangorestframework djoser 
Bearbeiten Sie danach 
urls.py und ändern Sie den Inhalt der Datei wie folgt:
 from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('auth/', include('djoser.urls')), path('auth/', include('djoser.urls.authtoken')), ] 
Wenn Sie fertig sind, bearbeiten Sie 
settings.py und nehmen Sie Änderungen vor:
 INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', 'rest_framework.authtoken', 'djoser', ] REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.TokenAuthentication', ) } 
Weitere Informationen zu den von Djoser bereitgestellten API-Endpunkten finden Sie im Folgenden:
https://djoser.readthedocs.io/en/latest/sample_usage.htmlNun machen wir weiter und testen den Registrierungsendpunkt:
 $ curl -X POST http://127.0.0.1:8000/auth/users/ --data 'username=djoser&password=alpine12' 
Schritt 5: Generieren Sie Token, um auf den Chat-Stream-Server zuzugreifen
Jetzt müssen wir Djoser-Ansichten konfigurieren, um Stream-Token zu generieren. Also fangen wir an.
Lassen Sie uns unsere Dateien ein wenig organisieren und einen Chat-Anwendungsordner in unserem Projekt erstellen (stellen Sie sicher, dass Sie sich im richtigen Verzeichnis befinden):
 $ python manage.py startapp auth 
Installieren Sie den Stream-Chat:
 $ pip install stream-chat 
Erstellen Sie einen benutzerdefinierten Serializer in 
auth/serializers.py mit der folgenden Logik:
 from djoser.serializers import TokenSerializer from rest_framework import serializers from djoser.conf import settings as djoser_settings from stream_chat import StreamChat from django.conf import settings class StreamTokenSerializer(TokenSerializer): stream_token = serializers.SerializerMethodField() class Meta: model = djoser_settings.TOKEN_MODEL fields = ('auth_token','stream_token') def get_stream_token(self, obj): client = StreamChat(api_key=settings.STREAM_API_KEY, api_secret=settings.STREAM_API_SECRET) token = client.create_token(obj.user.id) return token 
Verwenden Sie zuletzt einen benutzerdefinierten Serializer, um die Datei 
settings.py zu aktualisieren:
 STREAM_API_KEY = YOUR_STREAM_API_KEY  
Starten Sie die Migration neu:
 $ python manage.py migrate 
Um zu überprüfen, ob es funktioniert, rufen Sie den Endpunkt mit einer POST-Anforderung auf:
 $ curl -X POST http://127.0.0.1:8000/auth/token/login/ --data 'username=djoser&password=alpine12' 
Return sollte 
auth_token und 
stream_token .
Schritt 6: React Authorization einbinden
Aus offensichtlichen Gründen ist das Hinzufügen von Berechtigungen zum Frontend ein wichtiger Schritt. In unserem Fall ist dies besonders nützlich, da wir das Benutzertoken aus der API (die auf Python ausgeführt wird) extrahieren und beim Senden von Nachrichten dynamisch verwenden können.
Installieren Sie zunächst CORS, das Middleware-Paket für Django:
 $ pip install django-cors-headers 
Ändern Sie anschließend die Datei 
settings.py , um auf die 
djors-cors-header zu verweisen:
 INSTALLED_APPS = ( ... 'corsheaders', ... ) MIDDLEWARE = [ ... 'corsheaders.middleware.CorsMiddleware', 'django.middleware.common.CommonMiddleware', ... ] 
Fügen Sie Ihrer 
settings.py Datei abschließend Folgendes hinzu:
 CORS_ORIGIN_ALLOW_ALL = True 
Der nächste Schritt erfordert einige Änderungen an Ihrer Benutzeroberfläche. Bevor Sie beginnen, müssen Sie sicherstellen, dass alle Abhängigkeiten über Woll installiert sind:
 $ yarn add axios react-dom react-router-dom 
Erstellen Sie als Nächstes die folgenden Dateien im Verzeichnis 
src/ :
- AuthedRoute.js
- UnauthedRoute.js
- withSession.js
- Login.js
- Chat.js
App.js
 import React from "react"; import { BrowserRouter as Router, Switch } from "react-router-dom"; import Chat from "./Chat"; import Login from "./Login"; import UnauthedRoute from "./UnauthedRoute"; import AuthedRoute from "./AuthedRoute"; const App = () => ( <Router> <Switch> <UnauthedRoute path="/auth/login" component={Login} /> <AuthedRoute path="/" component={Chat} /> </Switch> </Router> ); export default App; 
AuthedRoute.js
 import React from "react"; import { Redirect, Route } from "react-router-dom"; const AuthedRoute = ({ component: Component, loading, ...rest }) => { const isAuthed = Boolean(localStorage.getItem("token")); return ( <Route {...rest} render={props => loading ? ( <p>Loading...</p> ) : isAuthed ? ( <Component history={props.history} {...rest} /> ) : ( <Redirect to={{ pathname: "/auth/login", state: { next: props.location } }} /> ) } /> ); }; export default AuthedRoute; 
UnauthedRoute.js
 import React from "react"; import { Redirect, Route } from "react-router-dom"; const AuthedRoute = ({ component: Component, loading, ...rest }) => { const isAuthed = Boolean(localStorage.getItem("token")); return ( <Route {...rest} render={props => loading ? ( <p>Loading...</p> ) : !isAuthed ? ( <Component history={props.history} {...rest} /> ) : ( <Redirect to={{ pathname: "/" }} /> ) } /> ); }; export default AuthedRoute; 
withSession.js
 import React from "react"; import { withRouter } from "react-router"; export default (Component, unAuthed = false) => { const WithSession = ({ user = {}, streamToken, ...props }) => user.id || unAuthed ? ( <Component userId={user.id} user={user} session={window.streamSession} {...props} /> ) : ( <Component {...props} /> ); return withRouter(WithSession); }; 
Login.js
 import React, { Component } from "react"; import axios from "axios"; class Login extends Component { constructor(props) { super(props); this.state = { loading: false, email: "", password: "" }; this.initStream = this.initStream.bind(this); } async initStream() { await this.setState({ loading: true }); const base = "http://localhost:8000"; const formData = new FormData(); formData.set("username", this.state.email); formData.set("password", this.state.password); const registration = await axios({ method: "POST", url: `${base}/auth/users/`, data: formData, config: { headers: { "Content-Type": "multipart/form-data" } } }); const authorization = await axios({ method: "POST", url: `${base}/auth/token/login/`, data: formData, config: { headers: { "Content-Type": "multipart/form-data" } } }); localStorage.setItem("token", authorization.data.stream_token); await this.setState({ loading: false }); this.props.history.push("/"); } handleChange = e => { this.setState({ [e.target.name]: e.target.value }); }; render() { return ( <div className="login-root"> <div className="login-card"> <h4>Login</h4> <input type="text" placeholder="Email" name="email" onChange={e => this.handleChange(e)} /> <input type="password" placeholder="Password" name="password" onChange={e => this.handleChange(e)} /> <button onClick={this.initStream}>Submit</button> </div> </div> ); } } export default Login; 
Chat.js
 import React, { Component } from "react"; import { Chat, Channel, ChannelHeader, Thread, Window } from "stream-chat-react"; import { MessageList, MessageInput } from "stream-chat-react"; import { StreamChat } from "stream-chat"; import "stream-chat-react/dist/css/index.css"; class App extends Component { constructor(props) { super(props); this.client = new StreamChat("<YOUR_STREAM_APP_ID>"); this.client.setUser( { id: "cool-sky-9", name: "Cool Sky", image: "https://getstream.io/random_svg/?id=cool-sky-9&name=Cool+sky" }, localStorage.getItem("token") ); this.channel = this.client.channel("messaging", "godevs", { image: "https://cdn.chrisshort.net/testing-certificate-chains-in-go/GOPHER_MIC_DROP.png", name: "Talk about Go" }); } render() { return ( <Chat client={this.client} theme={"messaging light"}> <Channel channel={this.channel}> <Window> <ChannelHeader /> <MessageList /> <MessageInput /> </Window> <Thread /> </Channel> </Chat> ); } } export default App; 
Ersetzen Sie 
YOUR_STREAM_APP_ID durch die gültige Stream-App-ID, die im 
Dashboard YOUR_STREAM_APP_ID .
Starten Sie die Anwendung auf dem Frontend neu und Sie sehen die Autorisierung! Geben Sie Ihre E-Mail-Adresse und Ihr Passwort ein. Der Token wird angefordert und lokal gespeichert.
Schritt 7: Senden von Nachrichten vom Python-Server
Wenn Sie plötzlich eine Chat-API mit Ihrem Backend in Python erstellen möchten, gibt es einen speziellen Befehl, den Sie verwenden können.
Stellen Sie sicher, dass die installierten Anwendungen in 
settings.py folgendermaßen aussehen:
 INSTALLED_APPS = [ 'corsheaders', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', 'rest_framework.authtoken', 'djoser', ] 
Als nächstes erstellen Sie das Verzeichnis chat / management / commands. Fügen Sie in diesem Verzeichnis eine Datei mit dem Namen 
broadcast.py mit folgendem Inhalt hinzu:
 from django.core.management.base import BaseCommand, CommandError from django.conf import settings from stream_chat import StreamChat class Command(BaseCommand): help = 'Broadcast the message on your channel' def add_arguments(self, parser): parser.add_argument('--message') def handle(self, *args, **options): client = StreamChat(api_key=settings.STREAM_API_KEY, api_secret=settings.STREAM_API_SECRET) client.update_user({"id": "system", "name": "The Server"}) channel = client.channel("messaging", "kung-fu") channel.create("system") response = channel.send_message({"text": "AMA about kung-fu"}, 'system') self.stdout.write(self.style.SUCCESS('Successfully posted a message with id "%s"' % response['message']['id'])) 
Sie können versuchen, eine Chat-Nachricht wie folgt zu senden:
 $ python manage.py broadcast --message hello 
Und Sie werden diese Antwort sehen:

Letzte Gedanken
Ich hoffe, Ihnen hat dieses Tutorial zum Erstellen einer Chat-Anwendung in Django, Python und React gefallen!
Eine interaktive Tour durch 
Stream Chat finden Sie in unserer Anleitung zum Erstellen einer 
API auf der Stream-Website . Wenn Sie gerne im Code für Stream Chat React-Komponenten stöbern, finden Sie die vollständige Dokumentation 
hier . Wenn Sie einen Chat auf Stream erstellen möchten, bieten wir verschiedene 
SDKs für gängige Sprachen und Frameworks bis zum neuesten 
iOS (Swift) an .
Das ist alles. Wir sehen uns beim 
offenen Webinar zu Django ORM Tricks .