【问题标题】:How to access other files from mod_wsgi on OpenShift如何在 OpenShift 上从 mod_wsgi 访问其他文件
【发布时间】:2015-04-20 01:45:20
【问题描述】:

假设我有以下两个文件:

main.html

<!DOCTYPE html>
<html>
<head>
    <title>Friendly Testing!</title>
    %(HEAD)
</head>
<body>
    %(HEADING)
    Hi! This is just a friendly person being a friendly tester!
</body>
</html>

wsgi.py

#!/usr/bin/env python
import os

def application(environ, start_response):
    # Mimetype
    ctype = 'text/html'
    # File contents as body
    file_contents = [I NEED HELP HERE]
    response_body = b"<header>This is a header!</header>".join( \
        b"<meta charset=\"utf-8\"/>".join( \
            file_contents.split(b"%(HEAD)") \
        ).split(b"%(HEADING)") \
    )

    # Heading
    status = '200 OK'
    response_headers = [ \
        ('Content-Type', ctype), ('Content-Length', str(len(response_body))) \
    ]

    # Send response
    start_response(status, response_headers)
    return [response_body.encode('utf-8') ]

现在,我想将main.htmlwsgi.py 分开,但获取main.html 的文件内容并使用它来创建动态网页。我不能将main.html 作为字节字符串放入wsgi.py 中,因为我有很多 的HTML、CSS 和JS 文件这样的文件,我不能将它们放入所有文件中。此外,我不能将其设为静态文件,因为它不是静态文件,即使在本示例中也是如此。我正在使用 Apache+mod_wsgi 并使用 Python 3.3 包将其托管在 OpenShift 上。我也在使用 Github 来部署我的应用程序。

我假设有一种方法可以做到这一点,因为肯定有其他人遇到了将他们的代码分成多个文件的问题,但在 Google 上研究后我找不到任何解决方案。有人可以帮我吗?谢谢!

【问题讨论】:

    标签: python openshift mod-wsgi


    【解决方案1】:

    忘记wsgi.py,它只是初始样板代码。如果您在 wsgi 文件夹中创建应用程序文件,则 wsgi.py 将被忽略,而将运行该应用程序文件中定义的 Flask 模块。只需在根目录下的..\wsgi\ 文件夹中创建一个名为application 的文件,内容如下(将末尾的rafinder 替换为您自己的应用程序名称):

    #!/usr/bin/python
    import os
    
    virtenv = os.environ['OPENSHIFT_PYTHON_DIR'] + '/virtenv/'
    os.environ['PYTHON_EGG_CACHE'] = os.path.join(virtenv, 'lib/python2.7/site-packages')
    virtualenv = os.path.join(virtenv, 'bin/activate_this.py')
    try:
        execfile(virtualenv, dict(__file__=virtualenv))
    except IOError:
        pass
    
    from rafinder import app as application
    

    现在,在 wsgi 目录中创建一个名为 rafinder.py(或您定义的任何内容)的 Flask 模块。现在将从此模块引用您的所有静态 html/css 文件。您的文件夹结构现在应该如下所示:

    wsgi.py
    setup.py
    .openshift/..
    .settings/..
    wsgi/..         => your python source files go here.
    wsgi/application  => your application definition file.
    wsgi/static..   => your static folders viz css, img, fonts, et al. go here.
    

    这里是示例模块rafinder.py,我已经在我的一个应用程序中实现了它。你可以在这里看到一些基本的路由:

    import os
    import flask
    from flask import Flask
    from flask import request
    import models
    
    app = Flask(__name__)
    app.config['UPLOAD_FOLDER'] = 'static/img'
    # These are the extension that we are accepting to be uploaded
    app.config['ALLOWED_EXTENSIONS'] = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'])
    
    @app.route("/reset_database")
    def reset_database():
        import_from_csv("wsgi/students.csv")
        return "Reset successful!"
    
    @app.route("/")
    def home():
        pass
    

    阅读我的entire article 以更详细地了解这一点。

    【讨论】:

    • 真的感谢您的回答,我希望它对使用 Flash 的人有所帮助,但我自己没有使用 Flask。我只是在使用 Apache+mod_wsgi,所以我只有一个常规的 WSGI 应用程序,而且我的解决方案运行良好。我希望我们的两个答案可以帮助不同的人!
    • 我认为 Flask 与否在这种情况下并不重要。我还将我的 openshift 应用程序作为 Apache+mod_wsgi 启动,Flask 只是一个用作依赖项的 python 库。即使您不使用 Flask,应用程序文件仍然可以保存。唯一的区别是,您导入自己的 wsgi 兼容模块 (wsgi.py),而不是 Flask 模块 rafinder.py。
    • 好吧,我仍然认为坚持我现在的解决方案会更容易,因为它仍然有效,我宁愿不移动所有文件。您认为我的解决方案有什么缺点吗?
    • 当然可以。既然如此,为什么不能直接从 main.html 中导入代码并在 wsgi.py 中显示。你可以这样做:file_contents = open('main.html', 'r')
    • 另外,如果您的 main.html 存储在您的 github 文件夹中,与 wsgi.py 的路径不同,那么您可以在您的 wsgi.py 中使用 environ["OPENSHIFT_REPO_DIR"] 获取 repo 路径代码。
    【解决方案2】:

    您可以通过查看environ["SCRIPT_FILENAME"] 在您的 Github 存储库中找到这些文件。该值是一个字符串,包含 Github 存储库中 wsgi.py 的文件位置。因此,environ["SCRIPT_FILENAME"][:environ["SCRIPT_FILENAME"].rindex("/")] 是 Github 存储库的目录,您可以从那里找到所有文件。

    #!/usr/bin/env python
    import os
    
    def application(environ, start_response):
        # Mimetype
        ctype = 'text/html'
    
        # Directory
        dir = environ["SCRIPT_FILENAME"][:environ["SCRIPT_FILENAME"].rindex("/")]
        # Get File Contents
        file_contents = b""
        with open(dir+"/main.html", "rb") as file:
            file_contents = file.read()
    
        # Add Dynamic Content
        response_body = b"This is a header!".join( \
            b"".join( \
                file_contents.split(b"%(HEAD)") \
            ).split(b"%(HEADING)") \
        )
    
        # Heading
        status = '200 OK'
        response_headers = [ \
            ('Content-Type', ctype), ('Content-Length', str(len(response_body))) \
        ]
    
        # Send Response
        start_response(status, response_headers)
        return [response_body.encode('utf-8') ]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-15
      • 1970-01-01
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-09
      • 1970-01-01
      相关资源
      最近更新 更多