首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >/app1中的Python瓶应用程序--我是否被迫将"/app1“添加到所有路线上?

/app1中的Python瓶应用程序--我是否被迫将"/app1“添加到所有路线上?
EN

Stack Overflow用户
提问于 2018-05-08 01:38:12
回答 2查看 451关注 0票数 1

我在本地开发了一个使用run()的瓶子应用程序,每个教程都以"/“开头,现在我想把它放到一个真正的服务器上。

http://bottlepy.org/docs/dev/deployment.html的文档建议使用WSGIScriptAlias / /var/www/yourapp/app.wsgi,但我不希望我的站点的根被WSGI应用程序处理。我希望站点的根目录由原始Apache处理,只有/app1下的URL由WSGI处理。

所以我把我的名字设为WSGIScriptAlias /app1 /var/www/app1/app1.py。从某种意义上说,当我浏览到server://app1时,我可以看到在路由(‘/’)的.py文件中定义了什么,但是没有一个超链接预先准备了/app1,浏览器也无法从/var/www/app1/css中获取我的css文件等等。

所有的人都说了。当我想让应用程序生活在子目录中时,我是否被迫将"/app1“添加到所有的路径中?

因为我预见到将来会制造/app2、/app3等产品,所以我一直在努力防止自己的未来.

编辑1:为了进行实验,我确实尝试了将/app1放在所有路由的前面。结果更加糟糕:我试图在/app1下浏览的每一个地址都会出现一个404错误。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-11 09:07:45

因此,为了尝试,我从下面的repo取了一个样板代码。

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

代码语言:javascript
运行
复制
<!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

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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运行它

代码语言:javascript
运行
复制
[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

为了您的方便,所有代码都可以在下面的repo上找到。

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

票数 1
EN

Stack Overflow用户

发布于 2018-05-10 15:44:47

在构造重定向URL时,您的WSGI应用程序代码需要考虑到在WSGI请求环境中传递的SCRIPT_NAME变量。

通常,WSGI框架会提供一个帮助函数来完成这个任务。如果瓶不提供这样的功能,您将需要实现您自己的。

如果您有单独的静态文件,则需要告诉Apache使用适当的Alias指令托管它们。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50224590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档