Python flask web application with multilanguages support by host and prefix

后端 未结 4 1705
隐瞒了意图╮
隐瞒了意图╮ 2020-12-18 11:24

I have one server with flask application instance and have several domain which mapped to this server by DNS.

My site must support several languages by host and pref

4条回答
  •  孤城傲影
    2020-12-18 11:39

    I worked on something similar few months back. I modified it a bit and pushed to github. You can do what codegeek suggested if you are unable to make your templates language neutral. With this method you can cut down on the template files needed.

    https://github.com/scragg0x/Flask-Localisation-Example

    mysite.py

    from flask import Flask, Blueprint, g, redirect, request
    
    app = Flask(__name__)
    
    mod = Blueprint('mysite', __name__, url_prefix='/')
    
    sites = {
        'mysite.com': 'en',
        'myothersite.com': 'fr'
    }
    
    @app.url_defaults
    def add_language_code(endpoint, values):
        values.setdefault('lang_code', g.lang_code)
    
    @app.url_value_preprocessor
    def pull_lang_code(endpoint, values):
        url = request.url.split('/', 3)
        g.lang_code = sites[url[2]]
    
    @mod.url_defaults
    def add_language_code(endpoint, values):
        values.setdefault('lang_code', g.lang_code)
    
    @mod.url_value_preprocessor
    def pull_lang_code(endpoint, values):
        g.lang_code = values.pop('lang_code')
    
    @app.route('/')
    @mod.route('/')
    def index():
        # Use g.lang_code to pull localized data for template
        return 'lang = %s' % g.lang_code
    
    app.register_blueprint(mod)
    

    tests.py

    import os
    import unittest
    import re
    import requests
    import urllib2
    import json
    from mysite import app
    
    class MySiteTestCase(unittest.TestCase):
    
        def setUp(self):
            app.config['TESTING'] = True
            app.config['SERVER_NAME'] = 'mysite.com'
            self.domain = 'http://mysite.com/'
            self.app = app.test_client()
    
        def tearDown(self):
            pass
    
        def test_en_index(self):
            rv = self.app.get('/en/', self.domain)
            self.assertEqual(rv.data, 'lang = en')
            print self.domain, rv.data
    
        def test_fr_index(self):
            rv = self.app.get('/fr/', self.domain)
            self.assertEqual(rv.data, 'lang = fr')
            print self.domain, rv.data
    
        def test_default(self):
            rv = self.app.get('/', self.domain)
            self.assertEqual(rv.data, 'lang = en')
            print self.domain, rv.data
    
    class MyOtherSiteTestCase(unittest.TestCase):
    
        def setUp(self):
            app.config['TESTING'] = True
            app.config['SERVER_NAME'] = 'myothersite.com'
            self.domain = 'http://myothersite.com/'
            self.app = app.test_client()
    
        def tearDown(self):
            pass
    
        def test_en_index(self):
            rv = self.app.get('/en/', self.domain)
            self.assertEqual(rv.data, 'lang = en')
            print self.domain, rv.data
    
        def test_fr_index(self):
            rv = self.app.get('/fr/', self.domain)
            self.assertEqual(rv.data, 'lang = fr')
            print self.domain, rv.data
    
        def test_default(self):
            rv = self.app.get('/', self.domain)
            self.assertEqual(rv.data, 'lang = fr')
            print self.domain, rv.data
    
    if __name__ == '__main__':
        unittest.main()
    

提交回复
热议问题