2012-11-17 15 views
19

Giống như câu hỏi này: Best way to make Django's login_required the defaultCách tốt nhất để làm cho Flask-Login của login_required mặc định

Tôi đang sử dụng Flask-Login 's login_required trang trí bây giờ. Có cách nào để biến nó thành hành vi mặc định trong Flask?

+0

Có lẽ bạn có thể ghi đè lên một số chức năng như full_dispatch_request() và thực hiện logic ở đó, sau đó gọi xem thực nếu xác thực được thông qua. Thông tin thêm về chức năng này và các chức năng API khác (nơi bạn có thể tìm thấy hàm bạn cần) http://flask.pocoo.org/docs/api/#flask.Flask.full_dispatch_request Hoặc trước hết bạn có thể thử trang trí trước, nhưng không chắc chắn nếu bạn sẽ có tất cả dữ liệu cần thiết trong trạng thái đó. Đã không làm điều này bản thân mình, vì vậy xin lỗi không thể đưa ra câu trả lời chính xác hơn hoặc ví dụ mã. –

+0

Bạn có thể làm rõ ý nghĩa của "hành vi mặc định" không? Bạn có nghĩa là tất cả các chức năng xem nên có login_required theo mặc định? – codegeek

+0

@codegeek có, ngoại trừ một số chế độ xem được liệt kê trắng mà tôi có thể xác định trong tệp cấu hình của mình. – yegle

Trả lời

28

Tôi đã làm điều này trong dự án instruments tôi. Tôi sử dụng before_request trang trí:

@app.before_request 
def check_valid_login(): 
    login_valid = 'user' in session # or whatever you use to check valid login 

    if (request.endpoint and 
     'static' not in request.endpoint and 
     not login_valid and 
     not getattr(app.view_functions[request.endpoint], 'is_public', False)) : 
     return render_template('login.html', next=request.endpoint) 

và sau đó tôi đã tạo ra một trang trí is_public() cho số ít những nơi mà sẽ cần phải có thể truy cập mà không cần đăng nhập:

def public_endpoint(function): 
    function.is_public = True 
    return function 
+1

Tôi nghĩ 'tĩnh' không request.endpoint là không hoàn toàn đúng - có lẽ cái gì đó như request.endpoint == 'tĩnh', hoặc request.endpoint.startswith ('tĩnh /')? – nonagon

+0

Tại sao bạn đã kiểm tra 'request.endpoint' –

5

Nếu bạn đang sử dụng bản thiết kế và cần phải bảo vệ một toàn bộ kế hoạch chi tiết với thông tin đăng nhập, bạn có thể tạo toàn bộ số before_request để yêu cầu đăng nhập.

Đây là những gì tôi sử dụng cho kế hoạch chi tiết CMS của tôi:

@cms.before_request 
@login_required 
def before_request(): 
    if g.user.role != ROLE_ADMIN: 
     abort(401) 

Nếu bạn chỉ cần kiểm tra nếu người dùng đang đăng nhập (và không nếu người dùng có đặc quyền), bạn có thể chỉ đơn giản là pass chức năng

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