Flask에서 정적 파일을 제공하는 방법
P粉754473468
2023-08-23 15:50:41
<p>그래서 부끄러운 일이네요. 저는 <code>Flask</code>에 앱을 구성했으며 현재는 CSS 및 JS에 대한 링크가 포함된 정적 HTML 페이지만 제공하고 있습니다. <code>Flask</code> 문서에서 정적 파일 반환을 설명하는 위치를 찾을 수 없습니다. 예, <code>render_template</code>을 사용할 수 있지만 데이터가 템플릿화되지 않은 것으로 알고 있습니다. <code>send_file</code> 또는 <code>url_for</code>가 정확하다고 생각하지만 작동시킬 수 없습니다. 그동안 파일을 열고 내용을 읽은 다음 적절한 mimetype을 사용하여 <code>Response</code>를 설정합니다. </p>
<pre class="brush:php;toolbar:false;">os.path 가져오기
플라스크 가져오기 플라스크, 응답에서
앱 = 플라스크(__name__)
app.config.from_object(__name__)
def root_dir(): # pragma: 덮개 없음
os.path.abspath(os.path.dirname(__file__))을 반환합니다.
def get_file(filename): # pragma: 표지 없음
노력하다:
src = os.path.join(root_dir(), 파일명)
# 플라스크가 정적 파일을 어떻게 반환하는지 알아봅니다.
#시험을 마친:
# - 렌더_템플릿
# - send_file
# 너무 뻔해선 안 된다
open(src).read()를 반환합니다.
예외로 IOError를 제외하고:
str(exc)를 반환합니다.
@app.route('/', 메소드=['GET'])
defmetrics(): # pragma: 표지 없음
콘텐츠 = get_file('jenkins_analytics.html')
응답(content, mimetype="text/html") 반환
@app.route('/', defaults={'path': ''})
@app.route('/<경로:경로>')
def get_resource(path): # pragma: 표지 없음
마임타입 = {
".css": "텍스트/css",
".html": "텍스트/html",
".js": "응용 프로그램/자바스크립트",
}
Complete_path = os.path.join(root_dir(), 경로)
ext = os.path.splitext(경로)[1]
mimetype = mimetypes.get(ext, "text/html")
내용 = get_file(완전_경로)
응답(content, mimetype=mimetype) 반환
if __name__ == '__main__': # pragma: 표지 없음
app.run(port=80)</pre>
<p>이에 대한 코드 샘플이나 URL을 제공하고 싶은 분 계시나요? 나는 그것이 매우 간단할 것이라는 것을 알고 있었다. </p>
정적 파일의 위치를 이동하려는 경우 가장 쉬운 방법은 생성자에서 경로를 선언하는 것입니다. 아래 예에서는 템플릿과 정적 파일을
으아아아web
라는 하위 폴더로 이동했습니다.static_url_path=''
URL에서 이전 경로를 모두 제거하세요.static_folder='web/static'
폴더에 있는 모든 파일을 제공합니다.web/static
정적 파일로.template_folder='web/templates'
마찬가지로 이렇게 변경됩니다. 템플릿 폴더.이 방법을 사용하면 다음 URL이 CSS 파일을 반환합니다.
으아아아마지막으로 폴더 구조의 스냅샷은 다음과 같습니다. 여기서
flask_server.py
는 Flask 인스턴스입니다.프로덕션에서는 정적 폴더의 요청을 처리하도록 애플리케이션 앞에 HTTP 서버(Nginx, Apache 등)를 구성합니다. 전용 웹 서버는 정적 파일을 효율적으로 제공하는 데 매우 뛰어나지만, 낮은 볼륨에서는 Flask와 비교하여 차이를 느끼지 못할 수도 있습니다.
Flask가 자동으로 하나를 생성합니다/static
또한/static/
路由,该路由将为 Python 旁边的static
文件夹下的任何filename
提供服务定义 Flask 应用程序的模块。使用url_for
链接到静态文件:url_for('static', filename='js/analytics.js')
사용자가 제공한 경로와 함께send_from_directory
을 사용하여 자신의 경로 내의 디렉터리에서 파일을 제공할 수도 있습니다. 이는 기본 디렉터리와 경로를 사용하고 사용자가 제공한 경로가 안전하게 허용될 수 있도록 해당 디렉터리 내에 경로가 포함되어 있는지 확인합니다. 이는 파일을 제공하기 전에 로그인한 사용자에게 권한이 있는지 여부 등을 확인하려는 경우 유용할 수 있습니다. 으아아아send_file
또는send_static_file
을 사용하지 마세요. 이렇게 하면 디렉터리 순회 공격 에 노출됩니다.
send_file
或send_static_file
与用户提供的路径一起使用。这将使您面临目录遍历攻击。send_from_directory
알려진 디렉터리에 대한 사용자 제공 경로를 안전하게 처리하도록 설계되었으며, 경로가 디렉터리를 벗어나려고 시도하면 오류가 발생합니다.파일 시스템에 쓰지 않고 메모리에 파일을 생성하는 경우
send_file
BytesIO
对象传递给send_file
将其作为文件提供。在这种情况下,您需要将其他参数传递给send_file
파일로 제공해주세요. 이 경우 파일 이름이나 콘텐츠 유형 등을 추론할 수 없으므로send_file
에 추가 매개변수를 전달해야 합니다.