2012-09-05 33 views
16

Tôi có tệp jinja_filters.py với một vài chục bộ lọc tùy chỉnh mà tôi đã viết. Bây giờ tôi có nhiều ứng dụng Flask cần sử dụng các bộ lọc này. (Tôi không chắc chắn nếu vấn đề của tôi là Flask cụ thể hay không.)Làm cách nào để nhập các bộ lọc jinja2 tùy chỉnh từ một tệp khác (và sử dụng Flask)?

Một cách hacky để hoàn thành những gì tôi muốn là để làm:

app = Flask(__name__) 

import jinja_filters 

@app.template_filter('filter_name1') 
def filter_name1(arg): 
    return jinja_filters.filter_name1(arg) 

@app.template_filter('filter_name2') 
def filter_name2(arg): 
    return jinja_filters.filter_name2(arg) 

... 

"quyền" cách để làm điều này là gì?

EDIT: Lý tưởng nhất, tôi sẽ không phải liệt kê từng tên bộ lọc. Vì vậy, khi tôi thêm một bộ lọc mới vào jinja_filters.py tôi không phải cập nhật bất kỳ mã nào khác - tất cả các ứng dụng của tôi sẽ có thể sử dụng nó ngay lập tức.

Trả lời

25

Trường hợp bạn đang thiết lập đối tượng ứng dụng của mình (app.py, có lẽ), bạn chỉ cần nhập bộ lọc tùy chỉnh của mình và sau đó sửa đổi thuộc tính môi trường Jinja.

import jinja_filters 

app = Flask(__name__) 
app.jinja_env.filters['filter_name1'] = jinja_filters.filter_name1 
app.jinja_env.filters['filter_name2'] = jinja_filters.filter_name2 

v.v.

Một khả năng khác là sử dụng các mô-đun inspect để tìm tất cả các phương pháp trong jinja_filters như vậy:

from inspect import getmembers, isfunction 
import jinja_filters 

app = Flask(__name__) 

my_filters = {name: function 
       for name, function in getmembers(jinja_filters) 
       if isfunction(function)} 

app.jinja_env.filters.update(my_filters) 

đang Đó là chưa được kiểm tra, nhưng ý tưởng là xây dựng một từ điển của tên hàm và chức năng mà tồn tại trong các tệp jinja_filters của bạn và sau đó cập nhật bộ lọc của từ điển với bộ lọc của môi trường Jinja.

+0

Đó chắc chắn là tốt hơn những gì tôi có. Nhưng có cách nào mà tôi không phải liệt kê rõ ràng từng tên bộ lọc? –

+0

Tôi đã cập nhật câu trả lời của mình bằng một giải pháp khác có thể tự động thêm bộ lọc bằng mô-đun 'kiểm tra'. – aezell

+1

Vâng, nó được hoàn thành công việc ổn :) Nhưng tôi vẫn không thể tin rằng các tác giả của Jinja2/Flask đã không có một cách gọn gàng hơn để làm điều này. (Tôi sẽ đánh dấu câu trả lời của bạn trong một vài ngày nếu không có ai khác chimes in.) –

28

Có cách được khuyến nghị để thực hiện việc này bằng cách sử dụng Flask blueprints. Một trong những trường hợp sử dụng của nó là chức năng này cụ thể là:

  • Cung cấp mẫu bộ lọc, các file tĩnh, mẫu, và các tiện ích khác thông qua bản thiết kế. Một kế hoạch chi tiết không phải thực hiện các ứng dụng hoặc chức năng xem.

Bạn chỉ cần tạo một đối tượng flask.Blueprint và sử dụng nó để đăng ký bộ lọc của bạn trong một cách tương tự như bạn làm với flask.Flask đối tượng ứng dụng, sử dụng Blueprint.app_template_filter trang trí hoặc Blueprint.add_app_template_filter phương pháp.

# filters.py 

import jinja2 
import flask 

blueprint = flask.Blueprint('filters', __name__) 

# using the decorator 
@jinja2.contextfilter 
@blueprint.app_template_filter() 
def filter1(context, value): 
    return 1 

# using the method 
@jinja2.contextfilter 
def filter2(context, value): 
    return 2 

blueprint.add_app_template_filter(filter2) 

Sau đó, bạn chỉ cần đăng ký kế hoạch chi tiết về đối tượng ứng dụng của bạn:

# app.py 

import flask 
import filters 

app = flask.Flask(__name__) 
app.register_blueprint(filters.blueprint) 

Và thì đấy, các bộ lọc đã được đăng ký.

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