2011-10-15 35 views
9

Tôi đang cố gắng sử dụng dự án không liên quan Django cho công cụ ứng dụng của Google. Tôi thiết lập dự án thử nghiệm như được mô tả here. Tôi đã thêm một thư mục mới vào dự án có tên là "tĩnh" cho các tệp tĩnh của tôi. Và đối với tệp app.yaml tôi đã thêm các dòng;Cách sử dụng các tệp tĩnh với django nonrel

- url: /static 
static_dir: static 

Tôi không thể truy cập tệp tĩnh của mình. Tôi có phải thực hiện thêm cấu hình không?

Thx trước.

+0

Bạn có đang đưa mẫu của mình vào cơ hội nào không? –

Trả lời

10

app.yaml không liên quan gì đến Django, nhưng nó cấu hình giao diện người dùng của App Engine. Câu trả lời phụ thuộc vào việc bạn có muốn phân phát các tệp tĩnh với Django hay front-end (tức là, tốt, rẻ hơn và nhanh hơn).

Nếu bạn chỉ là "thêm vào" bản đồ - url: /static của bạn đến cùng, di chuyển nó trước các /.* ký tự đại diện. Vì tất cả các ánh xạ được xử lý từ trên xuống dưới - các bản đồ chiến thắng phù hợp đầu tiên.

4

Tôi cũng đã tìm ra. Chỉ cần sử dụng dòng static_dir trước main.py. Vì vậy, app.yaml sẽ trông như thế này;

application: test 
version: 1 
runtime: python 
api_version: 1 

builtins: 
- remote_api: on 

inbound_services: 
- warmup 

handlers: 
- url: /_ah/queue/deferred 
    script: djangoappengine/deferred/handler.py 
    login: admin 

- url: /_ah/stats/.* 
    script: djangoappengine/appstats/ui.py 

- url: /media/admin 
    static_dir: django/contrib/admin/media 
    expiration: '0' 

- url: /static 
    static_dir: static 

- url: /.* 
    script: djangoappengine/main/main.py 
13

Khi mọi người đã chỉ ra, bạn nên đặt chỉ static_dir của bạn trước khi /.* mẫu

Tuy nhiên, đó không phải là điều duy nhất bạn nên biết.

Bằng cách đặt chỉ thị này vào app.yaml, bạn tạo máy chủ web AppEngine (cho dù đó là máy chủ phát triển hoặc máy chủ sản xuất) xử lý đường dẫn /static và bạn cần tất cả các tệp tĩnh nằm trong thư mục tĩnh. Điều này có nghĩa bạn sẽ phải chạy python manage.py collectstatic mỗi khi bạn thay đổi bất cứ điều gì trong các tập tin tĩnh của bạn (đặc biệt là nếu bạn có các ứng dụng/sử dụng với các tập tin tĩnh - như, nói, admin hoặc django-tinymce) chỉ để kiểm tra những thay đổi trên máy chủ của địa phương

Vậy làm thế nào để tránh điều đó? Theo mặc định, các tệp tĩnh cung cấp các trình trợ giúp để phục vụ các tệp này trên máy chủ phát triển mà không cần chạy tập hợp mọi lúc, vấn đề là xung đột tên direcotry được mô tả trong đoạn trước: Django không thể bắt các yêu cầu tới đường dẫn tệp tĩnh của bạn, vì chúng được xử lý bởi máy chủ ứng dụng. Bạn có thể giải quyết nó bằng cách sử dụng các đường dẫn khác nhau trên máy chủ sản xuất và phát triển:

# in settings.py 
if DEBUG: 
    STATIC_URL = '/devstatic/' 
else: 
    STATIC_URL = '/static/' 

(djangoappengine đặt DEBUG thành True on development server). Bạn có thể để lại ADMIN_MEDIA_PREFIX = '/static/admin/', nhưng hãy nhớ để chạy collectstatic ít nhất một lần trước khi sử dụng quản trị

Tất nhiên nhớ để sử dụng {{ STATIC_URL }}path/to.css trong các mẫu thay vì /static/path/to.css

Oh, và tôi cho rằng bạn phân biệt các thư mục cho các tập tin tĩnh ban đầu bạn làm việc và thư mục chứa các tệp tĩnh. Tôi sử dụng này trong settings.py của tôi:

STATIC_ROOT = os.path.join(os.path.dirname(__file__), 'sitestatic') 
STATICFILES_DIRS = (
    os.path.join(os.path.dirname(__file__), 'static'), 
) 

Điều này có nghĩa: bạn đặt FIELS tĩnh của bạn thành static dir (và vào static dirs của ứng dụng), collectstatic thu thập chúng vào sitestatic dir.Thích hợp app.yaml chỉ là

- url: /static 
    static_dir: sitestatic 

Cuối cùng, bạn có thể cấu hình để bỏ qua app.yamlstaticmedia thư mục khi tải ứng dụng của bạn, vì tất cả các tập tin tĩnh sẽ được thu thập vào và phục vụ từ sitestatic. Tuy nhiên, bạn chỉ nên đặt tùy chọn này khi đang tải lên (nếu không các tệp này sẽ không khả dụng trong máy chủ gỡ lỗi)

+0

Bạn cũng có thể cần phải thêm các mẫu url trợ giúp của staticfiles và sử dụng templatetag 'tĩnh' cho các khuôn mẫu được hiển thị mà không có một RequestContext - xem [docs] (https://docs.djangoproject.com/en/dev/howto/static- các tập tin/). Ngoài ra, hãy đảm bảo rằng đường dẫn đến tệp tĩnh được cung cấp bởi trình trợ giúp dev tĩnh không khớp với bất kỳ mục nhập static_dir hoặc static_files nào trong app.yaml. GAE phân biệt các tệp 'tĩnh' và 'tập lệnh' và máy chủ ứng dụng của dev sẽ chặn Django tự động phân phát tệp mà nó cho là tĩnh - để phù hợp với sản xuất, nơi nó bị chặn vì lý do bảo mật. (GAE SDK 1.7.5) – jgiles

+1

đừng quên đặt chức năng trợ giúp tĩnh trong urls.py https://docs.djangoproject.com/en/dev/howto/static-files/#serving-static-files- trong giai đoạn phát triển – taelimoh

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