2015-07-27 14 views
5

Ben Flask,Python ve Flask-Socket.io kütüphaneyi kullanan bir uygulamayı geliştirmekteyiz. Ben sorun Aşağıdaki kod nedeniyle bazı bağlamlarda konuylaFlask, Python ve Socket.io: çoklu kullanım uygulaması bana veriyor "RuntimeError: istek bağlamı çalışma dışında"

RuntimeError: working outside of request context 

Şimdiye kadar tüm programı için yalnızca bir piton dosyası yazıyorum doğru bir emit gerçekleştirmez olmasıdır. Bu benim kodu (test.py): İşte Stack Exchange içinde

from threading import Thread 
from flask import Flask, render_template, session, request, jsonify, current_app, copy_current_request_context 
from flask.ext.socketio import * 

app = Flask(__name__) 
app.debug = True 
app.config['SECRET_KEY'] = 'secret!' 
socketio = SocketIO(app) 

def somefunction(): 
    # some tasks 
    someotherfunction() 

def someotherfunction(): 
    # some other tasks 
    emit('anEvent', jsondata, namespace='/test') # here occurs the error 

@socketio.on('connect', namespace='/test') 
def setupconnect(): 
    global someThread 
    someThread = Thread(target=somefunction) 
    someThread.daemon = True 

if __name__ == '__main__': 
    socketio.run(app) 

Ben bazı çözümler okuma olmuştur, ancak işe yaramadı. Neyi yanlış yaptığımı bilmiyorum.

Ben with app.app_context(): benim emit önce ekleyerek denedim:

def someotherfunction(): 
    # some other tasks 
    with app.app_context(): 
     emit('anEvent', jsondata, namespace='/test') # same error here 

Denedim Başka bir çözüm someotherfunction() önce dekoratör copy_current_request_context ekliyor ancak dekoratör yerel kapsamında olması gerektiğini söylüyor. İlk satırda someotherfunction()'un içine koydum ama aynı hata.

Birisi bana bununla yardım edebilirse memnun olurum. Şimdiden teşekkürler.

+0

Ben şişeye bir uzman değilim ama setupconnect' 'üzerinde' küresel someThread' sorunun bir parçası olduğunu düşünürdüm. Ayrıca, belki bu iş parçacığı size yardımcı olabilir: http://stackoverflow.com/questions/9931738/flask-throwing-working-outside-of-request-context-when-starting-sub-thread – cnluzon

cevap

6

Hatanız 'istek bağlamı dışında çalışıyor'. Uygulama içeriğini zorlayarak çözmeyi denediniz. Bunun yerine istek içeriğini zorlamanız gerekir. http://kronosapiens.github.io/blog/2014/08/14/understanding-contexts-in-flask.html

Şişesindeki kontekstlerdeki açıklamalara bakın. Somut ifadenizdeki() kod, muhtemelen, istek bağlamında global olan nesneleri (muhtemelen istek nesnesini kullandığınızı tahmin etmem gerekirse) kullanır. Kodunuz muhtemelen yeni iş parçacığı içinde yürütülmediğinde çalışır. Ancak, yeni bir iş parçacığı içinde çalıştırdığınızda, işleviniz artık özgün istek bağlamında yürütülmez ve istek bağlamında belirli nesnelere artık erişemez. Yani el ile itmelisin. Burada yanlış emit kullanıyorsunuz

def someotherfunction(): 
    with app.test_request_context('/'): 
     emit('anEvent', jsondata, namespace='/test') 
+3

Çok teşekkürler! Denedim ama bana başka bir hata verdi: 'AttributeError: 'Request' nesnesinin 'namespace' özelliği yoktur. "Emit" yerine "socketio.emit" komutunu uygulayarak çözdüm. "socketio", somutlaştırılmış SocketIO nesnesidir. –

+2

Rica ederim. Sevindim şimdi çalışıyor. – Mensur

0

böylece işlevi olmalıdır. Oluşturduğunuz socketio nesnesinin çıktısını kullanmanız gerekir. bunun yerine

emit('anEvent', jsondata, namespace='/test') # here occurs the error Kullanım: socketio.emit('anEvent', jsondata, namespace='/test') # here occurs the error

+0

Bu maalesef burada çalışmıyor. Mesaj hiç bir müşteri tarafından alınmaz. Emit() 'i gerçek bir' @ sio.on() 'işleyicisi (' emit() 'yerine' 'sio.emit()' yi kullanarak bile kullanırken, ancak 'sio.emit() kullanarak çalışır gibi görünmektedir. 'farklı bir iş parçacığı hiçbir şey yapmaz. –

+0

Yeni öğrendim ([miguelgrinberg/python-socketio # 16] (https: // github.com/miguelgrinberg/python-socketio/issues/16 # issuecomment-271981963)) 'SocketIO' nesnesinin inşasına' async_mode = 'threading' eklemem gerekiyor. O zaman işe yarıyor! –

İlgili konular