Для Firefox и Chrome:
<div style="width:100%;">
<div style="width: 50%; margin: 0px auto;">Text</div>
</div>
Для Internet & nbsp; Explorer, Firefox и Chrome:
<div style="width:100%; text-align:center;">
<div style="width: 50%; margin: 0px auto; text-align:left;">Text</div>
</div>
Свойство text-align:
необязательно для современных браузеров, но оно необходимо в режиме Internet & nbsp; Quirks Mode для поддержки устаревших браузеров.
Ответ зависит от того, как вы обслуживаете это приложение.
Предполагая, что вы собираетесь запускать это приложение внутри контейнера WSGI (mod_wsgi, uwsgi, gunicorn и т. д.); вам нужно на самом деле монтировать в этом префиксе приложение как часть этого контейнера WSGI (что-нибудь, что говорит WSGI) и установить настройку APPLICATION_ROOT
значение для вашего префикса:
app.config["APPLICATION_ROOT"] = "/abc/123"
@app.route("/")
def index():
return "The URL for this page is {}".format(url_for("index"))
# Will return "The URL for this page is /abc/123/"
Установка значения конфигурации APPLICATION_ROOT
просто ограничивает файл cookie сеанса флешки этим префиксом URL.
Если вы не знаете, что означает первый абзац, это означает, что все остальные будут автоматически обработаны для вас превосходными возможностями WSGI для Flask и Werkzeug. , посмотрите на это примерное приложение с Flask, смонтированным внутри него:
from flask import Flask, url_for
from werkzeug.serving import run_simple
from werkzeug.wsgi import DispatcherMiddleware
app = Flask(__name__)
app.config['APPLICATION_ROOT'] = '/abc/123'
@app.route('/')
def index():
return 'The URL for this page is {}'.format(url_for('index'))
def simple(env, resp):
resp(b'200 OK', [(b'Content-Type', b'text/plain')])
return [b'Hello WSGI World']
app.wsgi_app = DispatcherMiddleware(simple, {'/abc/123': app.wsgi_app})
if __name__ == '__main__':
app.run('localhost', 5000)
Если, с другой стороны, вы будете запускать свою флягу приложение в корневом контейнере WSGI и запросы проксирования к нему (например, если это FastCGI'd, или если nginx является proxy_pass
-потребителями запросов для вспомогательной точки к вашему автономному uwsgi
/ gevent
, вы можете либо:
DispatcherMiddleware
из werkzeug
(или PrefixMiddleware
из ответа su27 ), чтобы подключить ваше приложение на автономном сервере WSGI, который вы используете. (См. Пример правильной подстройки вашего приложения выше для используемого кода.) Это скорее ответ на python, чем ответ Flask / werkzeug; но это просто и работает.
Если, как и я, вы хотите, чтобы настройки вашего приложения (загруженные из файла .ini
) также содержали префикс вашего приложения Flask (таким образом, чтобы не устанавливать значение во время развертывания, но во время выполнения) вы можете выбрать следующее:
def prefix_route(route_function, prefix='', mask='{0}{1}'):
'''
Defines a new route function with a prefix.
The mask argument is a `format string` formatted with, in that order:
prefix, route
'''
def newroute(route, *args, **kwargs):
'''New function to prefix the route'''
return route_function(mask.format(prefix, route), *args, **kwargs)
return newroute
Возможно, это несколько хакерское и полагается на то, что функция маршрута колбы требует a route
в качестве первого позиционного аргумента.
Вы можете использовать его следующим образом:
app = Flask(__name__)
app.route = prefix_route(app.route, '/your_prefix')
NB: ничего не стоит, что можно использовать переменную в префиксе (например, установив его на /<prefix>
), а затем обработайте этот префикс в тех функциях, которые вы украшаете своим @app.route(...)
. Если вы это сделаете, вам, очевидно, нужно объявить параметр prefix
в вашей украшенной функции. Кроме того, вы можете проверить представленный префикс на некоторые правила и вернуть 404, если проверка завершилась неудачно. Чтобы избежать 404 пользовательской повторной реализации, пожалуйста, from werkzeug.exceptions import NotFound
, а затем raise NotFound()
, если проверка завершилась неудачно.
Мне нужен был подобный так называемый «контекст-корень». Я сделал это в файле conf под /etc/httpd/conf.d/, используя WSGIScriptAlias:
<VirtualHost *:80>
WSGIScriptAlias /myapp /home/<myid>/myapp/wsgi.py
<Directory /home/<myid>/myapp>
Order deny,allow
Allow from all
</Directory>
</VirtualHost>
Итак, теперь я могу получить доступ к моему приложению как: http: // localhost: 5000 / myapp
См. руководство - http://modwsgi.readthedocs.io/en/develop/user-guides/quick-configuration -guide.html
Другим совершенно другим способом является точка монтирования в uwsgi
.
Из документа doc about Хостинг нескольких приложений в одном и том же процессе ( permalink ).
В вашем uwsgi.ini
вы добавляете
[uwsgi]
mount = /foo=main.py
manage-script-name = true
# also stuff which is not relevant for this, but included for completeness sake:
module = main
callable = app
socket = /tmp/uwsgi.sock
Если вы не вызываете свой файл main.py
, вам необходимо изменить оба mount
и module
Ваш main.py
может выглядеть так:
from flask import Flask, url_for
app = Flask(__name__)
@app.route('/bar')
def bar():
return "The URL for this page is {}".format(url_for('bar'))
# end def
И конфигурация nginx (опять же для полноты):
server {
listen 80;
server_name example.com
location /foo {
include uwsgi_params;
uwsgi_pass unix:///temp/uwsgi.sock;
}
}
Теперь вызов example.com/foo/bar
отобразит /foo/bar
, как возвращено флягой url_for('bar')
, так как оно автоматически адаптируется. Таким образом, ваши ссылки будут работать без проблем с префиксами.
Вы можете поместить свои маршруты в план:
bp = Blueprint('burritos', __name__,
template_folder='templates')
@bp.route("/")
def index_page():
return "This is a website about burritos"
@bp.route("/about")
def about_page():
return "This is a website about burritos"
Затем вы регистрируете проект приложением с использованием префикса:
app = Flask(__name__)
app.register_blueprint(bp, url_prefix='/abc/123')
Итак, я считаю, что правильный ответ на этот вопрос: префикс должен быть настроен в фактическом серверном приложении, которое вы используете, когда разработка завершена. Apache, nginx и т. Д.
Однако, если вы хотите, чтобы это работало во время разработки при запуске приложения Flask при отладке, посмотрите на этот gist .
DispatcherMiddleware
для спасения! Я скопирую код здесь для потомков:
"Serve a Flask app on a sub-url during localhost development."
from flask import Flask
APPLICATION_ROOT = '/spam'
app = Flask(__name__)
app.config.from_object(__name__) # I think this adds APPLICATION_ROOT
# to the config - I'm not exactly sure how!
# alternatively:
# app.config['APPLICATION_ROOT'] = APPLICATION_ROOT
@app.route('/')
def index():
return 'Hello, world!'
if __name__ == '__main__':
# Relevant documents:
# http://werkzeug.pocoo.org/docs/middlewares/
# http://flask.pocoo.org/docs/patterns/appdispatch/
from werkzeug.serving import run_simple
from werkzeug.wsgi import DispatcherMiddleware
app.config['DEBUG'] = True
# Load a dummy app at the root URL to give 404 errors.
# Serve app at APPLICATION_ROOT for localhost development.
application = DispatcherMiddleware(Flask('dummy_app'), {
app.config['APPLICATION_ROOT']: app,
})
run_simple('localhost', 5000, application, use_reloader=True)
Теперь при запуске вышеуказанного кода в качестве автономного приложения Flask , http://localhost:5000/spam/
отобразит Hello, world!
.
В комментарии к другому ответу я сказал, что хотел сделать что-то вроде этого:
from flask import Flask, Blueprint
# Let's pretend module_blueprint defines a route, '/record/<id>/'
from some_submodule.flask import module_blueprint
app = Flask(__name__)
app.config['APPLICATION_ROOT'] = '/api'
app.register_blueprint(module_blueprint, url_prefix='/some_submodule')
app.run()
# I now would like to be able to get to my route via this url:
# http://host:8080/api/some_submodule/record/1/
Применение DispatcherMiddleware
к мой надуманный пример:
from flask import Flask, Blueprint
from flask.serving import run_simple
from flask.wsgi import DispatcherMiddleware
# Let's pretend module_blueprint defines a route, '/record/<id>/'
from some_submodule.flask import module_blueprint
app = Flask(__name__)
app.config['APPLICATION_ROOT'] = '/api'
app.register_blueprint(module_blueprint, url_prefix='/some_submodule')
application = DispatcherMiddleware(Flask('dummy_app'), {
app.config['APPLICATION_ROOT']: app
})
run_simple('localhost', 5000, application, use_reloader=True)
# Now, this url works!
# http://host:8080/api/some_submodule/record/1/
Вы должны заметить, что APPLICATION_ROOT
для этой цели НЕ.
Все, что вам нужно сделать, это написать промежуточное программное обеспечение для внесения следующих изменений:
PATH_INFO
, чтобы обработать префикс url. SCRIPT_NAME
, чтобы сгенерировать префиксный URL. Как это:
class PrefixMiddleware(object):
def __init__(self, app, prefix=''):
self.app = app
self.prefix = prefix
def __call__(self, environ, start_response):
if environ['PATH_INFO'].startswith(self.prefix):
environ['PATH_INFO'] = environ['PATH_INFO'][len(self.prefix):]
environ['SCRIPT_NAME'] = self.prefix
return self.app(environ, start_response)
else:
start_response('404', [('Content-Type', 'text/plain')])
return ["This url does not belong to the app.".encode()]
Оберните свое приложение с помощью промежуточного программного обеспечения, например:
from flask import Flask, url_for
app = Flask(__name__)
app.debug = True
app.wsgi_app = PrefixMiddleware(app.wsgi_app, prefix='/foo')
@app.route('/bar')
def bar():
return "The URL for this page is {}".format(url_for('bar'))
if __name__ == '__main__':
app.run('0.0.0.0', 9010)
Посетите http://localhost:9010/foo/bar
,
Вы получите правильный результат: The URL for this page is /foo/bar
И не забудьте установить домен cookie, если вам нужно.
Это решение задано gist Larivact. APPLICATION_ROOT
не для этой работы, хотя похоже, что это так. Это действительно запутанно.