플라스크에서 정적 파일을 처리하는 방법
래서부부 부부부다다Flask
현재는 하나의 정적 HTML 페이지에 CSS 및 JS에 대한 링크를 제공하고 있습니다. 이 문서에서는 찾을 Flask
에, 스태틱파일의 반환에 대해 설명합니다. 저는 ,, 가, 가, 어, 어를 사용할 수 .render_template
생각지도 못한 일찌감치send_file
★★★★★★★★★★★★★★★★★」url_for
을 읽고, 파일, 파일, 파일, 파일을 정리, 파일, 을 정리하고 .Response
절한 mimtype :
import os.path
from flask import Flask, Response
app = Flask(__name__)
app.config.from_object(__name__)
def root_dir(): # pragma: no cover
return os.path.abspath(os.path.dirname(__file__))
def get_file(filename): # pragma: no cover
try:
src = os.path.join(root_dir(), filename)
# Figure out how flask returns static files
# Tried:
# - render_template
# - send_file
# This should not be so non-obvious
return open(src).read()
except IOError as exc:
return str(exc)
@app.route('/', methods=['GET'])
def metrics(): # pragma: no cover
content = get_file('jenkins_analytics.html')
return Response(content, mimetype="text/html")
@app.route('/', defaults={'path': ''})
@app.route('/<path:path>')
def get_resource(path): # pragma: no cover
mimetypes = {
".css": "text/css",
".html": "text/html",
".js": "application/javascript",
}
complete_path = os.path.join(root_dir(), path)
ext = os.path.splitext(path)[1]
mimetype = mimetypes.get(ext, "text/html")
content = get_file(complete_path)
return Response(content, mimetype=mimetype)
if __name__ == '__main__': # pragma: no cover
app.run(port=80)
코드 샘플이나 URL을 알려주시겠습니까?아주 간단할 거란 거 알아
앞에 서버를 설정하고, 「HTTP」(Nginx, Apache 등)에의 합니다./static
참조할 수 있습니다.전용 웹 서버는 정적 파일을 효율적으로 처리하는 데 매우 능숙합니다. 단, 저볼륨의 Flask와 비교했을 때 큰 차이는 없을 것입니다.
으로 플라 a a a a a a a a a a a a a가 됩니다./static/<path:filename>
의 ""를 "filename
static
플라스크 Python.url_for
파일에 하려면: " " " " "url_for('static', filename='js/analytics.js')
를 사용하여 자신의 루트에 있는 디렉토리에서 파일을 처리할 수도 있습니다.이렇게 하면 기본 디렉토리와 경로가 사용되며 경로가 디렉토리에 포함되어 사용자가 제공한 경로를 안전하게 수락할 수 있습니다.이 기능은 로그인한 사용자에게 권한이 있는지 여부 등 파일을 제공하기 전에 확인해야 하는 경우에 유용합니다.
from flask import send_from_directory
@app.route('/reports/<path:path>')
def send_report(path):
return send_from_directory('reports', path)
사용 안 함send_file
★★★★★★★★★★★★★★★★★」send_static_file
사용자 지정 경로를 사용합니다.디렉토리 트래버설 공격에 노출됩니다. send_from_directory
하게 처리할 수 되어 있어합니다.패스가 디렉토리를 이스케이프 하려고 하면 에러가 발생합니다.
않고 하는 경우, " " " " 를 할 수 .BytesIO
파일처럼 제공하는 것을 반대합니다.다른 인수를 넘겨야 합니다.send_file
파일 이름이나 콘텐츠 유형 등을 추론할 수 없기 때문입니다.
정적 파일의 위치만 이동하려는 경우 가장 간단한 방법은 생성자에서 경로를 선언하는 것입니다. 및 을 음음음 called called called called called called called called called called called called called called called called called called called called called called called called 했습니다.web
.
app = Flask(__name__,
static_url_path='',
static_folder='web/static',
template_folder='web/templates')
static_url_path=''
의 URL)를합니다./static
를 참조해 주세요.static_folder='web/static'
파일을 합니다.web/static
정적 파일로 지정합니다.template_folder='web/templates'
이치노
이 방법을 사용하면 다음 URL에서 CSS 파일이 반환됩니다.
<link rel="stylesheet" type="text/css" href="/css/bootstrap.min.css">
폴더flask_server.py
★★★★★★★★★★★★★★★★★★★★★:
또, 이것은, 모든 사람이 액세스 할 수 있도록, 정적 패스로서 폴더를 설정할 수도 있습니다.
app = Flask(__name__, static_url_path='/static')
이 세트로 표준 HTML을 사용할 수 있습니다.
<link rel="stylesheet" type="text/css" href="/static/style.css">
필요한 것은 http://flask.pocoo.org/docs/quickstart/ #static-files에서 찾을 수 있습니다.
에 "static "" 을 사용할 수 .이 폴더는url_for('static', filename='foo.bar')
또는 http://example.com/static/foo.bar을 사용하여 파일에 직접 링크할 수 있습니다.
편집: 코멘트에서 제시된 바와 같이'/static/foo.bar'
URL 경로 그러나 url_for()
오버헤드(퍼포먼스 향상)는 매우 낮습니다.이것을 사용하면, 나중에 간단하게 동작을 커스터마이즈 할 수 있습니다(폴더 변경, URL 경로 변경, 정적 파일의 S3로의 이동 등).
다음 기능을 사용할 수 있습니다.
send_static_file(filename)
정적 폴더에서 브라우저로 정적 파일을 보내기 위해 내부적으로 사용되는 함수입니다.
app = Flask(__name__)
@app.route('/<path:path>')
def static_file(path):
return app.send_static_file(path)
현재 사용하고 있는 것은, 「템플릿」디렉토리와 「스태틱」디렉토리입니다.모든 .html 파일/Flask 템플릿을 템플릿디렉토리에 배치하고 스태틱에는 CSS/J가 포함됩니다.render_template는 Flask의 템플릿 구문을 사용한 정도에 관계없이 일반적인 html 파일에 적합합니다.다음은 제 views.py 파일의 샘플 콜입니다.
@app.route('/projects')
def projects():
return render_template("projects.html", title = 'Projects')
별도의 정적 디렉토리에 있는 정적 파일을 참조하려면 url_for()를 사용해야 합니다.어차피 이 작업은 html의 CSS/JS 파일링크에서 하게 될 것입니다.예를 들면...
<script src="{{ url_for('static', filename='styles/dist/js/bootstrap.js') }}"></script>
여기에서는, 「캐논컬」한 비공식 플라스크 튜토리얼에의 링크를 소개합니다.이러한 튜토리얼에는, 본격적인 작업에 도움이 되는 힌트가 많이 포함되어 있습니다.
http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world
다른 답변에 기초한 가장 간단한 작업 예는 다음과 같습니다.
from flask import Flask, request
app = Flask(__name__, static_url_path='')
@app.route('/index/')
def root():
return app.send_static_file('index.html')
if __name__ == '__main__':
app.run(debug=True)
index.html이라는HTML을 사용하는 경우:
<!DOCTYPE html>
<html>
<head>
<title>Hello World!</title>
</head>
<body>
<div>
<p>
This is a test.
</p>
</div>
</body>
</html>
중요: index.html은 static이라는 폴더에 있습니다.즉,<projectpath>
가지고 있다.py
및 「」, "파일"<projectpath>\static
가지고 있다html
filename을 클릭합니다.
를 합니다.app.run(debug=True, host='0.0.0.0')
편집: 요청 시 폴더 내의 모든 파일을 표시하려면 다음을 사용하십시오.
@app.route('/<path:path>')
def static_file(path):
return app.send_static_file(path)
, 으로는 '어느 쪽인가'입니다.BlackMamba
의 답변입니다.이치노
다음 폴더 트리를 만드는 angular+boilerplate 흐름의 경우:
backend/
|
|------ui/
| |------------------build/ <--'static' folder, constructed by Grunt
| |--<proj |----vendors/ <-- angular.js and others here
| |-- folders> |----src/ <-- your js
| |----index.html <-- your SPA entrypoint
|------<proj
|------ folders>
|
|------view.py <-- Flask app here
다음 솔루션을 사용합니다.
...
root = os.path.join(os.path.dirname(os.path.abspath(__file__)), "ui", "build")
@app.route('/<path:path>', methods=['GET'])
def static_proxy(path):
return send_from_directory(root, path)
@app.route('/', methods=['GET'])
def redirect_to_index():
return send_from_directory(root, 'index.html')
...
정적 폴더를 사용자 정의로 재정의할 수 있습니다.
app = Flask(__name__, static_folder="your path to static")
root 디렉토리에 템플릿이 있는 경우, app=Domain(이름)을 배치하면 해당 파일이 같은 위치에 있는 경우, 이 파일이 다른 위치에 있는 경우 템플릿 위치를 지정해야 Flask가 해당 위치를 가리킬 수 있습니다.
기본적으로 "static"이라는 이름의 폴더에는 모든 정적 파일이 포함됩니다. 다음은 코드 샘플입니다.
<link href="{{ url_for('static', filename='vendor/bootstrap/css/bootstrap.min.css') }}" rel="stylesheet">
그래서 (@user1671599 answer에 근거해) 작업을 진행하여 여러분과 공유하고 싶었습니다.
(Python에서의 첫 앱이기 때문에 제대로 하고 있으면 좋겠습니다)
내가 한 짓인데...
프로젝트 구조:
server.py:
from server.AppStarter import AppStarter
import os
static_folder_root = os.path.join(os.path.dirname(os.path.abspath(__file__)), "client")
app = AppStarter()
app.register_routes_to_resources(static_folder_root)
app.run(__name__)
앱스타터py:
from flask import Flask, send_from_directory
from flask_restful import Api, Resource
from server.ApiResources.TodoList import TodoList
from server.ApiResources.Todo import Todo
class AppStarter(Resource):
def __init__(self):
self._static_files_root_folder_path = '' # Default is current folder
self._app = Flask(__name__) # , static_folder='client', static_url_path='')
self._api = Api(self._app)
def _register_static_server(self, static_files_root_folder_path):
self._static_files_root_folder_path = static_files_root_folder_path
self._app.add_url_rule('/<path:file_relative_path_to_root>', 'serve_page', self._serve_page, methods=['GET'])
self._app.add_url_rule('/', 'index', self._goto_index, methods=['GET'])
def register_routes_to_resources(self, static_files_root_folder_path):
self._register_static_server(static_files_root_folder_path)
self._api.add_resource(TodoList, '/todos')
self._api.add_resource(Todo, '/todos/<todo_id>')
def _goto_index(self):
return self._serve_page("index.html")
def _serve_page(self, file_relative_path_to_root):
return send_from_directory(self._static_files_root_folder_path, file_relative_path_to_root)
def run(self, module_name):
if module_name == '__main__':
self._app.run(debug=True)
간단한 방법 중 하나입니다. 건배!
demo.py
from flask import Flask, render_template
app = Flask(__name__)
@app.route("/")
def index():
return render_template("index.html")
if __name__ == '__main__':
app.run(debug = True)
이제 템플릿이라는 폴더 이름을 만듭니다.템플릿 폴더에 index.html 파일을 추가합니다.
index.displaces를 표시합니다.
<!DOCTYPE html>
<html>
<head>
<title>Python Web Application</title>
</head>
<body>
<div>
<p>
Welcomes You!!
</p>
</div>
</body>
</html>
프로젝트 구조
-demo.py
-templates/index.html
redirect
★★★★★★★★★★★★★★★★★」url_for
from flask import redirect, url_for
@app.route('/', methods=['GET'])
def metrics():
return redirect(url_for('static', filename='jenkins_analytics.html'))
이 서버는 html에서 참조되는 모든 파일(css 및 js...)입니다.
공유할 생각...다음 예시를 참조하십시오.
from flask import Flask
app = Flask(__name__)
@app.route('/loading/')
def hello_world():
data = open('sample.html').read()
return data
if __name__ == '__main__':
app.run(host='0.0.0.0')
이것은 더 잘 작동하고 간단하다.
가 있던 는 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★index.html
「」를 사용하고 , 의 파일이 .static_url_path
★★★★★★★★★★★★★★★★★」static_folder
.
제 해결책은 다음과 같습니다.
import os
from flask import Flask, send_from_directory
from flask.helpers import safe_join
app = Flask(__name__)
static = safe_join(os.path.dirname(__file__), 'static')
@app.route('/')
def _home():
return send_from_directory(static, 'index.html')
@app.route('/<path:path>')
def _static(path):
if os.path.isdir(safe_join(static, path)):
path = os.path.join(path, 'index.html')
return send_from_directory(static, path)
은 다 , 것은 기능만 이에요.send_file
플라스크에서.host:port/ApiName이 브라우저에 파일의 출력을 표시할 때 html 파일을 응답으로 전송해야 하는 경우 이 방법은 잘 작동합니다.
@app.route('/ApiName')
def ApiFunc():
try:
return send_file('some-other-directory-than-root/your-file.extension')
except Exception as e:
logging.info(e.args[0])```
가장 간단한 방법은 주 프로젝트 폴더 내에 정적 폴더를 생성하는 것입니다..css 파일을 포함하는 정적 폴더.
메인폴더
/Main Folder
/Main Folder/templates/foo.html
/Main Folder/static/foo.css
/Main Folder/application.py(flask script)
정적 및 템플릿 폴더와 플라스크 스크립트를 포함하는 메인 폴더 이미지
플라스크
from flask import Flask, render_template
app = Flask(__name__)
@app.route("/")
def login():
return render_template("login.html")
html(필수)
<!DOCTYPE html>
<html>
<head>
<title>Project(1)</title>
<link rel="stylesheet" href="/static/styles.css">
</head>
<body>
<header>
<div class="container">
<nav>
<a class="title" href="">Kamook</a>
<a class="text" href="">Sign Up</a>
<a class="text" href="">Log In</a>
</nav>
</div>
</header>
{% block body %}
{% endblock %}
</body>
</html>
html
{% extends "layout.html" %}
{% block body %}
<div class="col">
<input type="text" name="username" placeholder="Username" required>
<input type="password" name="password" placeholder="Password" required>
<input type="submit" value="Login">
</div>
{% endblock %}
스태틱 파일의 URL은 스태틱엔드포인트를 사용하여 다음과 같이 작성할 수 있습니다.
url_for('static', filename = 'name_of_file')
<link rel="stylesheet" href="{{url_for('static', filename='borders.css')}}" />
모든 "템플릿" 는 "를합니다..html
등의 및 하는 "static" 폴더 "jinja2" "static")입니다..js
.css
★★★★★★★★★★★★★★★★★」
고객님의 고객명routes
, 을 사용할 수 .render_template()
파일을 설명한 와 같이 으로는 템플릿파일은 「」에 됩니다).templates
folder)를 선택합니다. .에는 .html과 같은 파일)을 할 수 ..js
. 파일css" 이 파일을 템플릿 할 수 것 .css ".css" 입니다.따라서 어떻게 이 정적 파일을 현재 템플릿 파일에 링크할 수 있는지 궁금할 것 같습니다.
고 할 " " " 를 사용할 수 .app.open_resource()
은, 「파일을 읽는 것」과 같이
with app.open_resource('/static/path/yourfile'):
#code to read the file and do something
정적 디렉토리 내에서 create templates 디렉토리를 작성하면 css 및 javascript를 위한 별도의 디렉토리를 모두 추가할 수 있습니다.이는 플라스크가 템플릿디렉토리 내에 있는 모든 html 파일을 처리 또는 인식하기 때문입니다.
static -
|_ templates
|_ css
|_javascript
|_images
이것이 나에게 효과가 있었다.
import os
from flask import Flask, render_template, send_from_directory
app = Flask(__name__)
root = os.path.join(os.path.dirname(os.path.abspath(__file__)), "whereyourfilesare")
@app.route('/', methods=['GET'])
def main(request):
path = request.path
if (path == '/'):
return send_from_directory(root, 'index.html')
else:
return send_from_directory(root, path[1:])
제 경우 사용자가 정적 폴더에 있는 모든 파일에 액세스할 수 있어야 했고, 또한 공통 HTML 코드를 템플릿에 넣고 코드를 재사용할 수 있도록 일부 html 파일에 템플릿을 사용해야 했습니다.이 두 가지를 함께 달성한 방법은 다음과 같습니다.
from flask import Flask, request, render_template
from flask.json import JSONEncoder
app = Flask(__name__, template_folder='static')
@app.route('/<path:path>')
def serve_static_file(path):
# In my case, only html files are having the template code inside them, like include.
if path.endswith('.html'):
return render_template(path)
# Serve all other files from the static folder directly.
return app.send_static_file(path)
그리고 모든 파일은 메인 플라스크 파일과 평행한 정적 폴더에 보관됩니다.
예를 들어, 사용한 Adsense 파일을 반환하려면 다음 절차를 따릅니다.
@app.route('/ads.txt')
def send_adstxt():
return send_from_directory(app.static_folder, 'ads.txt')
언급URL : https://stackoverflow.com/questions/20646822/how-to-serve-static-files-in-flask
'programing' 카테고리의 다른 글
구성 요소 소품을 map에 전달할 수 있습니까?Getters vuex (0) | 2023.01.14 |
---|---|
이 옵션을 사용할 때 유형 'Vue'에 속성 X가 없습니다.$parent.someProporMethod 및 이것.$root.someProporMethod (0) | 2023.01.14 |
Pylint 경고를 비활성화하려면 어떻게 해야 합니까? (0) | 2023.01.14 |
클래스 내에서 정적 메서드를 호출할 수 있습니까? (0) | 2023.01.14 |
멀티레벨 어레이를 사람이 읽을 수 있는 형식으로 출력하려면 어떻게 해야 합니까? (0) | 2023.01.14 |