Приложение Python Bottle в / app1 - я вынужден добавлять "/ app1" ко всем маршрутам? - PullRequest
0 голосов
/ 08 мая 2018

Я разработал бутылочное приложение локально, используя run () с маршрутами, которые начинаются с "/" в учебнике, и теперь я хочу разместить его на реальном сервере.

Документы на http://bottlepy.org/docs/dev/deployment.html предлагают использовать WSGIScriptAlias / /var/www/yourapp/app.wsgi, но я не хочу, чтобы корень моего сайта обрабатывался приложением WSGI. Я хочу, чтобы корень сайта обрабатывался необработанным Apache, а WSGI обрабатывал только URL-адреса в / app1.

Итак, я настроил мой как WSGIScriptAlias /app1 /var/www/app1/app1.py. Он работает в том смысле, что я могу видеть то, что я определил в файле .py в маршруте ('/'), когда я захожу на сервер: // app1, но ни одна из гиперссылок не имеет префикс / app1, и браузер не может выбрать мои css файлы из / var / www / app1 / css и т. д.

Субъект говорит все это. Я вынужден добавлять «/ app1» ко всем маршрутам, если я хочу, чтобы приложение находилось в подкаталоге?

Я пытался доказать будущее, потому что предвидел в будущем создание / app2, / app3 и т. Д.

РЕДАКТИРОВАТЬ 1 : Ради эксперимента я сделал и попытался добавить / app1 ко всем маршрутам. Результат был еще хуже: каждый адрес, который я пытаюсь найти в / app1, выдает ошибку 404.

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Итак, чтобы попытаться это сделать, я взял стандартный код снизу репо

https://github.com/arsho/bottle-bootstrap

И использовал это как базу. Я понял, что можно смонтировать ваше приложение по базовому URL, если вы будете следовать нескольким простым правилам

  • Каждый HTML-код, который вы обслуживаете, должен определять базовый путь с помощью тега HEAD. Нравится <base href="{{ APP_MOUNT_PATH }}">
  • Статические ссылки, которые должны быть связаны с базовым путем, не должны начинаться с / или ./. Как <script type="text/javascript" src="static/jquery.min.js"></script>. Это обеспечит создание пути с использованием пути монтирования, который вы указали в теге base
  • Взять путь монтирования из переменных среды при запуске приложения

Итак, вот обновленные файлы

index.tpl

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="Bottle web project template">
    <meta name="author" content="datamate">
    <link rel="icon" href="static/favicon.ico"> 
    <base href="{{ APP_MOUNT_PATH }}">
    <title>Project</title>
    <link rel="stylesheet" type="text/css" href="static/bootstrap.min.css">
    <script type="text/javascript" src="static/jquery.min.js"></script>
    <script type="text/javascript" src="static/bootstrap.min.js"></script>  
</head>
<body>
    <!-- Static navbar -->
    <nav class="navbar navbar-default navbar-static-top">
        <div class="container">
            <div class="row">
                <div class="navbar-header">
                    <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
                        <span class="sr-only">Toggle navigation</span>
                        <span class="icon-bar"></span>
                        <span class="icon-bar"></span>
                        <span class="icon-bar"></span>
                    </button>
                    <a class="navbar-brand" href="#">Project</a>
                </div>
                <div id="navbar" class="navbar-collapse collapse">
                    <ul class="nav navbar-nav navbar-right">
                        <li><a href="navbar/">Home</a></li>
                        <li><a href="./">Github</a></li>
                        <li><a href="navbar-fixed-top/">Stackoverflow</a></li>
                    </ul>
                </div><!--/.nav-collapse -->
            </div>
        </div>
    </nav>
    <div class="container">
        <div class="row">
            <div class="jumbotron">
            <h2>Welcome from {{data["developer_name"]}}</h2>
                <p>This is a template showcasing the optional theme stylesheet included in Bootstrap. Use it as a starting point to create something more unique by building on or modifying it.</p>
            </div>
        </div>
        <!--./row-->
        <div class="row">
            <hr>
            <footer>
                <p>&copy; 2017 {{data["developer_organization"]}}.</p>
            </footer>           
        </div>
    </div> 
    <!-- /container -->
</body>
</html>

app.py

from bottle import Bottle, run, \
     template, debug, static_file

import os, sys

dirname = os.path.abspath(os.path.dirname(__file__))

app = Bottle()
debug(True)

@app.route('/static/<filename:re:.*\.css>')
def send_css(filename):
    print("Sending", filename, dirname)
    return static_file(filename, root=dirname+'/static/asset/css')

@app.route('/static/<filename:re:.*\.js>')
def send_js(filename):
    print("Sending", filename, dirname)
    return static_file(filename, root=dirname+'/static/asset/js')

@app.route('/')
def index():
    data = {"developer_name":"Tarun Lalwani",
            "developer_organization":""}
    return template('index', data = data)

@app.route('/tarun/')
def tarun():
    data = {"developer_name":"Tarun Lalwani",
            "developer_organization":""}
    return template('index', data = data)


if __name__ == "__main__":
    run(app, host='localhost', port = 8080)

app.wsgi

import os
os.chdir(os.path.abspath(os.path.dirname(__file__)))

import bottle
from app import app
application = bottle.default_app()

mount_path = os.getenv("APP_MOUNT_PATH", "/")
application.config['APP_MOUNT_PATH'] = mount_path

application.mount(mount_path,  app)
bottle.BaseTemplate.defaults['APP_MOUNT_PATH'] = mount_path

А потом я запустил его, используя uwsgi

[uwsgi]
http = 127.0.0.1:3031
chdir = /Users/tarunlalwani/Documents/Projects/SO/bottle-bootstrap
pythonpath = .
env = APP_MOUNT_PATH=/app2/
wsgi-file = app.wsgi
processes = 1
threads = 1
stats = 127.0.0.1:9191
; logto = ./uwsgi.log

Теперь приложение прекрасно загружается в http://localhost:3031/app2/ и `` http://localhost:3031/app2/tarun`, что показывает, что базовый путь работает для обоих типов URL

Base URL

Base URL + One Level

Весь код доступен в репо для вашего удобства

https://github.com/tarunlalwani/python-bottle-base-url

0 голосов
/ 10 мая 2018

Код вашего приложения WSGI должен учитывать переменную SCRIPT_NAME, передаваемую в среде запроса WSGI, при создании URL-адресов перенаправления и т. Д. См .:

Обычно инфраструктура WSGI предоставляет вспомогательную функцию для этого. Если у Bottle нет такой функции, вам нужно реализовать свою собственную.

Если у вас есть отдельные статические файлы, вы должны указать Apache на их размещение, используя соответствующую директиву Alias.

...