Flask의 정적 파일-robot.txt, sitemap.xml (mod_wsgi)
Flask의 응용 프로그램 루트 디렉토리에 정적 파일을 저장하는 영리한 솔루션이 있습니까? robots.txt 및 sitemap.xml은 /에서 찾을 수 있으므로 내 아이디어는 경로를 만드는 것이 었습니다.
@app.route('/sitemap.xml', methods=['GET'])
def sitemap():
response = make_response(open('sitemap.xml').read())
response.headers["Content-type"] = "text/plain"
return response
더 편리한 것이 있어야합니다 :)
가장 좋은 방법은 static_url_path 를 루트 URL 로 설정하는 것입니다.
from flask import Flask
app = Flask(__name__, static_folder='static', static_url_path='')
@vonPetrushev가 맞습니다. 프로덕션에서는 nginx 또는 apache를 통해 정적 파일을 제공하고 싶지만 개발을 위해 Python 앱이 정적 콘텐츠를 제공하도록 간단하게 개발 환경을 설정하는 것이 좋습니다. 따라서 걱정할 필요가 없습니다. 구성 및 여러 프로젝트 변경에 대해. 이를 위해 SharedDataMiddleware 를 사용하고 싶을 것 입니다.
from flask import Flask
app = Flask(__name__)
'''
Your app setup and code
'''
if app.config['DEBUG']:
from werkzeug import SharedDataMiddleware
import os
app.wsgi_app = SharedDataMiddleware(app.wsgi_app, {
'/': os.path.join(os.path.dirname(__file__), 'static')
})
이 예에서는 정적 파일이 "static"폴더에 있다고 가정하고 환경에 맞게 조정합니다.
이 질문에 깨끗한 대답은입니다 대답 이 (동일)에 대한 질문 :
from flask import Flask, request, send_from_directory
app = Flask(__name__, static_folder='static')
@app.route('/robots.txt')
@app.route('/sitemap.xml')
def static_from_root():
return send_from_directory(app.static_folder, request.path[1:])
요약:
- David가 지적했듯이 올바른 구성 을 사용하면 prod를 통해 몇 가지 정적 파일을 제공하는 것이 좋습니다.
- /robots.txt를 찾으면 /static/robots.txt로 리디렉션되지 않아야합니다. (Seans 대답에서는 그것이 어떻게 달성되었는지 즉시 명확하지 않습니다.)
- 앱 루트 폴더에 정적 파일을 추가하는 것은 깨끗하지 않습니다.
- 마지막으로 제안 된 솔루션은 미들웨어 추가 방식보다 훨씬 깔끔해 보입니다.
이것은 오래된 답변이지만이 게시물이 Google 결과에서 상당히 높은 위치에 있기 때문에 대답하고 있습니다. 설명서에서는 다루지 않지만 Flask Application 객체 생성자에 대한 API 문서 를 읽으면 다룹니다. 다음 static_folder
과 같이 명명 된 매개 변수를 전달합니다 .
from flask import Flask
app = Flask(__name__,
static_folder="/path/to/static",
template_folder="/path/to/templates")
... 정적 파일이 제공되는 위치를 정의 할 수 있습니다. 마찬가지로 사용자 template_folder
의 이름 인을 정의 할 수 있습니다 static_url_path
.
정적 파일을 제공하는 것은 동적 콘텐츠를 제공하는 응용 프로그램과 관련이 없습니다. 정적 파일을 제공하는 올바른 방법은 사용중인 서버에 따라 다릅니다. 결국, 앱을 시작하고 실행할 때 웹 서버에 바인딩해야합니다. 아파치 httpd에 대해서만 말할 수 있으므로 정적 파일을 제공하는 방법은 mod-wsgi를 통해 애플리케이션에 바인딩하는 가상 호스트에서 정의됩니다. 다음은 사이트 맵, robots.txt 또는 기타 정적 콘텐츠를 제공하는 방법을 보여주는 가이드입니다. http://code.google.com/p/modwsgi/wiki/QuickConfigurationGuide#Mounting_At_Root_Of_Site
정적 파일을 보내는 또 다른 방법은 다음과 같은 포괄 규칙을 사용하는 것입니다.
@app.route('/<path:path>')
def catch_all(path):
if not app.debug:
flask.abort(404)
try:
f = open(path)
except IOError, e:
flask.abort(404)
return
return f.read()
개발할 때 설정을 최소화하기 위해 이것을 사용합니다. http://flask.pocoo.org/snippets/57/ 에서 아이디어를 얻었습니다.
Further, I'm developing using flask on my standalone machine but deploying with Apache in production server. I use:
file_suffix_to_mimetype = {
'.css': 'text/css',
'.jpg': 'image/jpeg',
'.html': 'text/html',
'.ico': 'image/x-icon',
'.png': 'image/png',
'.js': 'application/javascript'
}
def static_file(path):
try:
f = open(path)
except IOError, e:
flask.abort(404)
return
root, ext = os.path.splitext(path)
if ext in file_suffix_to_mimetype:
return flask.Response(f.read(), mimetype=file_suffix_to_mimetype[ext])
return f.read()
[...]
if __name__ == '__main__':
parser = optparse.OptionParser()
parser.add_option('-d', '--debug', dest='debug', default=False,
help='turn on Flask debugging', action='store_true')
options, args = parser.parse_args()
if options.debug:
app.debug = True
# set up flask to serve static content
app.add_url_rule('/<path:path>', 'static_file', static_file)
app.run()
This might have been added since this question was asked, but I was looking through flask's "helpers.py" and I found flask.send_from_directory:
send_from_directory(directory, filename, **options)
'''
send_from_directory(directory, filename, **options)
Send a file from a given directory with send_file. This
is a secure way to quickly expose static files from an upload folder
or something similar.
'''
... which references flask.send_file:
send_file(filename_or_fp, mimetype=None, as_attachment=False, attachment_filename=None, add_etags=True, cache_timeout=43200, conditional=False)
... which seems better for more control, although send_from_directory passes **options directly through to send_file.
From the documentation here: http://flask.pocoo.org/docs/quickstart/#static-files
Dynamic web applications need static files as well. That’s usually where the CSS and JavaScript files are coming from. Ideally your web server is configured to serve them for you, but during development Flask can do that as well. Just create a folder called static in your package or next to your module and it will be available at /static on the application.
To generate URLs to that part of the URL, use the special 'static' URL name:
url_for('static', filename='style.css')
The file has to be stored on the filesystem as static/style.css.
I'm having the same dilemma as well. Did some search and found my answer(MHO):
Might as well quote from the documentation
Dynamic web applications need static files as well. That’s usually where the CSS and JavaScript files are coming from. Ideally your web server is configured to serve them for you, but during development Flask can do that as well. Just create a folder called static in your package or next to your module and it will be available at /static on the application.
IMHO: When your application is up for production, static file serving should be (or is ideally) configured on the webserver (nginx, apache); but during development, Flask made it available to serve static files. This is to help you develop rapidly - no need to setup webservers and such.
Hope it helps.
참고URL : https://stackoverflow.com/questions/4239825/static-files-in-flask-robot-txt-sitemap-xml-mod-wsgi
'developer tip' 카테고리의 다른 글
Log4j2에서 프로그래밍 방식으로 로그 수준 변경 (0) | 2020.09.03 |
---|---|
브라우저 창에 맞게 이미지 크기를 조정하는 방법은 무엇입니까? (0) | 2020.09.03 |
IntelliJ가 선언을 찾을 수 없습니다. (0) | 2020.09.02 |
SpringData : "delete by"가 지원됩니까? (0) | 2020.09.02 |
UIAlertAction에 대한 핸들러 작성 (0) | 2020.09.02 |