2012-12-01 28 views
7

Vì vậy, tôi có định tuyến yêu cầu trước cho mô-đun người dùng của mình. Nhưng bây giờ tôi muốn truy cập g.users từ các bản thiết kế khác. Tôi tìm thấy cách duy nhất để làm điều đó, là sao chép mã bên dưới vào từng bản thiết kế.Tôi nên đặt kế hoạch chi tiết của tôi ở đâu trước số

Tôi đã thử đặt nó trong app.py của mình cho @ app.before_request, nhưng sau đó bạn có lỗi vì bạn phải nhập phiên, g, Người dùng và sau đó bạn vẫn nhận được lỗi _requestglobal ở những nơi khác.

@app.before_request 
def before_request(): 
    g.user = None 
    if 'user_id' in session: 
    g.user = User.query.get(session['user_id']); 

Nơi tốt nhất để đặt nó là gì?

tôi nhận được rất nhiều:

AttributeError: '_RequestGlobals' object has no attribute 'user' 
+1

'app.before_request' * should * work. Bạn có thể đăng một ví dụ về một nơi mà bạn sẽ nhận được 'AttributeError' khi sử dụng' app.before_request'? –

+0

Damnit, rõ ràng, tôi đã không thiết lập nó ngay trong ứng dụng @, tôi đã thêm chức năng nhưng quên sử dụng nó. Bây giờ nó có vẻ làm việc tốt với @app trong mỗi kế hoạch chi tiết duy nhất. Tôi nghĩ các bản thiết kế khác không nhìn thấy nó. – Dexter

Trả lời

3

Tôi nghĩ rằng bạn làm việc đó tốt bằng cách cố gắng khởi người dùng trong before_request, vấn đề là g đối tượng không có gì trước khi yêu cầu, vì vậy bạn cần phải đối phó với nó khác nhau . Đưa người dùng từ cookie vào before_request hầu hết có thể và sau đó thêm cookie vào phiên, từ đó có thể đến g. Tôi nghĩ rằng nó sẽ là giá trị để có một cái nhìn tại hoặc sử dụng Flask-đăng nhập. Hoặc chỉ cần read the code và có thể nó sẽ cung cấp cho bạn một số ý tưởng.

+0

tôi đã xem xét điều đó. Nhưng tôi không hiểu tại sao nó lại cần thiết vì tôi nghĩ bình đã tạo ra một cookie tự động để bảo vệ dữ liệu phiên. – Dexter

8

Buleprint.before_request được gọi trước mỗi yêu cầu trong kế hoạch chi tiết. Nếu bạn muốn gọi nó trước tất cả các bản thiết kế, vui lòng sử dụng before_app_request.

13

Một chút trễ ở đây nhưng:
Đây là những gì tôi làm:
Sử dụng biến Blueprint để thiết lập trước khi yêu cầu

myblueprint = Blueprint('myblueprint', __name__, template_folder="templates") 

def before_myblueprint(): 
    #code here 

myblueprint.before_request(before_myblueprint) 
1

Tôi thậm chí sau đây, nhưng incrementing về câu trả lời của Johnston , bạn cũng có thể sử dụng cùng một trang trí before_request, ví dụ:

bp_v1 = Blueprint('api_v1', __name__) 

@bp_v1.before_request 
def before_anything(): 
    pass 
Các vấn đề liên quan