2012-02-25 38 views
13

Tôi đang cố gắng định tuyến lại tất cả nội dung của tôi/tĩnh để lưu trữ trên Amazon S3. Suy nghĩ đầu tiên của tôi là sử dụng cấu hình toàn cục ['path'] trong các mẫu jinja của tôi, nhưng điều này sẽ không hoạt động đối với các tệp css và js bên ngoài, cộng với nó là loại lộn xộn. Tôi tìm thấy static_folder và static_url_path phát hành ở 0,7 và điều này có vẻ như những gì tôi muốn. Tuy nhiên, khi tôi đi đến http://localhost:8000/static/img/abc.jpg nó không xác định vị trí các tập tin trên S3. Tôi có sử dụng tính năng này đúng không hoặc có cách nào khác để làm điều này không?Flask static_folder được lưu trữ trên S3

Cảm ơn!

Trả lời

1

những gì bạn đang cố gắng để thực hiện là để có thể viết

{{ url_for(app.static, file='img/abc.jpg', _external=True) }}

và có quyết tâm rằng đến một url trong s3?

tôi tin rằng static_folder và static_url_path được thiết lập để nếu bạn gọi

app = Application('app', static_folder='foo', static_url_path='bar')

sau đó sẽ

trên url_for sẽ ra

http://localhost:8000/bar/img/abc.jpg và nó sẽ tìm kiếm static/img/abc.jpg trong hệ thống tập tin.

tôi nghĩ rằng những gì bạn muốn làm là có khả năng viết một bộ lọc tùy chỉnh mà có thể dịch con đường của bạn đến một url s3 để bạn có thể làm một cái gì đó gọi như

{{ 'img/abc.jpg'|s3_static_url }}

có một số tài liệu trên đó đây : flask custom filters

0

Điều bạn cần là URL tệp công khai Amazon S3 thay vì http://localhost:8000/static/img/abc.jpg. Nếu chỉ một vài tệp, có thể mã hóa chúng trong mẫu của bạn bằng URL đầy đủ hoặc nếu bạn định dùng thử phiên bản cục bộ để thử nghiệm và sử dụng S3 trên trang web sản xuất (như chúng tôi) thì bạn có thể thử phương pháp sau.

Xác định biến mới có thể được gọi là STATIC_ROOT ở đầu mẫu cơ sở của bạn (các mẫu khác được kế thừa) và sử dụng làm tiền tố đường dẫn tệp.

Ví dụ:

{% if app.debug %} 
    {% set STATIC_ROOT = url_for('static', filename='') %} 
{% else %} 
    {% set STATIC_ROOT = 'http://s3.amazonaws.com/bucketname/' } 
{% endif %} 

này sẽ cung cấp cho bạn đường dẫn mặc định khi bạn có thể thử nghiệm ứng dụng của bạn tại địa phương, và url S3 công khi sản xuất (dựa trên debug cờ).

Sử dụng nó:

<script src="{{ STATIC_ROOT }}js/jquery.min.js">

+0

Xấu xí, không cần. Chỉ cần sử dụng bộ xử lý ngữ cảnh để đặt biến. –

6

Tôi muốn static_url_path luận các flask.Flask constructor của sẽ chấp nhận một URI đầy đủ, nhưng nó hét lên về con đường cần một dấu gạch chéo hàng đầu khi bạn cố gắng đó. Nếu nó chấp nhận nó, bạn chỉ có thể sử dụng url_for sau khi thiết lập static_url_path='http://my_s3_bucket.aws.amazon.com/' hoặc hơn.

Một giải pháp khả thi khác là sử dụng bộ xử lý ngữ cảnh. Tôi tin rằng đây là giải pháp sạch nhất, nhưng tôi không có nhiều kinh nghiệm với bình. Nó chắc chắn trông sạch sẽ.Bằng cách sử dụng một bộ xử lý ngữ cảnh, tôi kéo URL từ môi trường (tôi đang sử dụng heroku để nó rất dễ cài đặt). Sau đó, bộ xử lý ngữ cảnh làm cho biến static_url có sẵn trong các mẫu của tôi.

Trong app.py:

# Environment has STATIC_URL='http://my_s3_bucket.aws.amazon.com/' 
@app.context_processor 
def inject_static_url(): 
    """ 
    Inject the variable 'static_url' into the templates. Grab it from 
    the environment variable STATIC_URL, or use the default. 

    Template variable will always have a trailing slash. 

    """ 
    static_url = os.environ.get('STATIC_URL', app.static_url_path) 
    if not static_url.endswith('/'): 
     static_url += '/' 
    return dict(
     static_url=static_url 
    ) 

Trong mẫu:

<link rel="stylesheet" type="text/css" href="{{ static_url }}css/main.css" /> 

Kết quả

<link rel="stylesheet" type="text/css" href="http://my_s3_bucket.aws.amazon.com/css/main.css" /> 
8

Gần đây tôi đã devel đã mở một phần mở rộng Flask để đối phó với tình huống này. Nó được gọi là Flask-S3 và bạn có thể đọc tài liệu cho số here.

Như một ví dụ, đây là cách bạn sẽ tích hợp nó vào ứng dụng Flask của bạn:

from flask import Flask 
from flask_s3 import FlaskS3 

app = Flask(__name__) 
app.config['S3_BUCKET_NAME'] = 'mybucketname' 
s3 = FlaskS3(app) 

Bạn có thể sử dụng phần mở rộng để tải lên tài sản của bạn để xô chọn của bạn:

>>> from my_application import app 
>>> from flask_s3 import create_all 
>>> create_all(app) 

Flask- S3 là bản thiết kế chi tiết và sẽ tải lên tất cả nội dung được liên kết với bất kỳ bản thiết kế đã đăng ký nào.

0

Tôi biết đây là câu hỏi cũ nhưng đây là cách tôi giải quyết vấn đề này. phương pháp url_for

  • nhập Flask dưới một tên khác nhau (ví dụ, flask_url_for)
  • Tạo riêng tùy chỉnhurl_for phương pháp của bạn, trong đó kêu gọi flask_url_for và sau đó sử dụng thay thế chuỗi để thêm vào url S3 xô của bạn.

Tôi thích chiến lược này vì nó đơn giản và trực quan để sử dụng và giao diện chính xác như phương pháp url_for gốc.

from flask import url_for as flask_url_for 
from flask import current_app 

PRODUCTION_URL = 'https://s3.amazonaws.com/MY-BUCKET-NAME' 

def url_for(path, **kwargs): 
    url = flask_url_for(path, **kwargs) 
    if url.startswith("/static") and not current_app.debug: 
     url = url.replace("/static", "", 1) 
     return PRODUCTION_URL + url 
    return url 
Các vấn đề liên quan