2012-04-13 35 views
14

Đây là một mẫu lốc xoáy (ví dụ trong file logout.html) Tôi hiển thị trên một lỗi trong quá trình logout:Xử lý một mẫu biến không xác định trong Tornado

{% if logout_error %} 
    Oops! The logout failed. Please close all open documents and try again 
    {% end %} 

này có thể được gọi bằng

self.render("logout.html", logout_error=True) 

Nếu logout là thành công, tôi phải làm

self.render("logout.html", logout_error=False) 

Nếu tôi bỏ qua logout_error=False, tôi nhận được

NameError: global name 'logout_error' is not defined 

Nếu có nhiều cờ (sai), đối số từ khóa có thể chồng chất lên. Có cách nào tôi có thể yêu cầu mẫu để xem xét logout_errorFalse nếu nó không tồn tại?

Trả lời

16

Hacking xung quanh bằng cách sử dụng locals().get() là một cách để thực hiện điều đó. Một, chính thống hơn một chút là sử dụng try. Tornado mẫu hỗ trợ nó, vì vậy bạn có thể:

{% try %} 
    {% if logout_error %} 
    Oops! The logout failed. Please close all open documents and try again 
    {% end %} 
{% except %} 
{% end %} 
+1

vartec, Cảm ơn câu trả lời của bạn. Tôi sẽ đánh dấu câu trả lời của phihag là chính xác (mặc dù của bạn là tốt) do ngắn gọn của nó –

+1

Điều này có vẻ như giải pháp tốt hơn cho tôi, đặc biệt là sau khi đọc câu chuyện bán thận trọng về người dân địa phương() http: // stackoverflow. com/questions/1550479/python-is-using-vars-locals-a-good-practice. (Django mẫu không âm thầm theo mặc định, phải không?) – jsh

+1

Đối với một số lý do tôi không bao giờ có 'người dân địa phương(). Get()' để làm việc. Giải pháp của bạn hoạt động tốt mặc dù. Cảm ơn bạn! +1 – Micke

14

Bạn có thể sử dụng

{% if locals().get('logout_error', False) %} 

thay False với giá trị mà bạn muốn nếu tài sản không được thiết lập.

+2

Như điểm @shenyan ra dưới đây, dưới một số trường hợp (đối với tôi, nếu bạn vượt qua trong các biến để mẫu với 'render') các biến của bạn kết thúc trong' globals', không 'người dân địa phương'. Tôi không chắc liệu có an toàn khi dựa vào hành vi này không - thảo luận thêm một chút ở đây: https://groups.google.com/forum/#!topic/python-tornado/MppS69GjZk0. Câu trả lời try/catch là xấu xí nhưng có tính đàn hồi cao hơn. – tobek

1

{.% Nếu người dân địa phương() nhận được ('logout_error', False)%} không hoạt động vì các biến không được thông qua như trong kwargs **;

{% nếu globals(). Has_key ('logout_error')%} hoạt động với tôi vì biến của tôi được chuyển riêng, https://groups.google.com/forum/#!topic/python-tornado/dyl50NO3yzE trang này có nhiều sự cố hơn về vấn đề này.

0

Cách "Tornado" không có biến không khai báo. Đó là nhiều zen để khai báo các biến rõ ràng.

Cách giải quyết:

{% if 'grok' in globals() %} 
    {{grok}} 
{% end %} 

{% if globals().get('grok_error', False) %} 
    error message 
{% end %} 
Các vấn đề liên quan