2016-03-06 15 views
8

Trong ứng dụng Flask của tôi, tôi phân phát nội dung tĩnh thông qua ứng dụng trong env dev, nhưng tôi muốn sử dụng CDN trong sản xuất. Mỗi tài sản được nạp trong một mẫu gọi là base.hmtl, vì vậy tôi đoán là giải pháp đơn giản nhất là để vượt qua một biến để render chức năng và sử dụng nó trong các mẫu như:Cung cấp các tệp tĩnh từ CDN thay vì Flask trong sản xuất

<script src="{{ STATIC_URL }}/js/main.js"></script> 

Thông thường nó sẽ là một chuỗi rỗng trong dev env, và url cdn trong sản xuất. Tôi muốn tránh chuyển biến này STATIC_URL cho mỗi chế độ xem. Tôi có thể làm cho nó hoạt động với

@bp.context_processor 
def set_static_path(): 
    return dict(STATIC_URL='https://foo.bar.com') 

Nhưng đối với tôi điều này có vẻ hơi khó hiểu. Có cách nào tốt hơn để giải quyết vấn đề này không?

Trả lời

12

Không cần phải thay đổi cách bạn liên kết với tệp tĩnh, bạn vẫn có thể sử dụng url_for('static', filename='myfile.txt'). Thay thế chế độ xem tĩnh mặc định bằng chế độ xem chuyển hướng đến CDN nếu được định cấu hình.

from urllib.parse import urljoin 
# or for python 2: from urlparse import urljoin 
from flask import redirect 

@app.endpoint('static') 
def static(filename): 
    static_url = app.config.get('STATIC_URL') 

    if static_url: 
     return redirect(urljoin(static_url, filename)) 

    return app.send_static_file(filename) 

Cho dù bạn đang ở trên một máy dev hoặc sản xuất, thiết lập giá trị STATIC_URL config để CDN và yêu cầu cho các tập tin tĩnh sẽ được chuyển hướng đó.


Chuyển hướng tương đối rẻ và được ghi nhớ bởi trình duyệt. Nếu bạn đạt đến điểm mà hiệu suất bị ảnh hưởng bởi chúng, bạn có thể viết một hàm liên kết trực tiếp khi sử dụng CDN.

@app.template_global() 
def static_url(filename): 
    static_url = app.config.get('STATIC_URL') 

    if static_url: 
     return urljoin(static_url, filename) 

    return url_for('static', filename=filename) 

Trang trí template_global làm cho chức năng có sẵn trong tất cả các mẫu. Sử dụng nó thay vì url_for khi bạn cần url cho các tệp tĩnh.

2

Bình cdn integration guide có thể đáng để đọc qua. Về cơ bản, bạn có thể cài đặt Flask-CDN extension và xác định URL CDN của bạn trong tệp app.py như sau:

from flask import Flask 
from flask.ext.cdn import CDN 

app = Flask(__name__) 
app.config['CDN_DOMAIN'] = 'cdn.yourdomain.com' 
CDN(app) 
Các vấn đề liên quan