2011-02-02 47 views
7

Tôi chỉ đang học Python & Django. (Cảm ơn tất cả những người đóng góp ở đây - đó là một nguồn tài nguyên vô giá!)Liệt kê nội dung tệp thư mục trong mẫu Django

Một điều đơn giản mà tôi đang gặp phải là hiển thị danh sách các tệp tĩnh đơn giản (nói nội dung của một thư mục lưu trữ trên máy chủ) dưới dạng danh sách các liên kết có thể tải xuống. Cho dù đây là an toàn hay không là một câu hỏi khác, nhưng cho rằng tôi muốn làm điều đó ...

bài này đã giúp chỉ đạo cho tôi đi đúng hướng: Python directory list returned to Django template

Đoạn mã này xuất ra tên tập tin trong 'myfiles' nếu chạy từ lời nhắc:

path= os.path.dirname(os.path.abspath(__file__)) 
myfiles = os.path.join(path, 'myfiles') 
os.chdir(myfiles) 
for files in os.listdir("."): 
    print files 

Nhưng làm cách nào để chuyển các tệp này vào mẫu Django và tạo danh sách liên kết? Tôi nghĩ rằng tôi có thể phải tạo một từ điển Python/tuple của một số loại để làm cho nó iterable, vượt qua nó như là một biến mẫu và render nó trong một vòng lặp for?

Tôi có phải thêm mục nhập vào tệp urls.py của mình để thực hiện tác phẩm này không? Một cái gì đó như thế này?

(r'^myfiles/(?P<path>.*)$', 'django.views.static.serve', {'document_root': os.path.join(os.path.dirname(__file__), 'myfiles'), 'show_indexes': True}), 

Cảm ơn sự giúp đỡ của bạn! Tôi chỉ đang học và tôi không thể tìm ra cách thực hiện điều này từ các đoạn mã hiện có trực tuyến.

EDIT: Đây là những gì tôi đã có trong views.py của tôi: (bạn sẽ nhận thấy từ '\\' mà tôi đang trên một hệ thống Windows)

def myfiles_page(request): 
    path = os.path.dirname(os.path.abspath(__file__)) 
    myfiles = os.path.join(path, 'myfiles\\') 
    os.chdir(myfiles) 
    x = 0 
    d = {} 
    for file in os.listdir("."): 
     d[x] = (myfiles + file) 
     x = x + 1 

    variables = RequestContext(request, { 
    'user' : request.user, 
    'filedict' : d, 
    }) 
    return render_to_response('myfiles_page.html', variables) 

Đây là cách tôi đã cố gắng để làm cho nó hiển thị trong một khuôn mẫu: (theo Django documentation)

{% for key, value in filedict %} 
    {{ key }}: {{ value }} 
{% endfor %} 

Nhưng 'filedict' vẫn không hiển thị bất cứ điều gì trong mẫu. Bất kỳ ý tưởng?

Trả lời

12

Có điều gì đó không giống như vậy, tôi nghĩ.

Có thể bạn sẽ cần phải tạo một hàm của riêng bạn bên trong views.py - xem hướng dẫn.

Chức năng đó sẽ nhận danh sách tệp từ os.listdir vào danh sách.

Chuyển danh sách đó trong ngữ cảnh tới mẫu và thực hiện render_to_response với mẫu bạn đã viết - xem hướng dẫn.

Trong mẫu, sau đó một cái gì đó của nó như:

{% for file in filelist %} 
    {{ file }} 
{% endfor %} 

Bạn có thể vượt qua bất cứ điều gì trong bối cảnh một mẫu. Bạn có thể muốn chuyển một danh sách các tập tin được tăng cường với các URL - một danh sách các dicts, trong đó mỗi dict có một tên và một url. Sau đó, mẫu của bạn là:

{% for file in filelist %} 
    <a href="{{file.url}}">{{ file.name }}</a> 
{% endfor %} 

BIG FAT AN SINH CẢNH BÁO

Đừng để người dùng duyệt các file bằng cách cho phép họ đặt một đường dẫn trong URL, ít nhất là không phải không có thực sự thực sự kiểm tra rằng họ không thể làm được các công cụ như /myfiles/../../notmyfiles/secret.txt và xem các tệp người khác chỉ bằng cách gắn các dấu chấm trong đường dẫn lên trên.

Nếu bạn không hiểu điều đó, thì bạn có lẽ không nên mã hóa điều này lên trên bất cứ điều gì nhưng một hệ thống đồ chơi mà bạn không nhớ bị xé thành từng mảnh!

+7

+1 cho cảnh báo bảo mật chất béo lớn. –

+0

Cảm ơn phản hồi Spacedman - nhưng phần khó nhất đối với tôi là viết chức năng views.py để xây dựng danh sách các dicts từ os.listdir, trong đó mỗi dict có một tên và một url. Tôi biết nó cơ bản, nhưng có ý tưởng nào không? – fieryred

+0

Những gì tôi đã kết thúc với: def create_filedict (thư mục): \t x = 0 \t d = {} \t for file in os.listdir (thư mục): \t \t d [x] = (file) \t \t x = x + 1 \t trả về {'dict': d, 'size': x} – fieryred

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