programing

플라스크에서 정적 파일을 처리하는 방법

copysource 2023. 1. 14. 10:36
반응형

플라스크에서 정적 파일을 처리하는 방법

래서부부 부부부다다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>의 ""를 "filenamestatic플라스크 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 가지고 있다htmlfilename을 클릭합니다.

를 합니다.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()파일을 설명한 와 같이 으로는 템플릿파일은 「」에 됩니다).templatesfolder)를 선택합니다. .에는 .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

반응형