如何在OpenShift上从mod_wsgi访问其他文件

时间:2015-04-20 01:45:21

标签: python openshift mod-wsgi

假设我有以下两个文件:

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上研究后我找不到任何解决方案。有人可以帮我这个吗?谢谢!

2 个答案:

答案 0 :(得分:1)

忘记wsgi.py,它只是初始的样板代码。如果在wsgi文件夹中创建应用程序文件,则将忽略wsgi.py,并将运行该应用程序文件中定义的Flask模块。只需在root中的application文件夹中创建一个名为..\wsgi\的文件,其中包含以下内容(最后用您自己的应用程序名称替换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以更详细地了解这一点。

答案 1 :(得分:0)

您可以通过查看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') ]