Làm cách nào để kết xuất đầu ra jinja2 thành một tệp bằng Python thay vì Trình duyệt


85

Tôi có một mẫu jinja2 (tệp .html) mà tôi muốn hiển thị (thay thế các mã thông báo bằng các giá trị từ tệp py của tôi). Tuy nhiên, thay vì gửi kết quả được hiển thị đến trình duyệt, tôi muốn ghi nó vào một tệp .html mới. Tôi sẽ tưởng tượng giải pháp cũng sẽ tương tự cho một mẫu django.

Tôi có thể làm cái này như thế nào?

Câu trả lời:


129

Còn những thứ như thế này thì sao?

from jinja2 import Environment, FileSystemLoader
env = Environment(loader=FileSystemLoader('templates'))
template = env.get_template('test.html')
output_from_parsed_template = template.render(foo='Hello World!')
print(output_from_parsed_template)

# to save the results
with open("my_new_file.html", "w") as fh:
    fh.write(output_from_parsed_template)

test.html

<h1>{{ foo }}</h1>

đầu ra

<h1>Hello World!</h1>

Nếu bạn đang sử dụng một khuôn khổ, chẳng hạn như Flask, thì bạn có thể thực hiện việc này ở cuối chế độ xem của mình, trước khi quay lại.

output_from_parsed_template = render_template('test.html', foo="Hello World!")
with open("some_new_file.html", "wb") as f:
    f.write(output_from_parsed_template)
return output_from_parsed_template

Cảm ơn bạn đã phản hồi nhanh chóng. Nếu tôi hiểu đúng, thì đến đoạn trích đầu tiên của bạn: từ jinja2 import Environment, FileSystemLoader env = Environment (loader = FileSystemLoader ('templates')) template = env.get_template ('test.html') output_from_parsed_template = template.render (foo = 'Hello World!') Print output_from_parsed_template Tôi có thể thay thế dòng in bằng một số loại dòng ghi tệp. Đúng không? Một dòng như vậy để ghi vào một tệp có thể trông như thế nào? Re. Flask, đây là một phần nhỏ của ứng dụng lớn hơn, vì vậy tôi không biết liệu mình có thể sử dụng một khuôn khổ hay không.
Bill G.

Cảm ơn bạn đã làm rõ. Cuối cùng tôi đã có cơ hội để thử điều này. Ban đầu, tôi gặp lỗi "Không có tệp hoặc thư mục như vậy: 'my_new_file.html'". Rõ ràng tệp đã phải tồn tại. Sau đó, tôi đã sao chép tệp mẫu và đổi tên nó thành 'my_new_file.html'. Bây giờ tôi gặp lỗi: IOError: Tệp không mở để ghi. Điều này có thể là do tôi đang phát triển trong Google App Engine?
Bill G.

@BillG. Không, đó là lỗi từ phía tôi. Hãy thử thay đổi ở trên: đã thay đổi rbthành wb.
sberry

Cảm ơn đã phản ứng nhanh chóng. Tôi đã thay đổi rb thành wb và bây giờ tôi nhận được lỗi sau: IOError: chế độ không hợp lệ: wb
Bill G.

Còn thiếu )ở cuối dòng đầu tiên trong phần mã dưới cùng. Tôi đã cố gắng thêm nó, nhưng SO yêu cầu chỉnh sửa phải> 6 ký tự (giới hạn ngu ngốc) ..
egeland


8

Vì vậy, sau khi bạn đã tải mẫu, bạn gọi kết xuất và sau đó ghi kết quả đầu ra vào một tệp. Câu lệnh 'with' là một trình quản lý ngữ cảnh. Bên trong thụt đầu dòng, bạn có một tệp đang mở giống như đối tượng được gọi là 'f'.

template = jinja_environment.get_template('CommentCreate.html')     
output = template.render(template_values)) 

with open('my_new_html_file.html', 'w') as f:
    f.write(output)

Vì vậy, điều này sẽ trông giống như: TEMPLATE_DIR = os.path.join (os.path.dirname ( tệp ), 'mẫu') jinja_enosystem = \ jinja2.Enosystem (autoescape = False, loader = jinja2.FileSystemLoader (TEMPLATE_DIR)) mẫu = jinja_enosystem.get_template ('CommentCreate.html') self.response.out.write (template.render (template_values)) với mở ('my_new_html_file.html', 'w') dưới dạng f: f.write (response.content) nơi template_values ​​đã được điền. Vui lòng sửa nếu cần. Cảm ơn.
Bill G.

Cảm ơn bạn đã làm rõ. Cuối cùng tôi đã có cơ hội để thử điều này. Ban đầu, tôi gặp lỗi "Không có tệp hoặc thư mục như vậy: 'my_new_file.html'". Rõ ràng tệp đã phải tồn tại. Sau đó, tôi đã sao chép tệp mẫu và đổi tên nó thành 'my_new_file.html'. Bây giờ tôi gặp lỗi: IOError: Tệp không mở để ghi. Điều này có thể là do tôi đang phát triển trong Google App Engine?
Bill G.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.