2012-07-21 25 views
14

Tôi cần phân phối một số tệp tĩnh cấp gốc trên Heroku (ví dụ: domain.com/favicon.ico). Dưới đây là danh sách các tệp như hiện tại:Cung cấp các tệp tĩnh cấp gốc trên Heroku với Django?

favicon.ico 
crossdomain.xml 
sitemap.xml 
robots.txt 
humans.txt 
apple-touch-icon-57x57-precomposed.png 
apple-touch-icon-57x57.png 
apple-touch-icon-72x72-precomposed.png 
apple-touch-icon-72x72.png 
apple-touch-icon-114x114-precomposed.png 
apple-touch-icon-114x114.png 
apple-touch-icon-precomposed.png 
apple-touch-icon.png 

Tôi đã tìm kiếm cao và thấp và không thể tìm cách tiêu chuẩn để phân phát một tập hợp lớn các tệp tĩnh. Bất cứ nơi nào tôi lưu trữ chúng (trên Heroku với collectstatic hoặc Amazon S3), xác định rõ ràng và chuyển hướng 14 tệp trong url của tôi có vẻ không chính xác.

+0

Vì vậy, vấn đề chính của bạn là gì: bạn không thể tải tệp vào heroku/S3 hoặc đặt url chính xác cho tài nguyên này? – nk9

+0

@ b1-Đặt URL chính xác. – knite

+0

thử hướng dẫn sử dụng này [blog1] (http://matthewphiong.com/managing-django-static-files-on-heroku) [blog2] (http://www.iknuth.com/2011/10/deploying-a- django-app-to-heroku-với-dễ-tĩnh-tệp-trên-s3 /). Được ware Tôi nghĩ rằng đó là cho django 1.3. Nếu nó không giúp bạn đăng 'settings.py'. – nk9

Trả lời

1

Tôi không tìm thấy bất kỳ tệp cấu hình url nào, vì vậy tôi nghĩ heroku không cung cấp dịch vụ này.

Và theo official docs bạn cần lưu dữ liệu của bạn trên các dịch vụ bên ngoài

EDIT:

Vì vậy, theo tài liệu Heroku chỉ 301 chuyển hướng đến S3 có thể giúp bạn. Hoặc thậm chí tốt hơn cho tất cả các tệp phương tiện (ico, favicons, png và hình ảnh khác) trong các mẫu thiết lập đường dẫn tuyệt đối cho các dịch vụ S3 và cho rô bốt và crossdomain.xml trong urls.py đặt 301 chuyển hướng đến S3. Để sử dụng sitemap.xml tốt hơn sử dụng native solutions

Không sai khi sử dụng mã chuyển hướng phù hợp trong quá trình phát triển.

+0

Câu hỏi của tôi nói rằng tôi đang sử dụng một dịch vụ bên ngoài (Amazon S3). Tôi đang hỏi về cách tốt nhất để phục vụ các tệp (ví dụ: urls.py). – knite

+0

Tôi chỉ chỉnh sửa câu trả lời của mình. Bạn có cần mã hoặc giải pháp trừu tượng tốt quá? ;) – nk9

4

Đây là giải pháp hiện tại của tôi. Phản hồi được đánh giá cao.

from django.contrib.staticfiles.urls import staticfiles_urlpatterns 
from settings import STATIC_URL, ASSETS, DEBUG, AWS_STORAGE 

#ASSETS is a tuple: ('favicon.ico, 'robots.txt', ...)  
urls = [('^%s$' % f, 'redirect_to', {'url': STATIC_URL + f}) for f in ASSETS] 
urlpatterns += patterns('django.views.generic.simple', *urls) 

#Serve static files from runserver if in dev mode with S3 off. 
if DEBUG and not AWS_STORAGE: 
    urlpatterns += staticfiles_urlpatterns() 
+0

Cho rằng tôi có lẽ sẽ không có nhiều tài sản gốc, tôi nghĩ rằng giải pháp này là đủ tốt. –

1

Mặc dù đây là câu hỏi cũ nhưng tôi vẫn gặp sự cố. Tôi thích cách các URL được tạo ra từ một danh sách trong giải pháp hiện tại, nhưng tôi đã không tin rằng đó là tốt nhất.

Sau một chút nghiên cứu, tôi thấy realfavicongenerator.net là một tài nguyên rất hữu ích tạo ra tất cả các tệp yêu cầu cho bạn và tôi đã được một đồng nghiệp hỗ trợ giải pháp đề xuất, với phiên bản Django mới hơn .

Dựa trên tất cả các bên trên, giải pháp của tôi là sử dụng khuôn khổ sitemap bản xứ, django-robots cho robots.txt và một từ điển ROOT_ASSETS, với các tập tin tiền tố như chìa khóa, và các giá trị như một danh sách các tập tin, ví dụ:

ROOT_ASSETS = { 
    "images/favicons/": [ 
     "apple-touch-icon-114x114.png", 
     "apple-touch-icon-120x120.png", 
     "apple-touch-icon-144x144.png", 
     "apple-touch-icon-152x152.png", 
     "apple-touch-icon-180x180.png", 
     "apple-touch-icon-57x57.png", 
     "apple-touch-icon-60x60.png", 
     "apple-touch-icon-72x72.png", 
     "apple-touch-icon-76x76.png", 
     "apple-touch-icon-precomposed.png", 
     "favicon.ico", 
    ] 
} 

Sau đó, tôi tạo ra các url của tôi với:

from django.conf.urls import patterns, url, include 
from django.contrib.staticfiles.storage import staticfiles_storage 

root_assets_urls = [] 
for prefix, files in ROOT_ASSETS.iteritems(): 
    for f in files: 
     asset_url = staticfiles_storage.url("{prefix}{file}".format(prefix=prefix, file=f)) 
     root_assets_urls.append(
      url(r'^{0}$'.format(f), RedirectView.as_view(url=asset_url)) 
     ) 
root_assets = patterns('', *root_assets_urls) 

urlpatterns = patterns(
    '', 
    url(r'^', include(root_assets)), 
    [...] 
) 

tôi cũng bao gồm cả HTML được tạo ra bởi realfavicongenerator.net trong đầu mẫu thạc sĩ của tôi.

Các vấn đề liên quan