python - 在 Python 中不正确地使用全局变量?
问题描述
我的全局变量返回的值不一致。我将不胜感激。
我有一个列表屏幕,可以按用户名、姓氏或名字的顺序排列。通过分页,它会一次列出几个,然后我可以下一页/最后一页或上一页/第一页。如果我从一个标准更改为另一个标准,那么它会将我直接带到列表的第 1 页,否则它会根据需要提供下一个/最后一个/上一个/第一个。为了让页面记住顺序(用户名/名字/姓氏),我将其保存在全局变量 member_filter_criteria 中。
在我的 PC 上,这适用于下面的代码,当我上传到 Heroku 时,member_filter_criteria 值会在页面之间随机变化。您可以在我正在运行的应用程序中见证这一点:首先在https://clubmanager-2020ad.herokuapp.com/auth/login?next=%2Findex以 Janice(密码 'cat')身份登录,然后输入 https://clubmanager-2020ad .herokuapp.com/testmembers。
我怀疑我错误地使用或引用了全局参数,但有人可以告诉我正确的方法。
相关代码:
1)我的 routes.py 文件的顶部,就在导入之后
...
member_filter_criteria = "Surname"
like = '%'
....
2 routes.py 中的 def 是:
@bp.route('/testmembers/', methods=['GET', 'POST'])
@login_required
def testmembers():
# I need to retrieve the value of member_filter_criteria and like from the last call to this def
# This is why I have declared them as global
global member_filter_criteria
global like
def printC(answer):
return "\n{:0.2f}.\n".format(answer)
form = MemberForm()
form.fieldtype.choices = [('--', '--'), ('User Name', 'User Name'), ('Forename', 'Forename'),
('Surname', 'Surname')]
user = Users.query.filter_by(username=current_user.username).first_or_404()
strbal = printC(user.balance / 100)
club = Club.query.filter_by(clubnum=current_user.club).first_or_404()
clubname = club.clubname
todaydate = date.today()
# If a new query we must set the pagination page to 1 at the end of this def
# Otherwise we use the current page number
newquery = 'No'
if form.validate_on_submit():
newquery = 'Yes'
like = form.searchletter.data.upper() + '%'
if form.fieldtype.data == 'User Name':
member_filter_criteria = 'User Name'
users_list = Users.query.filter_by(club=club.clubnum).filter(Users.username.like(like)).order_by(
Users.username.asc())
if form.fieldtype.data == 'Forename':
member_filter_criteria = 'Forename'
users_list = Users.query.filter_by(club=club.clubnum).filter(Users.forename.like(like)).order_by(
Users.forename.asc())
if form.fieldtype.data == 'Surname':
member_filter_criteria = 'Surname'
users_list = Users.query.filter_by(club=club.clubnum).filter(Users.surname.like(like)).order_by(
Users.surname.asc(), Users.forename.asc())
if form.fieldtype.data == '--':
users_list = Users.query.filter_by(club=club.clubnum).filter(Users.forename.like(like)) \
.order_by(Users.surname.asc(), Users.forename.asc())
else:
form.fieldtype.data = member_filter_criteria
if like == '%%':
like = '%'
form.searchletter.data = like
if member_filter_criteria == '':
users_list = Users.query.filter_by(club=club.clubnum).order_by(Users.surname.asc(), Users.forename.asc())
if member_filter_criteria == 'User Name':
users_list = Users.query.filter_by(club=club.clubnum).filter(Users.username.like(like)).order_by(
Users.username.asc())
if member_filter_criteria == 'Forename':
users_list = Users.query.filter_by(club=club.clubnum).filter(Users.forename.like(like)).order_by(
Users.forename.asc())
if member_filter_criteria == 'Surname':
users_list = Users.query.filter_by(club=club.clubnum).filter(Users.surname.like(like)).order_by(
Users.surname.asc(),
Users.forename.asc())
if member_filter_criteria == '--':
users_list = Users.query.filter_by(club=club.clubnum).filter(Users.forename.like(like)) \
.order_by(Users.surname.asc(), Users.forename.asc())
paginator = Paginator(users_list, club.items_per_page)
if newquery == 'Yes':
page = 1
else:
page = request.args.get('page', type=int)
paginatelist = paginator.get_page(page)
return render_template('member.html', title=_('Members'),
club=club, paginator=paginator, paginatelist=paginatelist,
form=form)
3 forms.py中的表单(更改过滤条件是):
class MemberForm(FlaskForm):
searchletter = StringField(_l('Choose One or more letters of name') )
fieldtype = SelectField(_l('Search on: User Name<br>User Forename<br>User Surname'))
submit = SubmitField(_l('Submit'))
4 HTML 屏幕是:
{% extends "base.html" %}
{% import 'bootstrap/wtf.html' as wtf %}
{% block app_content %}
<h1>{{ _('Member details')}} </h1>
{% if current_user.adminuser == 'Yes' or current_user.coach == 'Yes' or
current_user.treasurer == 'Yes' or current_user.sessionmanager == 'Yes' %}
{% if form %}
{{ wtf.quick_form(form) }}
<br>
{% endif %}
{% endif %}
<table class="table table-hover">
<tr>
<th>Username</th>
<th>User Number</th>
<th>Forename</th>
<th>Surname</th>
<th>Member Type</th>
<th>Balance</th>
<th>Current<br>Member</th>
<th>Member<br>Expires</th>
<th>Registered<br>Member</th>
<!-- <th>Administrator</th>
<th>Coach</th>
<th>Activity <br> Manager</th>
<th>Treasurer</th> -->
</tr>
{% for user in paginatelist %}
{% include '_user.html' %}
{% endfor %}
{% include '_paginate.html' %}
</table>
{% include '_paginate.html' %}
{% endblock %}
解决方案
Grismar 为我指出了正确的方向——不要在 Web 应用程序中使用全局变量,因为它们是无状态的,而且不可能知道哪个线程会接收请求。
推荐阅读
- java - Java发送电子邮件,非法分号,不在字符串组中
- php - 如何使用 PHP 创建证书以连接 SOAP 客户端
- mysql - 一种从 MySql 中的表中检索一些数据的方法
- excel - 嵌套 InStr VBA Excel
- python - 排序但只选择一个成员
- python - 循环绘制成字典 Python MATPLOTLIB
- string - ES6 中奇怪的反引号字符串行为
- django - Django ORM 需要帮助加快查询,连接到其他表
- reactjs - 错误:没有可用于依赖类型的模块工厂:CssDependency on build a nextjs app - mini-css-extract-plugin
- .htaccess - 页面的 301 重定向不工作 opencart