2016-07-21 14 views
0

Ich habe Rückrufe in @ app.before_request in meiner Flasche Anwendung.Flask Sijax Handhabung Rückrufe in @ app.before_request

@app.before_request 
def before_request(): 

    def alert(response): 
    response.alert('Message') 

    if g.sijax.is_sijax_request: 
    g.sijax.register_callback('alert', alert) 
    return g.sijax.process_request() 

Der Grund, warum ich dies habe, ist, weil die Ajax-Anfrage auf jeder Seite in meiner Anwendung vorhanden ist. Das funktioniert gut, bis ich eine Seite spezifische Rückruf d.h definiert eine AJAX-Anforderung mit Sijax in einer Ansicht haben will, weil if g.sijax.is_sijax_request: zweimal verwendet wird, so dass ich nicht die Rückrufe registrieren kann, die zu einer Ansicht spezifisch sind.

Gibt es eine Abhilfe für dieses Problem? Vielen Dank.

Antwort

1

Registrieren Sie Ihren Standard-Callback im Ereignis "after_request" und prüfen Sie, ob das _callback Wörterbuch leer ist. Wenn dies der Fall ist, registrieren Sie den Standard-Callback else pass auf die vorhandene Antwort.

import os 
from flask import Flask, g, render_template_string 
import flask_sijax 

path = os.path.join('.', os.path.dirname(__file__), 'static/js/sijax/') 

app = Flask(__name__) 
app.config['SIJAX_STATIC_PATH'] = path 
app.config['SIJAX_JSON_URI'] = '/static/js/sijax/json2.js' 

flask_sijax.Sijax(app) 


@app.after_request 
def after_request(response): 

    def alert(obj_response): 
     print 'Message from standard callback' 
     obj_response.alert('Message from standard callback') 

    if g.sijax.is_sijax_request: 
     if not g.sijax._sijax._callbacks: 
      g.sijax.register_callback('alert', alert) 
      return g.sijax.process_request() 
     else: 
      return response 
    else: 
     return response 

_index_html = ''' 
<html> 
<head> 
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script> 
    <script type="text/javascript" src="/static/js/sijax/sijax.js"></script> 
    <script type="text/javascript"> {{ g.sijax.get_js()|safe }}</script> 
</head> 
<body> 
    <a href="javascript://" onclick="Sijax.request('alert');">Click here</a> 
</body> 
</html> 
''' 

_hello_html = ''' 
<html> 
<head> 
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script> 
    <script type="text/javascript" src="/static/js/sijax/sijax.js"></script> 
    <script type="text/javascript"> {{ g.sijax.get_js()|safe }}</script> 
</head> 
<body> 
    <a href="javascript://" onclick="Sijax.request('say_hi');">Click here</a> 
</body> 
</html> 
''' 


@app.route('/') 
def index(): 
    return render_template_string(_index_html) 


@flask_sijax.route(app, '/hello') 
def hello(): 
    def say_hi(obj_response): 
     print 'Message from hello callback' 
     obj_response.alert('Hi there from hello callback!') 

    if g.sijax.is_sijax_request: 
     g.sijax._sijax._callbacks = {} 
     g.sijax.register_callback('say_hi', say_hi) 
     return g.sijax.process_request() 

    return render_template_string(_hello_html) 


if __name__ == '__main__': 
    app.run(port=7777, debug=True) 
+0

Diese Lösung funktioniert perfekt, außer alle registrierten Rückrufe zweimal ausgeführt werden, da, wenn 'g.sijax.is_sijax_request: ... zurück g.sijax.process_request()' zweimal verwendet wird. Gibt es eine Möglichkeit, dieses Problem zu umgehen? –

+0

Ich habe den Code aktualisiert. – pjcunningham

+0

Danke, ich habe gerade Ihren Code implementiert, die Callbacks in Views funktionieren. Wenn Callbacks verwendet werden, die sich in '@ app.after_request' befinden, aber auch Callbacks in der angeforderten Ansicht vorhanden sind, funktionieren sie nicht. –