假设我有以下两个文件:
<!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>
#!/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.html
与wsgi.py
分开,但要获取main.html
的文件内容并使用它来创建动态网页。我不能把main.html
放在wsgi.py
里面作为一个字节串,因为我有很多的HTML,CSS和这样的JS文件,我不能把它放到所有的文件中。此外,我不能使它成为一个静态文件,因为它不是一个静态文件,即使它是在这个例子中。我正在使用Apache + mod_wsgi并使用Python 3.3包在OpenShift上托管它。我也在使用Github部署我的应用程序。
我假设有一种方法可以做到这一点,因为必须有其他人将问题分离成多个文件,但在Google上研究后我找不到任何解决方案。有人可以帮我这个吗?谢谢!
答案 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') ]