2012-11-24 12 views
6

क्या फ्लास्क में वैकल्पिक यूआरएल पैरा के साथ यूआरएल को परिभाषित करने का कोई तरीका है? अनिवार्य रूप से, मैं क्या करना चाहते हैं कि नियमों वैकल्पिक रूप से निर्दिष्ट भाषाओं के लिए अनुमति को परिभाषित है:वैकल्पिक यूआरएल चर

/ 
/de -> matches/(but doesn't collide with /profile) 
/profile 
/de/profile 

मुझे लगता है मैं यह करने के लिए एक तरीका खोज निकाला है, लेकिन यह या तो करने के लिए एक परिवर्तन करना होता कैसे WERKZEUG और फ्लास्क अनुरोध को संभालता है (या तो बंदर पैचिंग या फ्रेमवर्क स्रोत फोर्किंग)। हालांकि इस समस्या से निपटने के लिए यह एक जटिल जटिल तरीका है .. क्या ऐसा करने का कोई आसान तरीका है जिसे मैं देख रहा हूं?

संपादित करें:

ब्रायन के जवाब के आधार पर, यहाँ है कि मैं क्या के साथ आया है:

app.py:

from loc import l10n 

def create_app(config):                             
    app = Flask(__name__)                            
    app.config.from_pyfile(config)                          

    bp = l10n.Blueprint()                            
    bp.add_url_rule('/', 'home', lambda lang_code: lang_code)                   
    bp.add_url_rule('/profile', 'profile', lambda lang_code: 'profile: %s' % 
     lang_code) 
    bp.register_app(app)                             

    return app 

if __name__ == '__main__': 
    create_app('dev.cfg').run() 

loc/l10ln.py

class Blueprint(Blueprint_): 
    def __init__(self): 
     Blueprint_.__init__(self, 'loc', __name__) 

    def register_app(self, app): 
     app.register_blueprint(self, url_defaults={'lang_code': 'en'})                 
     app.register_blueprint(self, url_prefix='/<lang_code>') 

     self.app = app 

(मुझे अभी तक परिवर्तनीय सूची से lang_code खींचने के लिए नहीं मिला है, लेकिन जल्द ही ऐसा कर रहा है)

अब यह केवल गर्म imho है।

उत्तर

7

ब्लूप्रिंट इसके लिए काम कर सकते हैं, क्योंकि उन्हें कई बार पंजीकृत किया जा सकता है।

from flask import Flask, Blueprint 

app = Flask(__name__) 
bp = Blueprint('main', __name__) 

@bp.route('/') 
def hello(lang): 
    return 'Hello ' + lang + '!' 

app.register_blueprint(bp, url_defaults={'lang': 'en'}) 
app.register_blueprint(bp, url_prefix='/<lang>') 

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

अगर वह काम करता है, एक तरह से हर दृश्य समारोह में एक lang तर्क निर्दिष्ट करने से बचने के लिए के लिए बोतल दस्तावेज में Internationalized Blueprint URLs देखते हैं।

+0

निश्चित रूप से इम्हो जाने का तरीका, ब्लूप्रिंट –

10

बस अगर आपको पता नहीं था, तो आप एक दृश्य के लिए कई मार्ग पंजीकृत कर सकते हैं। प्रत्येक दृश्य के लिए यह करने के लिए एक दर्द हो सकता है, लेकिन यह संभव है ...

DEFAULT_LANG = 'en' 

@app.route('/profile') 
@app.route('/<lang>/profile') 
def profile(lang=DEFAULT_LANG): 
    pass 

या, शायद आप अपने खुद के route डेकोरेटर कि स्वचालित रूप से दोनों परिदृश्यों में app.route का आह्वान ... लागू कर सकता है

from flask import Flask 

app = Flask(__name__) 

DEFAULT_LANG = 'en' 

def lang_route(rule, **options): 
    def decorator(f): 
     endpoint = options.pop('endpoint', None) 
     app.add_url_rule(rule, endpoint, f, **options) 
     app.add_url_rule('/<lang>%s' % rule, endpoint, f, **options) 
     return f 
    return decorator 

@lang_route('/profile') # also accepts '/<lang>/profile' automatically 
def profile(lang=DEFAULT_LANG): 
    return lang 

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

की (सापेक्ष) नई गर्मी को देखते हुए मुझे लगता है कि यह एक महान और अत्यंत गहन जवाब है। – jdotjdot

+0

इसे करने का सही तरीका 100%। – sberry

+1

यह एक बुरा समाधान नहीं है, लेकिन मुझे लगता है कि ब्लूप्रिंट अधिक सही हैं क्योंकि उन्हें मार्गों के एक सेट को समाहित करने के लिए डिज़ाइन किया गया है, और आप आसानी से उन सभी मार्गों को आसानी से कुशलतापूर्वक उपयोग करने देते हैं। [फ्लास्क दस्तावेज़ अनुशंसा करते हैं] (http://flask.pocoo.org/docs/patterns/urlprocessors/#internationalized- appplication-urls) यूआरएल अंतर्राष्ट्रीयकरण के लिए ब्लूप्रिंट का उपयोग करके: "आप अपने स्वयं के सजावटी लिखकर इसे और सुधार सकते हैं जो यूआरएल उपसर्ग करता है भाषा कोड के साथ, लेकिन अधिक सुंदर समाधान ब्लूप्रिंट का उपयोग कर रहा है। " –

संबंधित मुद्दे