Ich verwende nur den Echtzeitdatenbank-Teil von Firebase.Kann Python SDK JS-Client für Firebase-Ereignisse registrieren?
Ich habe einen Python Firebase Admin auf dem Server, ein Javascript Firebase auf dem Webclient. Kein Android oder iOS. Mein Web-Javascript-Client erhält ein Token vom Python-Server für seine Authentifizierung.
Nur der Python-Server schreibt in Firebase, der Javascript-Client tut dies nie. Der Client registriert jedoch einen "child_added" Listener mit Firebase, um Datenbankänderungen in Daten zu empfangen.
Alles funktioniert außer für diesen Ereignis-Listener.
Die Firebase docs sagen:
Das Python-Admin SDK unterstützt derzeit nur Blockierung liest. Es kann nicht verwendet werden, um Ereignislistener hinzuzufügen, die Echtzeit-Updates Benachrichtigungen erhalten.
Aber wie ich es verstehe, gilt das für meinen Server, nicht für den Client. Oder wird das Abrufen eines benutzerdefinierten Tokens von einem Python-Admin den Javascript-Client für diese Ereignisse disqualifiziert?
Vielleicht ist es ein Problem, dass der Server sich mit den Anmeldeinformationen des Dienstkontos initialisiert, während der Client dies mit einem API-Schlüssel tut? Wenn ja, warum gibt Firebase keinen Fehler aus?
Hier ist der relevante Python-Code (views.py):
import firebase_admin
from firebase_admin import credentials, auth, db
def getFirebaseInstance():
try:
# using fresh download of key from service account for this app
cred = credentials.Certificate('myapp/static/myap/firebase/firebase-adminsdk-4mcup-144fd3c404.json')
firebase = firebase_admin.initialize_app(cred,{'databaseURL': 'https://my-db-url'})
except:
raise
@login_required()
def firebaseClientToken(request):
try:
global __firebase
if __firebase is None:
__firebase = getFirebaseInstance()
token = firebase_admin.auth.create_custom_token('1')
return HttpResponse(token)
except Exception as err:
return HttpResponse("System error:" + str(err), status=406)
def sendToFirebase(request, data):
try:
global __firebase
if not __firebase:
__firebase = getFirebaseInstance()
db = firebase_admin.db
ref = db.reference("messages/")
ref.push(json.dumps(data))
except Exception:
raise
Alles, was in Ordnung so weit wie der Server arbeitet in der Lage zu schreiben, um Feuerbasis und eine benutzerdefinierte Token zu erzeugen.
Das JavaScript-Web-Client erhält einen Token aus dem Python-Server (nicht dargestellt), und registriert den Ereignis-Listener mit:
(
function authClient2Firebase() {
var waiting;
$.ajax({
url: "firebaseClientToken/",
method: "POST",
success: function(response) { step2(response); },
error: function(xhr) { alert(xhr.responseText); }
});
function step2(customToken) {
try {
firebase.auth().signInWithCustomToken(customToken).catch(function(error) {
var errorCode = error.code;
var errorMessage = error.message;
alert(errorMessage + ' code:' + errorCode);
});
var db = firebase.database();
var fbRef = db.ref("myapp");
fbRef.startAt(loadTransaction.time).on ("child_added",
function(snapshot) { alert(snapshot.val()); });
}
}
}
)();