Tôi đang cố gắng sử dụng flask.g
để lưu các biến có thể được truy cập trong các chức năng khác, nhưng dường như không hoạt động chính xác. Ứng dụng tạo ra lỗi sau khi tôi cố gắng truy cập g.name
: AttributeError: '_RequestGlobals' object has no attribute 'name'
.Không thể sử dụng flask.g để truy cập các biến trong các chức năng khác
Các documentation cho flask.g
nói:
Chỉ cần lưu trữ trên này bất cứ điều gì bạn muốn. Ví dụ một kết nối cơ sở dữ liệu hoặc người dùng hiện đang đăng nhập.
Dưới đây là một hoàn chỉnh, ví dụ tối thiểu để minh họa các lỗi mà tôi nhận được khi cố gắng truy cập các biến bên ngoài của hàm nó đã được tạo ra trong. Bất kỳ Trợ giúp sẽ được đánh giá cao.
#!/usr/bin/env python
from flask import Flask, render_template_string, request, redirect, url_for, g
from wtforms import Form, TextField
application = app = Flask('wsgi')
@app.route('/', methods=['GET', 'POST'])
def index():
form = LoginForm(request.form)
if request.method == 'POST' and form.validate():
name = form.name.data
g.name = name
# Need to create an instance of a class and access that in another route
#g.api = CustomApi(name)
return redirect(url_for('get_posts'))
else:
return render_template_string(template_form, form=form)
@app.route('/posts', methods=['GET'])
def get_posts():
# Need to access the instance of CustomApi here
#api = g.api
name = g.name
return render_template_string(name_template, name=name)
class LoginForm(Form):
name = TextField('Name')
template_form = """
{% block content %}
<h1>Enter your name</h1>
<form method="POST" action="/">
<div>{{ form.name.label }} {{ form.name() }}</div><br>
<button type="submit" class="btn">Submit</button>
</form>
{% endblock %}
"""
name_template = """
{% block content %}
<div>"Hello {{ name }}"</div><br>
{% endblock %}
"""
if __name__ == '__main__':
app.run(debug=True)
Sự cố khi sử dụng @ app.before_request trong trường hợp của tôi là tôi cần nhận thông tin về tên người dùng và mật khẩu từ người dùng để sử dụng magic_user_function() của mình. Tôi sẽ kiểm tra các mô-đun mà bạn đã đề cập. – Raj
Nghĩ rằng tôi sẽ theo dõi để cho bạn biết rằng đây là những gì tôi đã làm. Tôi đã phải viết lại wrapper của tôi để hỗ trợ phương pháp này, nhưng nó không quá tệ. Cảm ơn câu trả lời cho câu hỏi Flask của tôi btw Rachel! – Raj